1 24 25 package com.mckoi.database; 26 27 import com.mckoi.database.global.Types; 28 import com.mckoi.database.global.StringObject; 29 import java.util.List ; 30 import java.util.Arrays ; 31 import java.util.Date ; 32 import java.io.DataOutput ; 33 import java.io.InputStream ; 34 import java.io.IOException ; 35 36 53 54 public class RowData implements Types { 55 56 59 private TransactionSystem system; 60 61 65 private TableDataSource table; 66 67 70 private DataTableDef table_def; 71 72 75 private TObject[] data_cell_list; 76 77 80 private int col_count; 81 82 83 87 public RowData(TransactionSystem system, int col_count) { 88 this.system = system; 89 this.col_count = col_count; 90 data_cell_list = new TObject[col_count]; 91 } 92 93 96 public RowData(TableDataSource table) { 97 this.system = table.getSystem(); 98 this.table = table; 99 table_def = table.getDataTableDef(); 100 col_count = table_def.columnCount(); 101 data_cell_list = new TObject[col_count]; 102 } 103 104 108 void setFromRow(int row) { 109 for (int col = 0; col < col_count; ++col) { 110 setColumnData(col, table.getCellContents(col, row)); 111 } 112 } 113 114 119 boolean isSameTable(DataTable tab) { 120 return table == tab; 121 } 122 123 128 public void setColumnData(int column, TObject cell) { 129 DataTableColumnDef col = table_def.columnAt(column); 130 if (table != null && col.getSQLType() != cell.getTType().getSQLType()) { 131 cell = cell.castTo(col.getTType()); 133 } 134 setColumnDataFromTObject(column, cell); 135 } 136 137 140 public void setColumnDataFromObject(int column, Object ob) { 141 DataTableColumnDef col_def = table_def.columnAt(column); 142 143 if (ob instanceof String ) { 144 ob = StringObject.fromString((String ) ob); 145 } 146 147 TObject cell = TObject.createAndCastFromObject(col_def.getTType(), ob); 149 setColumnDataFromTObject(column, cell); 150 } 151 152 155 public void setColumnDataFromTObject(int column, TObject ob) { 156 data_cell_list[column] = ob; 157 } 158 159 162 public void setColumnToNull(int column) { 163 DataTableColumnDef col_def = table_def.columnAt(column); 164 setColumnDataFromTObject(column, new TObject(col_def.getTType(), null)); 165 } 166 167 170 public void setColumnToDefault(int column, QueryContext context) { 171 if (table != null) { 172 DataTableColumnDef column_def = table_def.columnAt(column); 173 Expression exp = column_def.getDefaultExpression(system); 174 if (exp != null) { 175 TObject def_val = evaluate(exp, context); 176 setColumnData(column, def_val); 177 return; 178 } 179 } 180 setColumnToNull(column); 181 } 182 183 187 public TObject getCellData(int column) { 188 TObject cell = data_cell_list[column]; 189 if (cell == null) { 190 DataTableColumnDef col_def = table_def.columnAt(column); 191 cell = new TObject(col_def.getTType(), null); 192 } 193 return cell; 194 } 195 196 199 public String getColumnName(int column) { 200 return table_def.columnAt(column).getName(); 201 } 202 203 206 public int findFieldName(String column_name) { 207 return table_def.findColumnName(column_name); 208 } 209 210 213 public int getColumnCount() { 214 return col_count; 215 } 216 217 221 TObject evaluate(Expression expression, QueryContext context) { 222 boolean ignore_case = system.ignoreIdentifierCase(); 223 table_def.resolveColumns(ignore_case, expression); 225 VariableResolver vresolver = getVariableResolver(); 227 return expression.evaluate(null, vresolver, context); 228 } 229 230 234 void evaluate(Assignment assignment, QueryContext context) { 235 236 VariableResolver vresolver = getVariableResolver(); 238 TObject ob = assignment.getExpression().evaluate(null, vresolver, context); 239 240 Variable variable = assignment.getVariable(); 242 int column = findFieldName(variable.getName()); 243 244 setColumnData(column, ob); 246 } 247 248 254 public void setDefaultForRest(QueryContext context) 255 throws DatabaseException { 256 for (int i = 0; i < col_count; ++i) { 257 if (data_cell_list[i] == null) { 258 setColumnToDefault(i, context); 259 } 260 } 261 } 262 263 267 public void setupEntire(Assignment[] assignments, QueryContext context) 268 throws DatabaseException { 269 for (int i = 0; i < assignments.length; ++i) { 270 evaluate(assignments[i], context); 271 } 272 setDefaultForRest(context); 274 } 275 276 282 public void setupEntire(int[] col_indices, List insert_elements, 283 QueryContext context) throws DatabaseException { 284 int elem_size = insert_elements.size(); 285 if (col_indices.length != elem_size) { 286 throw new DatabaseException( 287 "Column indices and expression array sizes don't match"); 288 } 289 VariableResolver vresolver = getVariableResolver(); 291 for (int i = 0; i < col_indices.length; ++i) { 292 Object element = insert_elements.get(i); 293 if (element instanceof Expression) { 294 TObject ob = ((Expression) element).evaluate(null, vresolver, context); 296 int table_column = col_indices[i]; 297 ob = ob.castTo(table_def.columnAt(table_column).getTType()); 299 setColumnDataFromTObject(table_column, ob); 301 } 302 else { 303 if (!element.equals("DEFAULT")) { 306 throw new DatabaseException( 307 "Invalid value in 'insert_elements' list."); 308 } 309 } 310 } 311 setDefaultForRest(context); 313 } 314 315 320 public void setupEntire(int[] col_indices, Expression[] exps, 321 QueryContext context) throws DatabaseException { 322 setupEntire(col_indices, Arrays.asList(exps), context); 323 } 324 325 328 public String toString() { 329 StringBuffer buf = new StringBuffer (); 330 buf.append("[RowData: "); 331 for (int i = 0; i < col_count; ++i) { 332 buf.append(data_cell_list[i].getObject()); 333 buf.append(", "); 334 } 335 return new String (buf); 336 } 337 338 341 private VariableResolver getVariableResolver() { 342 if (variable_resolver == null) { 343 variable_resolver = new RDVariableResolver(); 344 } 345 else { 346 variable_resolver.nextAssignment(); 347 } 348 return variable_resolver; 349 350 } 351 352 private RDVariableResolver variable_resolver = null; 353 354 356 359 private class RDVariableResolver implements VariableResolver { 360 361 private int assignment_count = 0; 362 363 void nextAssignment() { 364 ++assignment_count; 365 } 366 367 public int setID() { 368 return assignment_count; 369 } 370 371 public TObject resolve(Variable variable) { 372 String col_name = variable.getName(); 373 374 int col_index = table_def.findColumnName(col_name); 375 if (col_index == -1) { 376 throw new Error ("Can't find column: " + col_name); 377 } 378 379 TObject cell = data_cell_list[col_index]; 380 381 if (cell == null) { 382 throw new Error ("Column " + col_name + " hasn't been set yet."); 383 } 384 385 return cell; 386 } 387 388 public TType returnTType(Variable variable) { 389 String col_name = variable.getName(); 390 391 int col_index = table_def.findColumnName(col_name); 392 if (col_index == -1) { 393 throw new Error ("Can't find column: " + col_name); 394 } 395 396 return table_def.columnAt(col_index).getTType(); 397 } 398 399 } 400 401 } 402 | Popular Tags |