1 package com.daffodilwoods.daffodildb.server.serversystem.dmlvalidation.triggersystem; 2 3 import java.util.*; 4 5 import com.daffodilwoods.daffodildb.server.datadictionarysystem.*; 6 import com.daffodilwoods.daffodildb.server.datasystem.utility.*; 7 import com.daffodilwoods.daffodildb.server.serversystem.*; 8 import com.daffodilwoods.daffodildb.server.serversystem.triggerInfo.*; 9 import com.daffodilwoods.daffodildb.server.sql99.*; 10 import com.daffodilwoods.daffodildb.server.sql99.common.*; 11 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator.*; 12 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.*; 13 import com.daffodilwoods.daffodildb.server.sql99.expression.expressionprimary.*; 14 import com.daffodilwoods.daffodildb.server.sql99.utils.*; 15 import com.daffodilwoods.database.general.*; 16 import com.daffodilwoods.database.resource.*; 17 import com.daffodilwoods.database.utility.*; 18 import com.daffodilwoods.daffodildb.server.sessionsystem._UserSessionTable; 19 import com.daffodilwoods.daffodildb.server.sessionsystem.sessioncondition.SessionConditionReferences; 20 21 28 29 35 public class TriggerTable implements _TriggerTable { 36 37 private _TriggerCharacteristics triggerCharactersitics; 38 private QualifiedIdentifier tableName; 39 TableDetails tableDetails; 40 41 47 public TriggerTable(_TriggerCharacteristics tCharactersitics, QualifiedIdentifier tName) throws DException { 48 triggerCharactersitics = tCharactersitics; 49 tableName = tName; 50 tableDetails = new TableDetails(); 51 tableDetails.setTableName(new String [] {tableName.catalog, tableName.schema, tableName.name}); 52 } 53 54 60 61 public void FireAfterInsertRowLevelTriggers(_StatementExecutionContext statementExecutionContext) throws DException { 62 FireTrigger(statementExecutionContext.getServerSession().getAfterInsertTrigger(tableName,triggerCharactersitics ,statementExecutionContext.getChildStatementExecutionContext() ) , statementExecutionContext,false); 63 } 64 65 73 74 public void FireAfterUpdateRowLevelTriggers(int[] columns, _StatementExecutionContext statementExecutionContext) throws DException { 75 FireTrigger(statementExecutionContext.getServerSession().getAfterUpdateTrigger(tableName,triggerCharactersitics,statementExecutionContext.getChildStatementExecutionContext() ,columns ), statementExecutionContext,false); 76 } 77 78 85 86 public void FireAfterDeleteRowLevelTriggers(_StatementExecutionContext statementExecutionContext) throws DException { 87 FireTrigger(statementExecutionContext.getServerSession().getAfterDeleteTrigger( tableName,triggerCharactersitics ,statementExecutionContext.getChildStatementExecutionContext() ), statementExecutionContext,false); 88 } 89 90 97 98 public void FireBeforeInsertRowLevelTriggers(_StatementExecutionContext statementExecutionContext) throws DException { 99 FireTrigger(statementExecutionContext.getServerSession().getBeforeInsertTrigger(tableName,triggerCharactersitics ,statementExecutionContext.getChildStatementExecutionContext() ), statementExecutionContext,true); 100 101 } 102 103 111 112 public void FireBeforeUpdateRowLevelTriggers(int[] columns, _StatementExecutionContext statementExecutionContext) throws DException { 113 FireTrigger(statementExecutionContext.getServerSession().getBeforeUpdateTrigger(tableName,triggerCharactersitics ,statementExecutionContext.getChildStatementExecutionContext() ,columns), statementExecutionContext,true); 114 } 115 116 123 124 public void FireBeforeDeleteRowLevelTriggers(_StatementExecutionContext statementExecutionContext) throws DException { 125 FireTrigger(statementExecutionContext.getServerSession().getBeforeDeleteTrigger(tableName,triggerCharactersitics ,statementExecutionContext.getChildStatementExecutionContext() ), statementExecutionContext,false); 126 } 127 128 138 139 private void FireTrigger(_Triggers[] triggers, _StatementExecutionContext statementExecutionContext,boolean isBefore) throws DException { 140 if ( ( (StatementExecutionContext) statementExecutionContext).getTriggerCount() > 30){ 141 throw new DException("DSE5582", null); 142 } 143 144 if (triggers == null) 145 return; 146 147 RecordVersion recordVersion = statementExecutionContext.getRecordVersion(); 148 _VariableValues tvv = null; 149 int triggerDesLength = triggers.length; 150 ArrayList referenceList1 = new ArrayList(); 151 ArrayList valuelist1 = new ArrayList(); 152 ArrayList afterExecuteRefList = new ArrayList(); 153 for (int i = 0; i < triggerDesLength; i++) { 154 String newAlias = triggers[i].getNewAliasName(); 155 String oldAlias = triggers[i].getOldAliasName(); 156 tvv = new TriggerVariableValues(recordVersion, newAlias, oldAlias, statementExecutionContext.getServerSession()); 157 booleanvalueexpression bve = triggers[i].getCondition() ; 158 if (bve != null) { 159 tvv = initializeVariableValues(triggers[i].getReferences() , statementExecutionContext.getServerSession(), recordVersion, newAlias, oldAlias); 160 if (bve.run(tvv).hashCode() != 0) { 161 continue; 162 } 163 } 164 _Statement[] statements = triggers[i].getStatements() ; 165 _VariableValues vv = null; 166 _StatementExecutionContext sec = triggers[i].getStatementExecutionContext() ; 167 168 for (int j = 0; j < statements.length; j++) { 169 ( (StatementExecutionContext) statementExecutionContext).addTriggerCount(); 170 try { 171 _Executer executer = null; 172 sec.setUserRight(false); 173 sec.setRecordVersion(statementExecutionContext.getRecordVersion()); 174 sec.setAutoCommit(false); 175 _Reference[] references = statements[j].getReferences(); 176 executer = statements[j].getExecuter() ; 177 vv = new VariableValues(references, sec.getServerSession()); 178 if (references != null) { 179 Object [] values = getValues(references, recordVersion, oldAlias, newAlias); 180 if (isBefore) { 181 referenceList1.addAll(Arrays.asList(references)); 182 valuelist1.addAll(Arrays.asList(values)); 183 } 184 185 vv.setConditionVariableValue(references, values, 1); 186 } 187 sec.setVariableValues(vv); 188 executer.execute(vv); 189 if(isBefore) 190 afterExecuteRefList.add(vv.getReferenceAndValuePair()); 191 } catch (DException dde) { 192 193 if(dde.getDseCode().equalsIgnoreCase("DSE8139")) 194 throw new DException("DSE8139", new Object []{dde}); 195 if (dde.getDseCode().equalsIgnoreCase("DSE5582")){ 196 throw new DException("DSE5582", null);} 197 if (dde.getDseCode().equalsIgnoreCase("DSE5583")) 198 throw new DException("DSE5583", null); 199 throw new TriggerException("DSE1274", new Object [] {tableName.getName(), triggers[i].getTriggerType(),dde.getMessage()}); 200 201 } 202 finally { 203 ( (StatementExecutionContext) statementExecutionContext).subTriggerCount(); 204 } 205 } 206 } 207 if (isBefore) { 208 ArrayList referenceList = new ArrayList(); 209 ArrayList valuelist = new ArrayList(); 210 211 for (int i = 0; i < referenceList1.size(); i++) { 212 _Reference reference = (_Reference )referenceList1.get(i); 213 Object val = valuelist1.get(i); 214 for(int j = 0; j < afterExecuteRefList.size(); j++){ 215 Object [][] afterExecuteRef = (Object [][] )afterExecuteRefList.get(j); 216 for (int k = 0; k < afterExecuteRef.length; k++) { 217 if (reference == afterExecuteRef[k][0]) { 218 if (!val.equals( afterExecuteRef[k][1])) { 219 referenceList.add(reference); 220 valuelist.add( afterExecuteRef[k][1]); 221 } 222 } 223 } 224 } 225 } 226 if(referenceList.size() > 0){ 227 int length = referenceList.size(); 228 int[] colIndex = new int[length]; 229 Object [] values = valuelist.toArray(); 230 _ColumnCharacteristics cc = statementExecutionContext.getColumnCharacteristics(tableName); 231 for(int j= 0 ;j <referenceList.size();j++ ){ 232 colIndex[j] = cc.getColumnIndex( ( (_Reference) referenceList.get(j)). 233 getColumn()); 234 } 235 _Iterator iterator = statementExecutionContext.getServerSession().getIndexTable(tableName). 236 getDefaultIterator(); 237 boolean iter = iterator.seek(recordVersion.getCurrentRecord(). 238 getObject(SystemFields.rowId)); 239 Object invalidSessionId = iterator.getColumnValues(SessionConditionReferences.invalidSessionIdReference_4) ; 240 while(!invalidSessionId.equals(SystemFields.maxIntegerValue)){ 241 iterator.next(); 242 invalidSessionId = iterator.getColumnValues(SessionConditionReferences.invalidSessionIdReference_4) ; 243 } 244 _UserSessionTable userSessiontable = statementExecutionContext. 245 getUserSession().getUserSessionTable(tableName); 246 userSessiontable.update(iterator, colIndex, values); 247 } 248 } 249 250 251 252 } 253 254 255 public Object [] getValues(_Reference[] references, RecordVersion recordVersion, String oldAlias, String newAlias) throws DException { 256 Object [] values = new Object [references.length]; 257 for (int k = 0; k < references.length; k++) { 258 String column = references[k].getColumn(); 259 String tableName = null; 260 try { 261 tableName = references[k].getTriggerTableAlias(); 262 } catch (DException de) { 263 throw new TriggerException("DSE1303", new Object [] {column, tableDetails.getQualifiedTableName()}); 264 } 265 if (tableName == null || tableName.equalsIgnoreCase("new") || tableName.equalsIgnoreCase(newAlias)) { 266 values[k] = recordVersion.getCurrentRecord().getObject(column); 267 } 268 if (tableName.equalsIgnoreCase("old") || tableName.equalsIgnoreCase(oldAlias)) { 269 values[k] = recordVersion.getPreviousRecord().getObject(column); 270 } 271 } 272 return values; 273 } 274 275 276 private void setDataTypeAndSizeForReferences(_Reference[] ref, _ColumnCharacteristics cc) throws DException { 277 if (ref != null) { 278 int len = ref.length; 279 String [] clms = cc.getColumnNames(); 280 for (int i = 0; i < len; i++) { 281 String name = null; 282 try { 283 name = ref[i].getColumn(); 284 } catch (Exception E) { 285 continue; 286 } 287 if (P.indexOfIgnoreCase(clms, name) != -1) { 288 int type = cc.getColumnType(cc.getColumnIndex(name)); 289 ( (ColumnDetails) ref[i]).setDatatype(type); 290 ( (ColumnDetails) ref[i]).setSize(cc.getSize(cc.getColumnIndex(name))); 291 } else { 292 } 293 } 294 } 295 } 296 297 private Object [][] getSubQueryIteratorMapping(_Reference[] references, _ServerSession object) throws DException { 298 int length = references.length; 299 ArrayList aList = new ArrayList(length); 300 for (int i = 0; i < length; i++) { 301 if (references[i].getReferenceType() == com.daffodilwoods.daffodildb.server.sql99.common.SimpleConstants.SUBQUERY) { 302 _Iterator iterator = ( (com.daffodilwoods.daffodildb.server.sql99.expression.expressionprimary.subquery) references[i]).getSelectIterator(object); 303 aList.add(new Object [] {references[i], iterator}); } 305 } 306 return (Object [][]) aList.toArray(new Object [0][]); 307 } 308 309 private _VariableValues initializeVariableValues(_Reference[] references, _ServerSession serverSession, RecordVersion recVersion, String newAlias, String oldAlias) throws DException { 310 if (references != null && checkForSubQuery(references)) { 311 Object [][] subQueryIteratorMapping = getSubQueryIteratorMapping(references, serverSession); 312 _Reference[] ref1 = getSimpleReferences(references); 313 _VariableValues vv = new SubQueryVariableValues(ref1, subQueryIteratorMapping, serverSession); 314 if (ref1 != null) { 315 vv.setConditionVariableValue(ref1, getValues(ref1, recVersion, oldAlias, newAlias), 0); 316 } 317 return vv; 318 } 319 return new TriggerVariableValues(recVersion, oldAlias, newAlias, serverSession); 320 } 321 322 private boolean checkForSubQuery(_Reference[] references) throws DException { 323 if (references != null) { 324 int length = references.length; 325 for (int i = 0; i < length; i++) 326 if (references[i].getReferenceType() == com.daffodilwoods.daffodildb.server.sql99.common.SimpleConstants.SUBQUERY) 327 return true; 328 } 329 return false; 330 } 331 332 private _Reference[] getSimpleReferences(_Reference[] references) throws DException { 333 int length = references.length; 334 ArrayList aList = new ArrayList(length); 335 for (int i = 0; i < length; i++) { 336 if (references[i].getReferenceType() != com.daffodilwoods.daffodildb.server.sql99.common.SimpleConstants.SUBQUERY) { 337 aList.add(references[i]); } 339 } 340 return aList.size() == 0 ? null : (_Reference[]) aList.toArray(new _Reference[0]); 341 } 342 343 private void getAllReferencesIncludingSubQuery(ArrayList aList, _Reference[] references) throws DException { 344 if (references == null) 345 return; 346 for (int i = 0; i < references.length; i++) { 347 if (references[i] instanceof subquery) { 348 TableDetails[] td = ( (subquery) references[i])._queryexpression0.getAllTableDetails(); 349 aList.add(references[i]); 350 getAllReferencesIncludingSubQuery(aList, ( (subquery) references[i])._queryexpression0.getReferences(td)); 351 } else 352 aList.add(references[i]); 353 } 354 } 355 356 357 public _Reference[] checkColumnsValidityAsReference(ColumnDetails[] columns, TableDetails tableDetails, _ServerSession serverSession) throws DException { 358 ArrayList aList = new ArrayList(5); 359 if (columns != null) { 360 SetColumnProperties.setTableNamesAndDatatypesOfAllColumns(serverSession, columns, new TableDetails[] {tableDetails} 361 , aList, new ArrayList()); 362 for (int i = 0, length = aList.size(); i < length; i++) 363 ( (ColumnDetails) aList.get(i)).setUnderLyingReference(true); 364 return aList.size() > 0 ? (_Reference[]) aList.toArray(new _Reference[0]) : null; 365 } 366 return null; 367 } 368 369 449 450 } 451 | Popular Tags |