1 package com.daffodilwoods.daffodildb.server.serversystem.triggerInfo; 2 3 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.booleanvalueexpression; 4 import com.daffodilwoods.daffodildb.server.sql99.utils._Reference; 5 import com.daffodilwoods.daffodildb.server.serversystem._StatementExecutionContext; 6 import com.daffodilwoods.daffodildb.server.sql99.ddl.descriptors.TriggerDescriptor; 7 import com.daffodilwoods.database.resource.DException; 8 import com.daffodilwoods.daffodildb.server.sql99.common.ColumnDetails; 9 import com.daffodilwoods.daffodildb.server.serversystem._ServerSession; 10 import java.util.ArrayList ; 11 import com.daffodilwoods.daffodildb.server.datasystem.utility.RecordVersion; 12 import com.daffodilwoods.daffodildb.server.sql99.utils._VariableValues; 13 import com.daffodilwoods.daffodildb.server.datadictionarysystem._ColumnCharacteristics; 14 import com.daffodilwoods.daffodildb.server.sql99.common.TableDetails; 15 import com.daffodilwoods.database.general.QualifiedIdentifier; 16 import com.daffodilwoods.daffodildb.server.sql99.common.SetColumnProperties; 17 import com.daffodilwoods.daffodildb.server.sql99.expression.expressionprimary.subquery; 18 import com.daffodilwoods.database.utility.P; 19 import com.daffodilwoods.daffodildb.server.sql99.SQLexecutablestatement; 20 import com.daffodilwoods.daffodildb.server.sql99.dml.SQLdatachangestatement; 21 import com.daffodilwoods.daffodildb.server.sql99._Executer; 22 import com.daffodilwoods.daffodildb.server.sql99.dcl.sqlcontrolstatement.SQLcontrolstatement; 23 import com.daffodilwoods.daffodildb.server.serversystem.triggerInfo._Triggers; 24 import com.daffodilwoods.daffodildb.server.serversystem.TriggerServerSession; 25 26 public class Trigger implements _Triggers{ 27 28 private String oldAlias; 29 30 private String newAlias; 31 32 private booleanvalueexpression bve; 33 34 private _Reference[] ref; 35 36 private _Statement[] statements; 37 38 private String triggerType; 39 40 private _StatementExecutionContext statementExecutionContext; 41 42 private int[] columnsIncluded; 43 44 public Trigger(TriggerDescriptor triggerDescriptor, _StatementExecutionContext statementExecutionContext0,QualifiedIdentifier tableName) throws DException{ 45 oldAlias = triggerDescriptor.getOldAliasName() ; 46 newAlias = triggerDescriptor.getNewAliasName() ; 47 bve = triggerDescriptor.getSearchCondition() ; 48 triggerType = triggerDescriptor.getTriggerType() ; 49 statementExecutionContext = statementExecutionContext0; 50 _ColumnCharacteristics cc = statementExecutionContext.getColumnCharacteristics(tableName); 51 if(triggerDescriptor.triggerColumnsList != null) 52 columnsIncluded = cc.getColumnIndexes( (String []) triggerDescriptor.triggerColumnsList.toArray(new String [0])); 53 54 _ServerSession s_session = statementExecutionContext.getServerSession(); 55 _ServerSession serversession = new TriggerServerSession(tableName.schema,tableName.catalog,s_session); 56 if (bve != null) { 57 TableDetails tableDetails = new TableDetails(); 58 tableDetails.setTableName(new String [] {tableName.catalog,tableName.schema, tableName.name}); 59 ColumnDetails[] columnDetails = bve.getColumnDetails(); 60 checkColumnsValidityAsReference(columnDetails, tableDetails,serversession); 61 bve.checkSemantic(serversession); 62 ArrayList aList = new ArrayList (5); 63 getAllReferencesIncludingSubQuery(aList,bve.getReferences(new TableDetails[] {tableDetails})); 64 int size = aList.size(); 65 ref = size == 0 ? null : 66 (_Reference[]) aList.toArray(new _Reference[size]); 67 setDataTypeAndSizeForReferences(ref, cc); 68 69 } 70 SQLexecutablestatement[] sqlstatements = triggerDescriptor.getStatement(); 71 statements = new Statement[sqlstatements.length ]; 72 for (int j = 0; j < sqlstatements.length; j++) { 73 _Reference[] references = null; 74 _Executer executer = null; 75 if (sqlstatements[j] instanceof SQLdatachangestatement) { 76 references = ( (SQLdatachangestatement) sqlstatements[j]).checkSemantic( 77 serversession); 78 if (references != null) 79 setDataTypeAndSizeForReferences(references, cc); 80 executer = ( (_Executer) ( (SQLdatachangestatement) sqlstatements[j]). 81 run(statementExecutionContext)); 82 } 83 if (sqlstatements[j] instanceof SQLcontrolstatement) { 84 String columns[] =cc.getColumnNames(); 85 ColumnDetails[] cd=( (SQLcontrolstatement) sqlstatements[j]).getColumnDetails(); 86 if(cd != null){ 87 for (int m = 0; m < cd.length; m++) { 88 for (int k = 0; k < columns.length; k++) { 89 String aliasName = cd[m].getNameOfTable(); 90 if (aliasName != null && (aliasName.equalsIgnoreCase(oldAlias) || 91 aliasName.equalsIgnoreCase(newAlias))) { 92 if (cd[m].getColumn().equalsIgnoreCase(columns[k])) { 93 cd[m].setDatatype(cc.getColumnType(k)); 94 cd[m].setSize(cc.getPrecision(k)); 95 } 96 } 97 } 98 } 99 } 100 101 references = ( (SQLcontrolstatement) sqlstatements[j]).checkSemantic(serversession); 102 if (references != null) 103 setDataTypeAndSizeForReferences(references, cc); 104 executer = ( (_Executer) ( (SQLcontrolstatement) sqlstatements[j]).run( 105 statementExecutionContext)); 106 } 107 statements[j] = new Statement(references,executer,sqlstatements[j]); 108 } 109 } 110 private _Reference[] checkColumnsValidityAsReference(ColumnDetails[] columns, TableDetails tableDetails, _ServerSession serverSession) throws DException { 111 ArrayList aList = new ArrayList (5); 112 if (columns != null) { 113 SetColumnProperties.setTableNamesAndDatatypesOfAllColumns(serverSession, columns, new TableDetails[] {tableDetails} 114 , aList, new ArrayList ()); 115 for (int i = 0, length = aList.size(); i < length; i++) 116 ( (ColumnDetails) aList.get(i)).setUnderLyingReference(true); 117 return aList.size() > 0 ? (_Reference[]) aList.toArray(new _Reference[0]) : null; 118 } 119 return null; 120 } 121 122 private void getAllReferencesIncludingSubQuery(ArrayList aList, _Reference[] references) throws DException { 123 if (references == null) 124 return; 125 for (int i = 0; i < references.length; i++) { 126 if (references[i] instanceof subquery) { 127 TableDetails[] td = ( (subquery) references[i])._queryexpression0.getAllTableDetails(); 128 aList.add(references[i]); 129 getAllReferencesIncludingSubQuery(aList, ( (subquery) references[i])._queryexpression0.getReferences(td)); 130 } else 131 aList.add(references[i]); 132 } 133 } 134 135 136 private void setDataTypeAndSizeForReferences(_Reference[] ref, _ColumnCharacteristics cc) throws DException { 137 if (ref != null) { 138 int len = ref.length; 139 String [] clms = cc.getColumnNames(); 140 for (int i = 0; i < len; i++) { 141 String name = null; 142 try { 143 name = ref[i].getColumn(); 144 } catch (Exception E) { 145 continue; 146 } 147 148 if (P.indexOfIgnoreCase(clms, name) != -1) { 149 int type = cc.getColumnType(cc.getColumnIndex(name)); 150 ( (ColumnDetails) ref[i]).setDatatype(type); 151 ( (ColumnDetails) ref[i]).setSize(cc.getSize(cc.getColumnIndex(name))); 152 ( (ColumnDetails) ref[i]).setTriggerFlag(); 153 } else { 154 } 155 } 156 } 157 } 158 159 public _Reference[] getReferences(){ 160 return ref; 161 } 162 163 public _Statement[] getStatements(){ 164 return statements; 165 } 166 167 public String getOldAliasName(){ 168 return oldAlias; 169 } 170 171 public String getNewAliasName(){ 172 return newAlias; 173 } 174 175 public booleanvalueexpression getCondition(){ 176 return bve; 177 } 178 179 public String getTriggerType(){ 180 return triggerType ; 181 } 182 183 public _StatementExecutionContext getStatementExecutionContext(){ 184 return statementExecutionContext ; 185 } 186 187 public boolean isColumnIndeded(int col){ 188 if(columnsIncluded == null) 189 return true; 190 for (int i = 0; i < columnsIncluded.length; i++) { 191 if(col == columnsIncluded[i] ) 192 return true; 193 } 194 return false; 195 } 196 197 198 } 199 | Popular Tags |