KickJava   Java API By Example, From Geeks To Geeks.

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


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 JavaDoc[][] setClauseArray;
35    Object JavaDoc 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 JavaDoc[] previousParameters;
46    private FieldBase[] previousFieldBase;
47    private _DropTableInfo[] dropTableInfo;
48    private QualifiedIdentifier tableName;
49    public ViewUpdateExecuter(_StatementExecutionContext ssec, TableDetails td, _Iterator itera, Object JavaDoc[][] setClauseArra, long initialTime, Object JavaDoc 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 JavaDoc[] tableName = (String JavaDoc[]) 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 JavaDoc execute(_VariableValues vv) throws DException {
81       checkForDroppedTable();
82       iterator.releaseResource();
83       return executeV(vv);
84    }
85
86    private Object JavaDoc executeV(_VariableValues vv) throws DException {
87       childUserSession = sec.getServerSession().getUserSession();
88       long t = System.currentTimeMillis();
89       Object JavaDoc 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          ;//// Removed By Program ** ex.printStackTrace();
106
}
107                try {
108                   synchronized (serverSession.getUserSession().getSession().getSessionDatabase()) {
109                      serverSession.getUserSession().getSession().getSessionDatabase().wait();
110                   }
111                } catch (Exception JavaDoc e) {
112                }
113             } else {
114                throw new DmlStatementException("DSE1276", new Object JavaDoc[] {tableDetails.getQualifiedTableName()},ex);
115             }
116          }
117       }
118    }
119
120    public Object JavaDoc execute(Object JavaDoc[] obj) throws com.daffodilwoods.database.resource.DException {
121       checkForDroppedTable();
122       if (obj == null) {
123          ;//// Removed By Program ** System.out.println(" ob is null ");
124
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 JavaDoc[] {tableDetails.getQualifiedTableName()}
132                                          , new DException("DSE1252", new Object JavaDoc[] {new Integer JavaDoc(obj.length), new Integer JavaDoc(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 JavaDoc executeForFresh(Object JavaDoc[] 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 JavaDoc[] obj = (Object JavaDoc[]) 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 JavaDoc 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 JavaDoc 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 JavaDoc row= iterator.getColumnValues();
196                Object JavaDoc rowId = ((Object JavaDoc[])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 JavaDoc e) {
212             e.printStackTrace();
213             childUserSession.rollbackSavePoint(sec);
214             throw new DException("DSE0", new Object JavaDoc[] {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 JavaDoc(count);
228    }
229
230    private Object JavaDoc[] getColumnsValues(_VariableValues vv) throws DException {
231       int length = setClauseArray.length;
232       Object JavaDoc[] values = new Object JavaDoc[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 JavaDoc[] 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 JavaDoc[])( (_SelectIterator) iterator).getSelectColumnValues();
250             }
251             else{
252               Object JavaDoc[] columns = (Object JavaDoc[]) setClauseArray[i][0];
253               subQueryValue = new Object JavaDoc[columns.length];
254               for (int k = 0; k < columns.length; k++) {
255                 subQueryValue[k] = FieldUtility.NULLFIELDBASE;
256               }
257             }
258             Object JavaDoc[] temp = new Object JavaDoc[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 JavaDoc[][] 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 JavaDoc[][] refValues = null;
287
288       if (vv != null) {
289          refValues = vv.getReferenceAndValuePair();
290          ref = getReferences(refValues);
291          if (ref != null) {
292             iterator.setConditionVariableValue(ref, (Object JavaDoc[]) 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 JavaDoc[][]) 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 JavaDoc[] getIteratorArray() {
319       Object JavaDoc[] toReturn = new Object JavaDoc[knownReferences.length];
320       for (int i = 0; i < toReturn.length; i++) {
321          toReturn[i] = iterator;
322       }
323       return toReturn;
324    }
325
326    private Object JavaDoc[] getValues(Object JavaDoc[][] refValue) {
327       int len = refValue.length;
328       Object JavaDoc[] toReturn = new Object JavaDoc[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