1 package com.daffodilwoods.daffodildb.server.datadictionarysystem; 2 3 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator._Iterator; 4 5 import java.util.*; 6 import com.daffodilwoods.database.resource.*; 7 import com.daffodilwoods.database.general.*; 8 import com.daffodilwoods.daffodildb.server.serversystem._ServerSession; 9 import com.daffodilwoods.daffodildb.server.sql99.ddl.descriptors.TriggerDescriptor; 10 import com.daffodilwoods.daffodildb.server.sql99.common.SqlKeywords; 11 import com.daffodilwoods.daffodildb.server.sql99._Executer; 12 import com.daffodilwoods.daffodildb.server.sql99.ddl.descriptors.*; 13 14 import com.daffodilwoods.database.utility.P; 15 import com.daffodilwoods.daffodildb.server.sql99.utils._Reference; 16 import com.daffodilwoods.daffodildb.server.sql99.dql.listenerevents.*; 17 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator._SelectQueryIterator; 18 public class TriggerCharacteristics implements _TriggerCharacteristics { 19 20 private PreparedStatementGetter preparedStatementGetter; 21 QualifiedIdentifier table_name; 22 23 ArrayList list_of_triggers_before_insert; 24 ArrayList list_of_triggers_after_insert; 25 26 ArrayList list_of_triggers_before_delete; 27 ArrayList list_of_triggers_after_delete; 28 29 ArrayList list_of_triggers_before_update; 30 ArrayList list_of_triggers_after_update; 31 32 33 34 private boolean rowLevel; 35 String orientation ; 36 37 TreeMap list_of_column_name_triggers; 38 TreeMap list_of_column_name_afterUpdate_triggers; 39 TreeMap list_of_column_name_beforeUpdate_triggers; 40 String [] columnNames ; 41 boolean isSystemTable; 42 43 public TriggerCharacteristics(QualifiedIdentifier table_Name,PreparedStatementGetter preparedStatementGetter0,boolean rowLevel,String [] columnNames) throws DException { 44 isSystemTable = SystemTables.isSystemTable(table_Name.getIdentifier()); 45 if(! isSystemTable){ 46 this.table_name = table_Name; 47 preparedStatementGetter = preparedStatementGetter0; 48 this.rowLevel = rowLevel; 49 orientation = rowLevel ? SqlKeywords.ROW : SqlKeywords.STATEMENT; 50 this.columnNames = columnNames; 51 } 52 } 53 54 public _Trigger[] getBeforeInsertTriggers() throws DException 55 { 56 if(isSystemTable) 57 return null; 58 if(list_of_triggers_before_insert == null){ 59 Object [] parameters = getParametersForTriggerQuery(SqlKeywords.INSERT, SqlKeywords.BEFORE); 60 list_of_triggers_before_insert = get_corresponding_triggers(getIterator(preparedStatementGetter.getTrigersExecuterWithEventCondition(),parameters)); 61 } 62 return list_of_triggers_before_insert == null || list_of_triggers_before_insert.size() == 0 ? null 63 : (TriggerDescriptor[]) list_of_triggers_before_insert.toArray(new TriggerDescriptor[0]); 64 } 65 66 public _Trigger[] getBeforeUpdateTriggers(int[] columns) throws DException 67 { 68 69 70 if(isSystemTable) 71 return null; 72 ArrayList triggersList = get_update_triggers(columns, SqlKeywords.BEFORE); 73 return triggersList == null || triggersList.size() == 0 ? null 74 : (TriggerDescriptor[]) triggersList.toArray(new TriggerDescriptor[0]); 75 } 76 77 public _Trigger[] getBeforeDeleteTriggers() throws DException 78 { 79 if(isSystemTable) 80 return null; 81 if(list_of_triggers_before_delete == null){ 82 Object [] parameters = getParametersForTriggerQuery(SqlKeywords.DELETE, SqlKeywords.BEFORE); 83 list_of_triggers_before_delete = get_corresponding_triggers(getIterator(preparedStatementGetter.getTrigersExecuterWithEventCondition(),parameters)); 84 } 85 return list_of_triggers_before_delete == null || list_of_triggers_before_delete.size() == 0 ? null 86 : (TriggerDescriptor[]) list_of_triggers_before_delete.toArray(new TriggerDescriptor[0]); 87 } 88 89 public _Trigger[] getAfterInsertTriggers() throws DException 90 { 91 if(isSystemTable) 92 return null; 93 if(list_of_triggers_after_insert == null){ 94 Object [] parameters = getParametersForTriggerQuery(SqlKeywords.INSERT, SqlKeywords.AFTER); 95 list_of_triggers_after_insert = get_corresponding_triggers(getIterator(preparedStatementGetter.getTrigersExecuterWithEventCondition(),parameters)); 96 } 97 return list_of_triggers_after_insert == null || list_of_triggers_after_insert.size() == 0 ? null 98 : (TriggerDescriptor[]) list_of_triggers_after_insert.toArray(new TriggerDescriptor[0]); 99 } 100 101 public _Trigger[] getAfterUpdateTriggers(int[] columns) throws DException 102 { 103 if(isSystemTable) 104 return null; 105 ArrayList triggersList = get_update_triggers(columns, SqlKeywords.AFTER); 106 return triggersList == null || triggersList.size() == 0 ? null 107 : (TriggerDescriptor[]) triggersList.toArray(new TriggerDescriptor[0]); 108 } 109 110 public _Trigger[] getAfterDeleteTriggers() throws DException 111 { 112 if(isSystemTable) 113 return null; 114 if(list_of_triggers_after_delete == null){ 115 Object [] parameters = getParametersForTriggerQuery(SqlKeywords.DELETE, SqlKeywords.AFTER); 116 list_of_triggers_after_delete = get_corresponding_triggers(getIterator(preparedStatementGetter.getTrigersExecuterWithEventCondition(),parameters)); 117 } 118 return list_of_triggers_after_delete == null || list_of_triggers_after_delete.size() == 0 ? null 119 : (TriggerDescriptor[]) list_of_triggers_after_delete.toArray(new TriggerDescriptor[0]); 120 } 121 122 private ArrayList get_corresponding_triggers(_SelectQueryIterator iterator) throws DException { 123 ArrayList list_of_triggers = new ArrayList(5); 124 if(iterator == null) 125 return list_of_triggers; 126 if(! iterator.first()) 127 return list_of_triggers; 128 do{ 129 Object [] values = (Object [])iterator.getObject(); 130 TriggerDescriptor trigger = new TriggerDescriptor(); 131 trigger.load_record_from_Array(preparedStatementGetter, values); 132 list_of_triggers.add(trigger); 133 }while(iterator.next()); 134 return list_of_triggers; 135 } 136 137 private ArrayList get_update_triggers(int[] columns, String timming) throws DException { 138 HashMap triggersToBeChecked = new HashMap(); 139 if(list_of_column_name_triggers == null) 140 intializeUpdateColumnsTriggers(); 141 String [] requiredColumns = columns == null ? columnNames : getColumnNames(columns); 142 for (int i = 0; i < requiredColumns.length; i++) { 143 if(list_of_column_name_triggers.containsKey(requiredColumns[i])){ 144 ArrayList columns_triggers = get_Corresponding_Column_Triggers(requiredColumns[i],timming); 145 for (int j = 0,len2 = columns_triggers.size(); j < len2; j++) { 146 TriggerDescriptor td = (TriggerDescriptor)columns_triggers.get(j); 147 if(!triggersToBeChecked.containsKey(td.trigger_name)) 148 triggersToBeChecked.put(td.trigger_name,td); 149 } 150 } 151 } 152 ArrayList update_triggers_list = new ArrayList(); 153 if( triggersToBeChecked.size() != 0 ){ 154 update_triggers_list.addAll(triggersToBeChecked.values()); 155 } 156 if(timming.equalsIgnoreCase(SqlKeywords.AFTER)){ 157 if(list_of_triggers_after_update != null) 158 update_triggers_list.addAll(list_of_triggers_after_update); 159 } 160 else if(list_of_triggers_before_update != null) 161 update_triggers_list.addAll(list_of_triggers_before_update); 162 return update_triggers_list; 163 } 164 165 private ArrayList get_Corresponding_Column_Triggers(String columnName,String timming) throws DException{ 166 ArrayList columns_triggers = (ArrayList) (timming.equalsIgnoreCase(SqlKeywords.AFTER) 167 ? list_of_column_name_afterUpdate_triggers.get(columnName) 168 : list_of_column_name_beforeUpdate_triggers.get(columnName) ); 169 if(columns_triggers == null){ 170 columns_triggers = new ArrayList(); 171 ArrayList trigger_names_List = (ArrayList)list_of_column_name_triggers.get(columnName); 172 for (int i = 0,len1 = trigger_names_List.size(); i < len1; i++) { 173 Object [] trigger_name = (Object [])trigger_names_List.get(i); 174 Object [] parameters = new Object []{trigger_name[0],trigger_name[1],trigger_name[2],SqlKeywords.UPDATE,orientation,timming}; 175 ArrayList corresponding_triggers = get_corresponding_triggers(getIterator(preparedStatementGetter.getTrigersExecuterWithTriggerNameCondition(),parameters)); 176 if(corresponding_triggers.size() != 0) 177 columns_triggers.addAll(corresponding_triggers); 178 } 179 if(timming.equalsIgnoreCase(SqlKeywords.AFTER)) 180 list_of_column_name_afterUpdate_triggers.put(columnName,columns_triggers); 181 else 182 list_of_column_name_beforeUpdate_triggers.put(columnName,columns_triggers); 183 184 } 185 return columns_triggers; 186 } 187 188 private void intializeUpdateColumnsTriggers()throws DException{ 189 list_of_column_name_triggers = new TreeMap(String.CASE_INSENSITIVE_ORDER); 190 _SelectQueryIterator column_usage_triggers = getIterator(preparedStatementGetter.getTriggeredUpdatedExecuterForAllColumns(), 191 new Object []{table_name.catalog,table_name.schema,table_name.name}); 192 ArrayList triggerParamters = new ArrayList(); 193 if( column_usage_triggers.first()){ 194 list_of_column_name_afterUpdate_triggers = new TreeMap(String.CASE_INSENSITIVE_ORDER); 195 list_of_column_name_beforeUpdate_triggers = new TreeMap(String.CASE_INSENSITIVE_ORDER); 196 Object [] record = null; 197 do { 198 record= (Object [])column_usage_triggers.getObject(); 199 String triggerName = (String )record[SystemTablesFields.triggerUpdateColumn_trigger_name]; 200 Object [] parameters = new Object []{ record[SystemTablesFields.triggerUpdateColumn_trigger_catalog],record[SystemTablesFields.triggerUpdateColumn_trigger_schema], 201 triggerName}; 202 203 String columnName = (String )record[SystemTablesFields.triggerUpdateColumn_event_object_column]; 204 add_column_name_triggers(columnName, parameters); 205 triggerParamters.add(parameters); 206 }while(column_usage_triggers.next()); 207 208 } 209 else 210 triggerParamters.add(new Object []{null,null,null}); 211 Object [][] inParameters = new Object [triggerParamters.size()][]; 212 triggerParamters.toArray(inParameters); 213 get_Update_Triggers_From_Triggers(inParameters,SqlKeywords.BEFORE); 214 get_Update_Triggers_From_Triggers(inParameters,SqlKeywords.AFTER); 215 } 216 217 public ArrayList get_Update_Triggers_From_Triggers(Object parameters,String timing) throws DException { 218 if(timing.equalsIgnoreCase(SqlKeywords.BEFORE)){ 219 if(list_of_triggers_before_update != null) 220 return list_of_triggers_before_update; 221 } 222 else{ 223 if(list_of_triggers_after_update != null) 224 return list_of_triggers_after_update; 225 } 226 _SelectQueryIterator tableRetriever = getIterator(preparedStatementGetter.getTriggerExecuterForUpdateType(),new Object []{table_name.catalog,table_name.schema,table_name.name,orientation,timing,table_name.catalog,table_name.schema,table_name.name}); 227 ArrayList triggersList = get_corresponding_triggers(tableRetriever); 228 if(timing.equalsIgnoreCase(SqlKeywords.BEFORE)) 229 list_of_triggers_before_update = triggersList; 230 else 231 list_of_triggers_after_update = triggersList; 232 return triggersList; 233 } 234 235 private void add_column_name_triggers(Object column_name, Object triggers) throws DException{ 236 ArrayList list = (ArrayList) list_of_column_name_triggers.get(column_name); 237 if(list == null) { 238 list = new ArrayList(); 239 list_of_column_name_triggers.put(column_name, list); 240 } 241 list.add(triggers); 242 } 243 244 private Object [] getParametersForTriggerQuery(String event, String timing) throws DException { 245 return new Object []{table_name.catalog,table_name.schema,table_name.name,event,orientation,timing}; 246 } 247 248 private String [] getColumnNames(int[] columnIndexes) throws DException { 249 String [] columns = null; 250 try { 251 int len = columnIndexes.length; 252 columns = new String [len]; 253 for(int i = 0;i< columnIndexes.length;i++) 254 columns[i] = columnNames[columnIndexes[i]]; 255 } 256 catch (Exception ex) { 257 } 258 return columns; 259 } 260 261 public void addTrigger(_Trigger trigger) throws DException { 262 TriggerDescriptor triggerDescriptor = (TriggerDescriptor)trigger; 263 String eventManipulation = triggerDescriptor.event_manipulation; 264 String timming = triggerDescriptor.condition_timing; 265 if(eventManipulation.equalsIgnoreCase(SqlKeywords.INSERT)){ 266 if(timming.equalsIgnoreCase(SqlKeywords.AFTER)){ 267 if(list_of_triggers_after_insert != null){ 268 if(!list_of_triggers_after_insert.contains(trigger)) 269 list_of_triggers_after_insert.add(trigger); 270 } 271 } 272 else if(list_of_triggers_before_insert != null){ 273 if(!list_of_triggers_before_insert.contains(trigger)) 274 list_of_triggers_before_insert.add(trigger); 275 } 276 } 277 else if(eventManipulation.equalsIgnoreCase(SqlKeywords.DELETE)){ 278 if(timming.equalsIgnoreCase(SqlKeywords.AFTER)){ 279 if(list_of_triggers_after_delete != null) 280 if(!list_of_triggers_after_delete.contains(trigger)) 281 list_of_triggers_after_delete.add(trigger); 282 } 283 else if(list_of_triggers_before_delete != null) 284 if(!list_of_triggers_before_delete.contains(trigger)) 285 list_of_triggers_before_delete.add(trigger); 286 } 287 else{ 288 ArrayList triggerColumnsList = triggerDescriptor.triggerColumnsList; 289 if(triggerColumnsList == null || triggerColumnsList.size() == 0){ 290 if(timming.equalsIgnoreCase(SqlKeywords.AFTER)){ 291 if(list_of_triggers_after_update != null) 292 if(!list_of_triggers_after_update.contains(trigger)) 293 list_of_triggers_after_update.add(trigger); 294 } 295 else if(list_of_triggers_before_update != null) 296 if(!list_of_triggers_before_update.contains(trigger)) 297 list_of_triggers_before_update.add(trigger); 298 } 299 else{ 300 301 addUpateColumnsTriggers(triggerDescriptor); 302 } 303 } 304 305 } 306 307 308 private void addUpateColumnsTriggers(TriggerDescriptor triggerDescriptor)throws DException{ 309 if(list_of_column_name_triggers == null) 310 return; 311 ArrayList triggerColumnsList = triggerDescriptor.triggerColumnsList; 312 String timming = triggerDescriptor.condition_timing; 313 int size = triggerColumnsList.size(); 314 for(int i =0;i<size;i++){ 315 String triggerColumn = (String )triggerColumnsList.get(i); 316 ArrayList triggersNamesList = null; 317 ArrayList triggersList = null; 318 Object [] triggerName = new Object []{triggerDescriptor.trigger_catalog,triggerDescriptor.trigger_schema,triggerDescriptor.trigger_name}; 319 if(list_of_column_name_triggers.containsKey(triggerColumn)){ 320 triggersNamesList = (ArrayList)list_of_column_name_triggers.get(triggerColumn); 321 if(timming.equalsIgnoreCase(SqlKeywords.BEFORE)) 322 triggersList = (ArrayList)list_of_column_name_beforeUpdate_triggers.get(triggerColumn); 323 else 324 triggersList = (ArrayList)list_of_column_name_afterUpdate_triggers.get(triggerColumn); 325 } 326 else{ 327 triggersList = new ArrayList(5); 328 triggersNamesList = new ArrayList(5); 329 list_of_column_name_triggers.put(triggerColumn,triggersNamesList); 330 if(timming.equalsIgnoreCase(SqlKeywords.BEFORE)){ 331 if(list_of_column_name_beforeUpdate_triggers == null){ 332 list_of_column_name_beforeUpdate_triggers = new TreeMap(String.CASE_INSENSITIVE_ORDER); 333 list_of_column_name_afterUpdate_triggers = new TreeMap(String.CASE_INSENSITIVE_ORDER); 334 } 335 else 336 list_of_column_name_beforeUpdate_triggers.put(triggerColumn,triggersList); 337 } 338 else{ 339 if(list_of_column_name_afterUpdate_triggers == null){ 340 list_of_column_name_beforeUpdate_triggers = new TreeMap(String.CASE_INSENSITIVE_ORDER); 341 list_of_column_name_afterUpdate_triggers = new TreeMap(String.CASE_INSENSITIVE_ORDER); 342 } 343 else 344 list_of_column_name_afterUpdate_triggers.put(triggerColumn,triggersList); 345 } 346 } 347 if(!triggersList.contains(triggerDescriptor)){ 348 triggersNamesList.add(triggerName); 349 triggersList.add(triggerDescriptor); 350 } 351 } 352 } 353 354 public void removeTrigger(_Trigger trigger) throws DException { 355 TriggerDescriptor triggerDescriptor = (TriggerDescriptor)trigger; 356 String eventManipulation = triggerDescriptor.event_manipulation; 357 String timming = triggerDescriptor.condition_timing; 358 if(eventManipulation.equalsIgnoreCase(SqlKeywords.INSERT)){ 359 if(timming.equalsIgnoreCase(SqlKeywords.AFTER)){ 360 if(list_of_triggers_after_insert != null) 361 list_of_triggers_after_insert.remove(trigger); 362 } 363 else if(list_of_triggers_before_insert != null) 364 list_of_triggers_before_insert.remove(trigger); 365 } 366 else if(eventManipulation.equalsIgnoreCase(SqlKeywords.DELETE)){ 367 if(timming.equalsIgnoreCase(SqlKeywords.AFTER)){ 368 if(list_of_triggers_after_delete != null) 369 list_of_triggers_after_delete.remove(trigger); 370 } 371 else if(list_of_triggers_before_delete != null) 372 list_of_triggers_before_delete.remove(trigger); 373 } 374 else{ 375 ArrayList triggerColumnsList = triggerDescriptor.triggerColumnsList; 376 if(triggerColumnsList == null || triggerColumnsList.size() == 0){ 377 if(timming.equalsIgnoreCase(SqlKeywords.AFTER)){ 378 if(list_of_triggers_after_update != null) 379 list_of_triggers_after_update.remove(trigger); 380 } 381 else if(list_of_triggers_before_update != null) 382 list_of_triggers_before_update.remove(trigger); 383 } 384 else{ 385 386 removeUpateColumnsTriggers(triggerDescriptor); 387 } 388 389 } 390 } 391 392 private void removeUpateColumnsTriggers(TriggerDescriptor triggerDescriptor)throws DException{ 393 if(list_of_column_name_triggers == null) 394 return; 395 ArrayList triggerColumnsList = triggerDescriptor.triggerColumnsList; 396 String timming = triggerDescriptor.condition_timing; 397 int size = triggerColumnsList.size(); 398 for(int i =0;i<size;i++){ 399 String triggerColumn = (String )triggerColumnsList.get(i); 400 ArrayList triggersList = null; 401 String [] triggerName = new String []{triggerDescriptor.trigger_catalog,triggerDescriptor.trigger_schema,triggerDescriptor.trigger_name}; 402 if(list_of_column_name_triggers.containsKey(triggerColumn)){ 403 ArrayList triggersNamesList = (ArrayList)list_of_column_name_triggers.get(triggerColumn); 404 int noOfTriggers = triggersNamesList.size(); 405 for(int j =0;j< noOfTriggers;j++){ 406 Object [] currentTriggerName = (Object [])triggersNamesList.get(j); 407 if(triggerName[0].equalsIgnoreCase((String )currentTriggerName[0]) && 408 triggerName[1].equalsIgnoreCase((String )currentTriggerName[1]) && 409 triggerName[2].equalsIgnoreCase((String )currentTriggerName[2]) ) 410 { 411 triggersNamesList.remove(j) ; 412 break; 413 } 414 } 415 if(timming.equalsIgnoreCase(SqlKeywords.BEFORE)) 416 triggersList = (ArrayList)list_of_column_name_beforeUpdate_triggers.get(triggerColumn); 417 else 418 triggersList = (ArrayList)list_of_column_name_afterUpdate_triggers.get(triggerColumn); 419 } 420 triggersList.remove(triggerDescriptor); 421 } 422 } 423 424 425 private void initializeUpdateTriggers()throws DException{ 426 _Iterator column_usage_retriever = getIterator(preparedStatementGetter.getTriggeredUpdatedExecuterForAllColumns(), new Object []{table_name.catalog,table_name.schema,table_name.name}); 427 } 428 429 430 private _SelectQueryIterator getIterator(_Executer executer,Object [] parameters) throws DException{ 431 return (_SelectQueryIterator) executer.executeForFresh( parameters); 432 } 433 } 434 | Popular Tags |