|                                                                                                              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                                                                                                                                                                                              |