1 package com.daffodilwoods.daffodildb.server.sql99.dml; 2 3 import java.text.*; 4 import java.util.*; 5 6 import com.daffodilwoods.daffodildb.server.datadictionarysystem.*; 7 import com.daffodilwoods.daffodildb.server.datasystem.utility._Record; 8 import com.daffodilwoods.daffodildb.server.serversystem.*; 9 import com.daffodilwoods.daffodildb.server.serversystem.datatriggersystem.*; 10 import com.daffodilwoods.daffodildb.server.serversystem.dmlvalidation.statementtriggersystem.*; 11 import com.daffodilwoods.daffodildb.server.sessionsystem.*; 12 import com.daffodilwoods.daffodildb.server.sql99.*; 13 import com.daffodilwoods.daffodildb.server.sql99.common.*; 14 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator.*; 15 import com.daffodilwoods.daffodildb.server.sql99.expression.*; 16 import com.daffodilwoods.daffodildb.server.sql99.utils.*; 17 import com.daffodilwoods.daffodildb.utils.*; 18 import com.daffodilwoods.daffodildb.utils.comparator.*; 19 import com.daffodilwoods.daffodildb.utils.field.*; 20 import com.daffodilwoods.database.general.*; 21 import com.daffodilwoods.database.resource.*; 22 import com.daffodilwoods.daffodildb.server.datasystem.interfaces.*; 23 import com.daffodilwoods.database.utility.P; 24 import com.daffodilwoods.daffodildb.server.sql99.expression.expressionprimary.*; 25 import com.daffodilwoods.daffodildb.server.sql99.dql.listenerevents.*; 26 27 public class UpdateExecuter implements _Executer { 28 _StatementExecutionContext sec; 29 TableDetails tableDetails; 30 _Iterator iterator; 31 Object [][] setClauseArray; 32 Object referencesIteratorMapping; 33 _Reference[] knownReferences, questionMarks; 34 _DataTriggerTable dataTriggerTable; 35 _StatementTriggerTable statementTriggerTable; 36 int[] columnsType, columnIndexes, size, scale; 37 Collator collator; 38 _ServerSession serverSession; 39 _UserSession childUserSession; 40 boolean forFisrtTime; 41 long time; 42 private Object [] previousParameters; 43 private FieldBase[] previousFieldBase; 44 private _DropTableInfo[] dropTableInfo; 45 private QualifiedIdentifier tableName; 46 public UpdateExecuter(_StatementExecutionContext ssec, TableDetails td, _Iterator itera, Object [][] setClauseArra, long initialTime, Object referencesIterMapping, _Reference[] knownReferences, _Reference[] questions, ArrayList listOfTables0, QualifiedIdentifier tableName0) throws DException { 47 sec = ssec; 48 tableDetails = td; 49 iterator = itera; 50 setClauseArray = setClauseArra; 51 serverSession = sec.getServerSession(); 52 performInitialisations(); 53 time = initialTime; 54 this.knownReferences = knownReferences; 55 questionMarks = questions; 56 referencesIteratorMapping = referencesIterMapping; 57 ArrayList listOfTables = listOfTables0; 58 ArrayList dropTablesList = new ArrayList(); 59 QualifiedIdentifier table; 60 for (int i = 0; i < listOfTables.size(); i++) { 61 String [] tableName = (String []) listOfTables.get(i); 62 if (tableName.length < 3) { 63 if (tableName.length == 1) 64 table = new QualifiedIdentifier(serverSession.getCurrentCatalog(), serverSession.getCurrentSchema(), tableName[0]); 65 else 66 table = new QualifiedIdentifier(serverSession.getCurrentCatalog(), tableName[0], tableName[1]); 67 } else 68 table = new QualifiedIdentifier(tableName[0], tableName[1], tableName[2]); 69 if (serverSession.getColumnCharacteristics(table).getTableType() == TypeConstants.TABLE) 70 dropTablesList.add( ( (_MergeTable) serverSession.getIndexTable(table)).getDropTableInfo()); 71 } 72 table = tableDetails.getQualifiedIdentifier(); 73 dropTablesList.add( ( (_MergeTable) serverSession.getIndexTable(table)).getDropTableInfo()); 74 dropTableInfo = (_DropTableInfo[]) dropTablesList.toArray(new _DropTableInfo[0]); 75 tableName = tableName0; 76 } 77 78 public Object execute(_VariableValues vv) throws DException { 79 checkForDroppedTable(); 80 iterator.releaseResource(); 81 return executeV(vv); 82 } 83 84 private Object executeV(_VariableValues vv) throws DException { 85 childUserSession = sec.getServerSession().getUserSession(); 86 long t = System.currentTimeMillis(); 87 Object obj = null; 88 boolean flagToAvoidDeadLocking = false; 89 while (true) { 90 try { 91 if (t - time >= ( (_ServerSession) sec.getServerSession()).queryTimeOut && ( (_ServerSession) sec.getServerSession()).queryTimeOut != 0) { 92 return null; 93 } 94 obj = performExecution(vv); 95 return obj; 96 } catch (DException ex) { 97 if (ex.getDseCode().equalsIgnoreCase("DSE5582")) { 98 throw new DException("DSE5582", null); 99 } 100 if (ex.getDseCode().equalsIgnoreCase("DSE5583")) 101 throw new DException("DSE5583", null); 102 if ( (ex.getDseCode().equalsIgnoreCase("DSE879") || ex.getDseCode().equalsIgnoreCase("DSE2004")) && sec.getServerSession().getIsolationLevel() == Session.ReadCommitted) { 103 if (ex.getDseCode().equalsIgnoreCase("DSE2004")) { 104 ; } 106 synchronized (serverSession.getUserSession().getSession().getSessionDatabase()) { 107 if(serverSession.getIsolationLevel() == Session.ReadTransactionSerializable ){ 108 ; if (flagToAvoidDeadLocking){ 110 ; throw new DException("DSE2058", null); 112 } 113 flagToAvoidDeadLocking = true; 114 } 115 116 try{ 117 serverSession.getUserSession().getSession().getSessionDatabase(). 118 wait(); 119 }catch(Exception e){ 120 121 } 122 } 123 } else { 124 throw new DmlStatementException("DSE1276", new Object [] {tableDetails.getQualifiedTableName()} 125 , ex); 126 } 127 } 128 } 129 } 130 131 public Object execute(Object [] obj) throws com.daffodilwoods.database.resource.DException { 132 checkForDroppedTable(); 133 if (obj == null) { 134 if (questionMarks != null) { 135 throw new DException("DSE1273", null); 136 } 137 return execute( (_VariableValues)null); 138 } 139 _VariableValues vv = new VariableValues(questionMarks, sec.getServerSession()); 140 if (obj.length != questionMarks.length) { 141 throw new DmlStatementException("DSE1276", new Object [] {tableDetails.getQualifiedTableName()} 142 , new DException("DSE1252", new Object [] {new Integer (obj.length), new Integer (questionMarks.length)})); 143 } 144 iterator.releaseResource(); 145 previousFieldBase = FieldUtility.getFields(obj); 146 vv.setConditionVariableValue(questionMarks, previousFieldBase, 1); 147 return executeV(vv); 148 } 149 150 public Object executeForFresh(Object [] parm1) throws com.daffodilwoods.database.resource.DException { 151 return execute(parm1); 152 } 153 154 private int[] getIntColumns() throws DException { 155 _ColumnCharacteristics cc = tableDetails.getColumnCharacteristics(); 156 int length = setClauseArray.length; 157 int[] columns = new int[length]; 158 int columnIndex=0; 159 for (int i = 0; i < length; i++) { 160 try { 161 if(setClauseArray[i][0] instanceof _Reference){ 162 columns[columnIndex] = ( (_Reference) setClauseArray[i][0]).getIndex(); 163 columnIndex++; 164 } 165 else{ 166 Object [] obj = (Object []) setClauseArray[i][0]; 167 int[] temp = new int[obj.length + length-1]; 168 System.arraycopy(columns,0,temp,0, columns.length); 169 columns = temp; 170 for (int j = 0; j < obj.length; j++, columnIndex++) { 171 columns[columnIndex] = ( (_Reference) obj[j]).getIndex(); 172 } 173 } 174 } catch (DException e) { 175 int tt = cc.getColumnIndex( ( (_Reference) setClauseArray[i][0]).getColumn()); 176 ( (_Reference) setClauseArray[i][0]).setIndex(tt); 177 columns[columnIndex] = tt; 178 } 179 } 180 return columns; 181 } 182 183 private Object performExecution(_VariableValues vv) throws DException { 184 int count = 0; 185 childUserSession.startSavePoint(); 186 _VariableValues initialisedVV = initialiseVariableValues(vv); 187 TriggerExecutionContext tec = new TriggerExecutionContext(); 188 sec.setUserRight(false); 189 sec.setUserSession(childUserSession); 190 sec.setTriggerExecutionContext(tec); 191 TreeSet rowIdList = new TreeSet(new CKbwbDpnqbsbups()); 192 statementTriggerTable.fireBeforeUpdateStatementLevelTriggers(sec, columnIndexes); 193 if (iterator.last()) { 194 Object updateEvent = null; 195 try { 196 197 do { 198 _Record record = iterator.getRecord(); 199 if (! (record.getObject(SystemFields.invalidSessionId).equals(SystemFields.maxIntegerValue)) && sec.getServerSession().getIsolationLevel() == Session.ReadCommitted) { 200 throw new DException("DSE879", (Object [])null); 201 } 202 203 Object rowId = record.getObject(0); 204 if (!rowIdList.contains(rowId)) { 205 rowIdList.add(rowId); 206 FieldBase[] valueSource = FieldUtility.convertToAppropriateType(FieldUtility.setFieldLiteralBufferRangeWithArray(getColumnsValues(initialisedVV)), columnsType, size, scale, collator); 207 updateEvent = dataTriggerTable.update(iterator, columnIndexes, valueSource, sec); 208 count++; 209 } 210 } while (iterator.previous()); 211 statementTriggerTable.fireAfterUpdateStatementLevelTriggers(sec, columnIndexes); 212 } catch (DException e) { 213 childUserSession.rollbackSavePoint(sec); 214 throw e; 215 } 216 217 218 catch (Exception e) { 219 e.printStackTrace(); 220 childUserSession.rollbackSavePoint(sec); 221 throw new DException("DSE0", new Object [] {e.getMessage()}); 222 } 223 } 224 225 childUserSession.commitSavePoint(sec); 226 if (sec.getAutoCommit() && serverSession.getAutoCommit() && !childUserSession.getSession().hasAnyChild()) { 227 serverSession.commit(); 228 } 229 if (sec.getAutoGeneratedType()) { 230 DMLResult dmlResult = sec.getDMLResult(); 231 dmlResult.setrowsEffected(count); 232 return dmlResult; 233 } 234 235 return new Integer (count); 236 } 237 238 private Object [] getColumnsValues(_VariableValues vv) throws DException { 239 int length = setClauseArray.length; 240 Object [] values = new Object [length]; 241 int indexColumn =0; 242 for (int i = 0; i < length; i++) { 243 if(setClauseArray[i][1] instanceof valueexpression){ 244 values[indexColumn] = ( (valueexpression) setClauseArray[i][1]).run(vv); 245 indexColumn++; 246 } 247 248 else{ 249 _Iterator iterator =null; 250 Object [] subQueryValue = null; 251 iterator = (_Iterator)( (subquery) setClauseArray[i][1]).run( 252 vv); 253 if(iterator.first()){ 254 if(iterator.next()) 255 throw new DException("DSE325", null); 256 iterator.previous(); 257 subQueryValue = (Object [])( (_SelectIterator) iterator).getSelectColumnValues(); 258 } 259 else{ 260 Object [] columns = (Object []) setClauseArray[i][0]; 261 subQueryValue = new Object [columns.length]; 262 for (int k = 0; k < columns.length; k++) { 263 subQueryValue[k] = FieldUtility.NULLFIELDBASE; 264 } 265 } 266 Object [] temp = new Object [subQueryValue.length + length -1]; 267 System.arraycopy(values,0,temp,0, values.length); 268 values = temp; 269 for (int j = 0; j < subQueryValue.length; j++, indexColumn++) { 270 values[indexColumn] = subQueryValue[j]; 271 } 272 } 273 } 274 return values; 275 } 276 277 private _Reference[] getReferences(Object [][] refValue) { 278 if (refValue != null) { 279 int len = refValue.length; 280 _Reference[] refToReturn = new _Reference[len]; 281 for (int i = 0; i < len; i++) { 282 refToReturn[i] = (_Reference) refValue[i][0]; 283 } 284 return refToReturn; 285 } 286 return null; 287 } 288 289 private _VariableValues initialiseVariableValues(_VariableValues vv) throws DException { 290 _VariableValues vvToReturn = null; 291 _Reference[] ref = null; 292 Object [][] refValues = null; 293 294 if (vv != null) { 295 refValues = vv.getReferenceAndValuePair(); 296 ref = getReferences(refValues); 297 if (ref != null) { 298 iterator.setConditionVariableValue(ref, (Object []) vv.getColumnValues(ref), 1); 299 } 300 } else { 301 iterator.setConditionVariableValue(null, null, 1); 302 } 303 if (questionMarks != null && ref == null) { 304 throw new DException("DSE1273", null); 305 } 306 307 _Reference[] mergedReferences = GeneralPurposeStaticClass.getJointReferences(ref, knownReferences); 308 if (referencesIteratorMapping != null) { 309 vvToReturn = new SubQueryVariableValues(mergedReferences, (Object [][]) referencesIteratorMapping, sec.getServerSession()); 310 } else { 311 vvToReturn = new VariableValues(mergedReferences, sec.getServerSession()); 312 313 } 314 if (vv != null && ref != null) { 315 vvToReturn.setConditionVariableValue(ref, getValues(refValues), 1); 316 } 317 vvToReturn.setIterator(iterator); 318 if (knownReferences != null) { 319 iterator.setConditionVariableValue(knownReferences, getIteratorArray(), 1); 320 vvToReturn.setConditionVariableValue(knownReferences, getIteratorArray(), 1); 321 } 322 return vvToReturn; 323 } 324 325 private Object [] getIteratorArray() { 326 Object [] toReturn = new Object [knownReferences.length]; 327 for (int i = 0; i < toReturn.length; i++) { 328 toReturn[i] = iterator; 329 } 330 return toReturn; 331 } 332 333 private Object [] getValues(Object [][] refValue) { 334 int len = refValue.length; 335 Object [] toReturn = new Object [len]; 336 for (int i = 0; i < len; i++) { 337 toReturn[i] = refValue[i][1]; 338 } 339 return toReturn; 340 } 341 342 private void performInitialisations() throws DException { 343 QualifiedIdentifier tableName = tableDetails.getQualifiedIdentifier(); 344 dataTriggerTable = sec.getDataTriggerTable(tableName); 345 statementTriggerTable = sec.getStatementTriggerTable(tableName); 346 _ColumnCharacteristics cc = tableDetails.getColumnCharacteristics(); 347 columnIndexes = getIntColumns(); 348 columnsType = ColumnCharacteristicsUtilities.getColumnsType(columnIndexes, cc); 349 size = ColumnCharacteristicsUtilities.getColumnsSize(columnIndexes, cc); 350 scale = ColumnCharacteristicsUtilities.getColumnsScale(columnIndexes, cc); 351 collator = cc.getCollator(); 352 } 353 354 public void checkForDroppedTable() throws DException { 355 for (int i = 0; i < dropTableInfo.length; i++) { 356 if (dropTableInfo[i].isTableDropped()) 357 throw new DException("DSE5584", null); 358 359 } 360 } 361 } 362 | Popular Tags |