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 ; 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 ; 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 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 defaultList = new ArrayList (); 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 [] record = null; 54 do{ 55 record = (Object [])iterator.getObject(); 56 String columnDefault = (String )record[0]; 57 String autoIncrement = (String )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 []{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 [] addDefaultValues(int[] columns, Object [] 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 e) { 96 e.printStackTrace(); 97 throw new DException("DSE813", new Object [] {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 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 []{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 [] 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 []{defaultColumns,defaultValues}; 144 } 145 146 147 private String [] breakTableName (QualifiedIdentifier tableName) throws DException { 148 String [] breakedTable = new String [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 [] parameters) throws DException{ 157 return (_SelectQueryIterator) executer.executeForFresh( parameters); 158 } 159 160 private void intializeValueofColumn(_ServerSession serverSession,QualifiedIdentifier tableName,String 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 [])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 (0); 175 break; 176 case Datatype.SMALLINT : 177 case Datatype.SHORT : 178 autoValue = new Short ("0"); 179 break; 180 case Datatype.BYTE: 181 case Datatype.TINYINT : 182 autoValue = new Byte ("0"); 183 break; 184 case Datatype.LONG: 185 case Datatype.BIGINT : 186 autoValue = new Long ("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 ("0"); 197 break; 198 case Datatype.REAL : 199 autoValue = new Float ("0"); 200 201 } 202 } 203 204 private synchronized Object getNextValue()throws DException{ 205 switch (autoColumnDataType){ 206 case Datatype.INT : 207 case Datatype.INTEGER : 208 int value = ((Integer )autoValue).intValue(); 209 if(value == Integer.MAX_VALUE) 210 throw new DException("DSE5042",new Object []{autoValue}); 211 autoValue = new Integer (value + 1); 212 break; 213 case Datatype.SMALLINT : 214 case Datatype.SHORT : 215 short svalue = ((Short )autoValue).shortValue(); 216 if(svalue == Short.MAX_VALUE) 217 throw new DException("DSE5042",new Object []{autoValue}); 218 autoValue = new Short ((short)(svalue + 1)); 219 break; 220 221 case Datatype.BYTE: 222 case Datatype.TINYINT : 223 byte bvalue = ((Byte )autoValue).byteValue(); 224 if(bvalue == Byte.MAX_VALUE) 225 throw new DException("DSE5042",new Object []{autoValue}); 226 autoValue = new Byte ((byte)(bvalue + 1)); 227 break; 228 case Datatype.LONG: 229 case Datatype.BIGINT : 230 long lvalue = ((Long )autoValue).longValue(); 231 if(lvalue == Long.MAX_VALUE) 232 throw new DException("DSE5042",new Object []{new Long (Long.MAX_VALUE)}); 233 autoValue = new Long ((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 )autoValue).doubleValue(); 245 if(dvalue >= Double.MAX_VALUE) 246 throw new DException("DSE5042",new Object []{autoValue}); 247 autoValue = new Double ((double)(dvalue + 1)); 248 break; 249 case Datatype.REAL : 250 float fvalue = ((Float )autoValue).floatValue(); 251 if(fvalue >= Float.MAX_VALUE) 252 throw new DException("DSE5042",new Object []{autoValue}); 253 autoValue = new Float ((float)(fvalue + 1)); 254 } 255 return autoValue; 256 } 257 258 private synchronized void changeCurrentAutoValue(Object 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 )autoValue).intValue(); 264 int ipValue = ((Integer )passedValue).intValue(); 265 if(value < ipValue) 266 autoValue = passedValue ; 267 break; 268 case Datatype.SMALLINT : 269 case Datatype.SHORT : 270 short svalue = ((Short )autoValue).shortValue(); 271 short psvalue = ((Short )passedValue).shortValue(); 272 if(svalue < psvalue) 273 autoValue = passedValue; 274 break; 275 276 case Datatype.BYTE: 277 case Datatype.TINYINT : 278 byte bvalue = ((Byte )autoValue).byteValue(); 279 byte pbvalue = ((Byte )passedValue).byteValue(); 280 if(bvalue < pbvalue ) 281 autoValue = passedValue; 282 break; 283 case Datatype.LONG: 284 case Datatype.BIGINT : 285 long lvalue = ((Long )autoValue).longValue(); 286 long plvalue = ((Long )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 )autoValue).doubleValue(); 301 double pdvalue = ((Double )passedValue).doubleValue(); 302 if(dvalue < pdvalue) 303 autoValue = passedValue; 304 break; 305 case Datatype.REAL : 306 float fvalue = ((Float )autoValue).floatValue(); 307 float pfvalue = ((Float )passedValue).floatValue(); 308 if(fvalue < pfvalue) 309 autoValue = passedValue; 310 } 311 } 312 313 public void updateDefaultValues(int[] columns, Object [] 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 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 |