KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > daffodilwoods > daffodildb > server > datadictionarysystem > DefaultValueGetter


1 package com.daffodilwoods.daffodildb.server.datadictionarysystem;
2
3 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator._Iterator;
4
5 import com.daffodilwoods.daffodildb.server.sql99.dql.resultsetmetadata._RowReader;
6
7 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator.table.SelectIterator;
8
9
10 import java.util.ArrayList JavaDoc;
11 import com.daffodilwoods.database.resource.*;
12 import com.daffodilwoods.daffodildb.server.sql99.ddl.schemadefinition.defaultoption;
13 import com.daffodilwoods.database.general.TypeConverter;
14 import com.daffodilwoods.database.general.*;
15 import com.daffodilwoods.daffodildb.server.serversystem.*;
16 import com.daffodilwoods.database.utility.*;
17 import com.daffodilwoods.daffodildb.server.sql99._Executer;
18
19 import com.daffodilwoods.daffodildb.server.sql99.ddl.descriptors.*;
20
21 import com.daffodilwoods.daffodildb.utils.parser.Parser;
22 import com.daffodilwoods.daffodildb.server.datasystem.interfaces.Datatype;
23 import java.math.*;
24 import com.daffodilwoods.daffodildb.server.sql99.utils._Reference;
25 import com.daffodilwoods.daffodildb.utils.ColumnCharacteristicsUtilities;
26 import com.daffodilwoods.daffodildb.utils.*;
27 import com.daffodilwoods.daffodildb.utils.field.*;
28 import java.util.Arrays JavaDoc;
29 import com.daffodilwoods.daffodildb.server.sql99.utils._VariableValues;
30 import com.daffodilwoods.daffodildb.server.sql99.utils.VariableValues;
31 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator._SelectQueryIterator;
32 import com.daffodilwoods.daffodildb.server.sql99.common.Datatypes;
33
34 public class DefaultValueGetter implements _DefaultValueGetter {
35
36
37
38   static int systemFieldsCount = SystemFields.systemFieldsCount;
39   private defaultoption[] defaultOptions;
40   private Object JavaDoc autoValue;
41   private int autoColumnDataType;
42   private int autoColumnIndex;
43   private _ColumnCharacteristics cc;
44
45   public DefaultValueGetter(QualifiedIdentifier tableName,PreparedStatementGetter preparedStatementGetter,_ColumnCharacteristics cc1) throws DException {
46       ArrayList JavaDoc defaultList = new ArrayList JavaDoc();
47       cc = cc1;
48      _SelectQueryIterator iterator = getIterator(preparedStatementGetter.getDefalutClauseExecuter(),breakTableName(tableName));
49    try{
50      autoColumnIndex = -1;
51      int count = 0;
52        if( iterator.first() ){
53          Object JavaDoc[] record = null;
54          do{
55            record = (Object JavaDoc[])iterator.getObject();
56            String JavaDoc columnDefault = (String JavaDoc)record[0];
57            String JavaDoc autoIncrement = (String JavaDoc)record[1];
58            if(autoIncrement.equalsIgnoreCase(SqlSchemaConstants.YES))
59              autoColumnIndex = count;
60            count++;
61             defaultList.add(columnDefault == null || columnDefault.equals("") ? null
62                 : Parser.parseDefaultOption(columnDefault));
63         }while(iterator.next());
64         }
65         if(autoColumnIndex != -1){
66           autoColumnDataType = cc.getColumnType(autoColumnIndex + systemFieldsCount);
67           intializeValueofColumn(preparedStatementGetter.serverSession,tableName,cc.getColumnName(autoColumnIndex + systemFieldsCount));
68         }
69    } catch (DatabaseException dx){
70        InitializeException ie = new InitializeException("DSE1109", new Object JavaDoc[]{tableName});
71        ie.setException(dx);
72        throw ie;
73    }
74      defaultOptions = (defaultoption[])defaultList.toArray(new defaultoption[0]);
75   }
76
77   public defaultoption getDefaultValueExpression(int column) throws DException {
78      return defaultOptions[column-systemFieldsCount];
79   }
80
81   public Object JavaDoc[] addDefaultValues(int[] columns, Object JavaDoc[] values,_ServerSession serverSession) throws DException{
82      int columnCount = defaultOptions.length;
83      int[] excludedColumns = new int[columnCount];
84      FieldBase[] excludedValues = new FieldBase[columnCount];
85      int k = 0;
86      _VariableValues vv = new VariableValues(serverSession);
87      for(int i = 0;i <columnCount;i++){
88         if(defaultOptions[i] != null ){
89           int columnPresentAtIndex = P.indexOf(columns,i+systemFieldsCount);
90           if ( columnPresentAtIndex == -1 ) {
91             excludedColumns[k] = i + systemFieldsCount;
92             try {
93               excludedValues[k++] = (FieldBase) defaultOptions[i].run(vv);
94             }
95             catch (Exception JavaDoc e) {
96               e.printStackTrace();
97               throw new DException("DSE813", new Object JavaDoc[] {defaultOptions[i].toString()});
98             }
99           }
100           else {
101             FieldBase valuePresent = (FieldBase)values[columnPresentAtIndex];
102             int type = valuePresent.getDatatype();
103             if(type == Datatypes.DEFAULT_DATATYPE)
104               values[columnPresentAtIndex] = FieldUtility.convertToAppropriateType((FieldBase) defaultOptions[i].run(vv),cc.getColumnType(columns[columnPresentAtIndex]),cc.getSize(columns[columnPresentAtIndex]),cc.getCollator());
105           }
106         }
107      }
108      if(autoValue != null){
109        int indexofAutoColumn = P.indexOf(columns,autoColumnIndex+systemFieldsCount);
110        if( (columns == null || indexofAutoColumn == -1)){
111          excludedColumns[k] = autoColumnIndex + systemFieldsCount;
112          excludedValues[k++] = FieldUtility.getField(autoColumnDataType,getNextValue(),cc.getCollator());
113        }
114        else{
115          Object JavaDoc actualValue = ((FieldBase)values[indexofAutoColumn]).getObject();
116          if(actualValue == null)
117            values[indexofAutoColumn] = FieldUtility.getField(autoColumnDataType,getNextValue(),cc.getCollator());
118          else
119            changeCurrentAutoValue(actualValue);
120        }
121      }
122      int passedColumns = columns == null ? 0 : columns.length;
123      if(k == 0 && passedColumns == 0)
124         return new Object JavaDoc[]{columns,values};
125      int[] defaultColumns = new int[passedColumns + k];
126      FieldBase[] defaultValues = new FieldBase[passedColumns + k];
127      if(passedColumns != 0){
128         System.arraycopy(columns,0,defaultColumns,0,passedColumns);
129         System.arraycopy(values,0,defaultValues,0,passedColumns);
130      }
131      if(k != 0){
132         FieldBase[] tempValues = new FieldBase[k];
133         int[] tempIndexes = new int[k];
134         System.arraycopy(excludedColumns,0,tempIndexes,0,k);
135         System.arraycopy(excludedValues,0,tempValues,0,k);
136         int[] dataTypes = ColumnCharacteristicsUtilities.getColumnsType( tempIndexes, cc );;
137         int[] size = ColumnCharacteristicsUtilities.getColumnsSize(tempIndexes, cc);
138         int[] scale = ColumnCharacteristicsUtilities.getColumnsScale( tempIndexes, cc);
139         Object JavaDoc[] convertedValues = FieldUtility.convertToAppropriateType(FieldUtility.setFieldLiteralBufferRange(tempValues),dataTypes,size,scale, cc.getCollator());
140         System.arraycopy(tempIndexes,0,defaultColumns,passedColumns,k);
141         System.arraycopy(convertedValues,0,defaultValues,passedColumns,k);
142      }
143      return new Object JavaDoc[]{defaultColumns,defaultValues};
144   }
145
146
147   private String JavaDoc[] breakTableName (QualifiedIdentifier tableName) throws DException {
148         String JavaDoc[] breakedTable = new String JavaDoc[3];
149         breakedTable[0] = tableName.catalog;
150         breakedTable[1] = tableName.schema;
151         breakedTable[2] = tableName.name;
152       return breakedTable;
153   }
154
155
156   private _SelectQueryIterator getIterator(_Executer executer,Object JavaDoc[] parameters) throws DException{
157      return (_SelectQueryIterator) executer.executeForFresh( parameters);
158   }
159
160   private void intializeValueofColumn(_ServerSession serverSession,QualifiedIdentifier tableName,String JavaDoc columnName) throws DException{
161     _SelectQueryIterator iterator = SqlSchemaConstants.getIteratorOnCurrent(serverSession,"select max(\""+columnName+ "\") from \""+tableName.catalog+"\".\""+tableName.schema+"\".\""+tableName.name+"\"",null);
162       if(iterator.first()){
163         autoValue = ((Object JavaDoc[])iterator.getObject())[0];
164     }
165          if(autoValue == null){
166            intializeToZero();
167          }
168   }
169
170   private void intializeToZero()throws DException{
171     switch (autoColumnDataType){
172       case Datatype.INT :
173       case Datatype.INTEGER :
174         autoValue = new Integer JavaDoc(0);
175         break;
176       case Datatype.SMALLINT :
177       case Datatype.SHORT :
178         autoValue = new Short JavaDoc("0");
179         break;
180       case Datatype.BYTE:
181       case Datatype.TINYINT :
182         autoValue = new Byte JavaDoc("0");
183         break;
184       case Datatype.LONG:
185       case Datatype.BIGINT :
186         autoValue = new Long JavaDoc("0");
187         break;
188       case Datatype.NUMERIC:
189       case Datatype.DEC :
190       case Datatype.DECIMAL :
191         autoValue = new BigDecimal("0");
192         break;
193       case Datatype.DOUBLEPRECISION :
194       case Datatype.DOUBLE :
195       case Datatype.FLOAT :
196         autoValue = new Double JavaDoc("0");
197         break;
198       case Datatype.REAL :
199         autoValue = new Float JavaDoc("0");
200
201     }
202   }
203
204     private synchronized Object JavaDoc getNextValue()throws DException{
205       switch (autoColumnDataType){
206         case Datatype.INT :
207         case Datatype.INTEGER :
208           int value = ((Integer JavaDoc)autoValue).intValue();
209           if(value == Integer.MAX_VALUE)
210             throw new DException("DSE5042",new Object JavaDoc[]{autoValue});
211           autoValue = new Integer JavaDoc(value + 1);
212           break;
213         case Datatype.SMALLINT :
214         case Datatype.SHORT :
215           short svalue = ((Short JavaDoc)autoValue).shortValue();
216           if(svalue == Short.MAX_VALUE)
217             throw new DException("DSE5042",new Object JavaDoc[]{autoValue});
218           autoValue = new Short JavaDoc((short)(svalue + 1));
219           break;
220
221         case Datatype.BYTE:
222         case Datatype.TINYINT :
223           byte bvalue = ((Byte JavaDoc)autoValue).byteValue();
224           if(bvalue == Byte.MAX_VALUE)
225             throw new DException("DSE5042",new Object JavaDoc[]{autoValue});
226           autoValue = new Byte JavaDoc((byte)(bvalue + 1));
227           break;
228         case Datatype.LONG:
229         case Datatype.BIGINT :
230           long lvalue = ((Long JavaDoc)autoValue).longValue();
231           if(lvalue == Long.MAX_VALUE)
232             throw new DException("DSE5042",new Object JavaDoc[]{new Long JavaDoc(Long.MAX_VALUE)});
233           autoValue = new Long JavaDoc((long)(lvalue + 1));
234           break;
235         case Datatype.NUMERIC:
236         case Datatype.DEC :
237         case Datatype.DECIMAL :
238           BigDecimal bigvalue = (BigDecimal)autoValue;
239           autoValue = bigvalue.add(new BigDecimal(1));
240           break;
241         case Datatype.DOUBLEPRECISION :
242         case Datatype.DOUBLE :
243         case Datatype.FLOAT :
244           double dvalue = ((Double JavaDoc)autoValue).doubleValue();
245           if(dvalue >= Double.MAX_VALUE)
246             throw new DException("DSE5042",new Object JavaDoc[]{autoValue});
247           autoValue = new Double JavaDoc((double)(dvalue + 1));
248           break;
249         case Datatype.REAL :
250           float fvalue = ((Float JavaDoc)autoValue).floatValue();
251           if(fvalue >= Float.MAX_VALUE)
252             throw new DException("DSE5042",new Object JavaDoc[]{autoValue});
253           autoValue = new Float JavaDoc((float)(fvalue + 1));
254       }
255       return autoValue;
256   }
257
258   private synchronized void changeCurrentAutoValue(Object JavaDoc passedValue) throws DException {
259    passedValue = TypeConverter.ConvertObjectToDatabaseType(passedValue,autoColumnDataType,-1);
260     switch (autoColumnDataType){
261       case Datatype.INT :
262       case Datatype.INTEGER :
263         int value = ((Integer JavaDoc)autoValue).intValue();
264         int ipValue = ((Integer JavaDoc)passedValue).intValue();
265         if(value < ipValue)
266           autoValue = passedValue ;
267         break;
268       case Datatype.SMALLINT :
269       case Datatype.SHORT :
270         short svalue = ((Short JavaDoc)autoValue).shortValue();
271         short psvalue = ((Short JavaDoc)passedValue).shortValue();
272         if(svalue < psvalue)
273           autoValue = passedValue;
274         break;
275
276       case Datatype.BYTE:
277       case Datatype.TINYINT :
278         byte bvalue = ((Byte JavaDoc)autoValue).byteValue();
279         byte pbvalue = ((Byte JavaDoc)passedValue).byteValue();
280         if(bvalue < pbvalue )
281           autoValue = passedValue;
282         break;
283       case Datatype.LONG:
284       case Datatype.BIGINT :
285         long lvalue = ((Long JavaDoc)autoValue).longValue();
286         long plvalue = ((Long JavaDoc)passedValue).longValue();
287         if(lvalue < plvalue)
288           autoValue = passedValue;
289         break;
290       case Datatype.NUMERIC:
291       case Datatype.DEC :
292       case Datatype.DECIMAL :
293         BigDecimal bigvalue = (BigDecimal)autoValue;
294           if(bigvalue.compareTo((BigDecimal)passedValue) == -1)
295             autoValue = passedValue;
296         break;
297       case Datatype.DOUBLEPRECISION :
298       case Datatype.DOUBLE :
299       case Datatype.FLOAT :
300         double dvalue = ((Double JavaDoc)autoValue).doubleValue();
301         double pdvalue = ((Double JavaDoc)passedValue).doubleValue();
302         if(dvalue < pdvalue)
303           autoValue = passedValue;
304         break;
305       case Datatype.REAL :
306         float fvalue = ((Float JavaDoc)autoValue).floatValue();
307         float pfvalue = ((Float JavaDoc)passedValue).floatValue();
308         if(fvalue < pfvalue)
309           autoValue = passedValue;
310     }
311   }
312
313   public void updateDefaultValues(int[] columns, Object JavaDoc[] values,
314                                   _ServerSession serverSession) throws
315       DException {
316     int columnCount = defaultOptions.length;
317     _VariableValues vv = new VariableValues(serverSession);
318     for (int i = 0; i < columnCount; i++) {
319       if (defaultOptions[i] != null) {
320         int columnPresentAtIndex = P.indexOf(columns, i + systemFieldsCount);
321         if (columnPresentAtIndex != -1) {
322           FieldBase valuePresent = (FieldBase) values[columnPresentAtIndex];
323           int type = valuePresent.getDatatype();
324           if (type == Datatypes.DEFAULT_DATATYPE){
325             values[columnPresentAtIndex] = FieldUtility.convertToAppropriateType((FieldBase) defaultOptions[i].run(vv),cc.getColumnType(columns[columnPresentAtIndex]),cc.getSize(columns[columnPresentAtIndex]),cc.getCollator());
326           }
327         }
328       }
329     }
330     if(autoValue != null){
331       int indexofAutoColumn = P.indexOf(columns,autoColumnIndex+systemFieldsCount);
332       if( (columns == null || indexofAutoColumn == -1))
333          return ;
334       Object JavaDoc actualValue = ( (FieldBase) values[indexofAutoColumn]).getObject();
335       if (actualValue == null)
336          throw new DException("DSE8067",null);
337       changeCurrentAutoValue(actualValue);
338     }
339
340   }
341
342 }
343
Popular Tags