1 24 25 package com.mckoi.database.interpret; 26 27 import java.util.*; 28 import com.mckoi.database.*; 29 30 36 37 public class UpdateTable extends Statement { 38 39 42 String table_name; 43 44 47 ArrayList column_sets; 48 49 53 SearchExpression where_condition; 54 55 59 int limit = -1; 60 61 66 private ArrayList relationally_linked_tables; 67 68 69 71 74 private DataTable update_table; 75 76 79 private TableName tname; 80 81 84 private QueryPlanNode plan; 85 86 88 public void prepare() throws DatabaseException { 89 90 table_name = (String ) cmd.getObject("table_name"); 91 column_sets = (ArrayList) cmd.getObject("assignments"); 92 where_condition = (SearchExpression) cmd.getObject("where_clause"); 93 limit = cmd.getInt("limit"); 94 95 97 tname = resolveTableName(table_name, database); 99 if (!database.tableExists(tname)) { 101 throw new DatabaseException("Table '" + tname + "' does not exist."); 102 } 103 update_table = database.getTable(tname); 105 106 TableSelectExpression select_expression = new TableSelectExpression(); 108 select_expression.from_clause.addTable(table_name); 110 select_expression.where_clause = where_condition; 112 113 TableExpressionFromSet from_set = 115 Planner.generateFromSet(select_expression, database); 116 plan = Planner.formQueryPlan(database, select_expression, from_set, null); 118 119 for (int i = 0; i < column_sets.size(); ++i) { 121 Assignment assignment = (Assignment) column_sets.get(i); 122 Variable orig_var = assignment.getVariable(); 123 Variable new_var = from_set.resolveReference(orig_var); 124 if (new_var == null) { 125 throw new StatementException("Reference not found: " + orig_var); 126 } 127 orig_var.set(new_var); 128 assignment.prepareExpressions(from_set.expressionQualifier()); 129 } 130 131 TableName[] linked_tables = 133 database.queryTablesRelationallyLinkedTo(tname); 134 relationally_linked_tables = new ArrayList(linked_tables.length); 135 for (int i = 0; i < linked_tables.length; ++i) { 136 relationally_linked_tables.add(database.getTable(linked_tables[i])); 137 } 138 139 } 140 141 public Table evaluate() throws DatabaseException { 142 143 DatabaseQueryContext context = new DatabaseQueryContext(database); 144 145 Variable[] col_var_list = new Variable[column_sets.size()]; 148 for (int i = 0; i < col_var_list.length; ++i) { 149 Assignment assign = (Assignment) column_sets.get(i); 150 col_var_list[i] = assign.getVariable(); 151 } 152 153 if (!database.getDatabase().canUserUpdateTableObject(context, 155 user, tname, col_var_list)) { 156 throw new UserAccessException( 157 "User not permitted to update table: " + table_name); 158 } 159 160 Select.checkUserSelectPermissions(context, user, plan); 162 163 Table update_set = plan.evaluate(context); 165 166 Assignment[] assign_list = new Assignment[column_sets.size()]; 168 assign_list = (Assignment[]) column_sets.toArray(assign_list); 169 int update_count = update_table.update(context, 171 update_set, assign_list, limit); 172 173 if (update_count > 0) { 175 database.notifyTriggerEvent(new TriggerEvent( 176 TriggerEvent.UPDATE, tname.toString(), update_count)); 177 } 178 179 return FunctionTable.resultTable(context, update_count); 181 182 } 183 184 185 } 186 | Popular Tags |