KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > daffodilwoods > daffodildb > server > sql99 > dml > UpdateExecuter


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 JavaDoc[][] setClauseArray;
32    Object JavaDoc 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 JavaDoc[] previousParameters;
43    private FieldBase[] previousFieldBase;
44    private _DropTableInfo[] dropTableInfo;
45    private QualifiedIdentifier tableName;
46    public UpdateExecuter(_StatementExecutionContext ssec, TableDetails td, _Iterator itera, Object JavaDoc[][] setClauseArra, long initialTime, Object JavaDoc 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 JavaDoc[] tableName = (String JavaDoc[]) 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 JavaDoc execute(_VariableValues vv) throws DException {
79       checkForDroppedTable();
80       iterator.releaseResource();
81       return executeV(vv);
82    }
83
84    private Object JavaDoc executeV(_VariableValues vv) throws DException {
85       childUserSession = sec.getServerSession().getUserSession();
86       long t = System.currentTimeMillis();
87       Object JavaDoc 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          ;//// Removed By Program ** ex.printStackTrace();
105
}
106                synchronized (serverSession.getUserSession().getSession().getSessionDatabase()) {
107                     if(serverSession.getIsolationLevel() == Session.ReadTransactionSerializable ){
108          ;//// Removed By Program ** System.out.println("UpdateExecuter.executeV(vv)"+ serverSession.getSessionId() +" going into wait with flag ="+flagToAvoidDeadLocking);
109
if (flagToAvoidDeadLocking){
110          ;//// Removed By Program ** System.out.println(" UE Exception thrown for "+serverSession.getSessionId() );
111
throw new DException("DSE2058", null);
112                       }
113                       flagToAvoidDeadLocking = true;
114            }
115
116           try{
117             serverSession.getUserSession().getSession().getSessionDatabase().
118                 wait();
119           }catch(Exception JavaDoc e){
120
121           }
122                }
123             } else {
124                throw new DmlStatementException("DSE1276", new Object JavaDoc[] {tableDetails.getQualifiedTableName()}
125                                                , ex);
126             }
127          }
128       }
129    }
130
131    public Object JavaDoc execute(Object JavaDoc[] 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 JavaDoc[] {tableDetails.getQualifiedTableName()}
142                                          , new DException("DSE1252", new Object JavaDoc[] {new Integer JavaDoc(obj.length), new Integer JavaDoc(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 JavaDoc executeForFresh(Object JavaDoc[] 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 JavaDoc[] obj = (Object JavaDoc[]) 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 JavaDoc 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 JavaDoc 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 JavaDoc[])null);
201                }
202
203                Object JavaDoc 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 JavaDoc e) {
219             e.printStackTrace();
220             childUserSession.rollbackSavePoint(sec);
221             throw new DException("DSE0", new Object JavaDoc[] {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 JavaDoc(count);
236    }
237
238    private Object JavaDoc[] getColumnsValues(_VariableValues vv) throws DException {
239       int length = setClauseArray.length;
240       Object JavaDoc[] values = new Object JavaDoc[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 JavaDoc[] 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 JavaDoc[])( (_SelectIterator) iterator).getSelectColumnValues();
258             }
259             else{
260               Object JavaDoc[] columns = (Object JavaDoc[]) setClauseArray[i][0];
261               subQueryValue = new Object JavaDoc[columns.length];
262               for (int k = 0; k < columns.length; k++) {
263                 subQueryValue[k] = FieldUtility.NULLFIELDBASE;
264               }
265             }
266             Object JavaDoc[] temp = new Object JavaDoc[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 JavaDoc[][] 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 JavaDoc[][] refValues = null;
293
294       if (vv != null) {
295          refValues = vv.getReferenceAndValuePair();
296          ref = getReferences(refValues);
297          if (ref != null) {
298             iterator.setConditionVariableValue(ref, (Object JavaDoc[]) 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 JavaDoc[][]) 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 JavaDoc[] getIteratorArray() {
326       Object JavaDoc[] toReturn = new Object JavaDoc[knownReferences.length];
327       for (int i = 0; i < toReturn.length; i++) {
328          toReturn[i] = iterator;
329       }
330       return toReturn;
331    }
332
333    private Object JavaDoc[] getValues(Object JavaDoc[][] refValue) {
334       int len = refValue.length;
335       Object JavaDoc[] toReturn = new Object JavaDoc[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