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