1 24 25 package com.mckoi.database.interpret; 26 27 import java.util.*; 28 import com.mckoi.database.*; 29 30 35 36 public class Delete extends Statement { 37 38 41 String table_name; 42 43 47 SearchExpression where_condition; 48 49 53 int limit = -1; 54 55 57 60 private DataTable update_table; 61 62 65 private TableName tname; 66 67 72 private ArrayList relationally_linked_tables; 73 74 77 private QueryPlanNode plan; 78 79 80 81 82 83 85 public void prepare() throws DatabaseException { 86 87 table_name = (String ) cmd.getObject("table_name"); 89 where_condition = (SearchExpression) cmd.getObject("where_clause"); 90 limit = cmd.getInt("limit"); 91 92 94 tname = resolveTableName(table_name, database); 96 if (!database.tableExists(tname)) { 98 throw new DatabaseException("Table '" + tname + "' does not exist."); 99 } 100 update_table = database.getTable(tname); 102 103 TableSelectExpression select_expression = new TableSelectExpression(); 105 select_expression.from_clause.addTable(table_name); 107 select_expression.where_clause = where_condition; 109 110 TableExpressionFromSet from_set = 112 Planner.generateFromSet(select_expression, database); 113 plan = Planner.formQueryPlan(database, select_expression, from_set, null); 115 116 TableName[] linked_tables = 118 database.queryTablesRelationallyLinkedTo(tname); 119 relationally_linked_tables = new ArrayList(linked_tables.length); 120 for (int i = 0; i < linked_tables.length; ++i) { 121 relationally_linked_tables.add(database.getTable(linked_tables[i])); 122 } 123 124 } 125 126 public Table evaluate() throws DatabaseException { 127 128 DatabaseQueryContext context = new DatabaseQueryContext(database); 129 130 if (!database.getDatabase().canUserDeleteFromTableObject(context, 132 user, tname)) { 133 throw new UserAccessException( 134 "User not permitted to delete from table: " + table_name); 135 } 136 137 Select.checkUserSelectPermissions(context, user, plan); 139 140 142 Table delete_set = plan.evaluate(context); 144 145 int delete_count = update_table.delete(delete_set, limit); 147 148 if (delete_count > 0) { 150 database.notifyTriggerEvent(new TriggerEvent( 151 TriggerEvent.DELETE, tname.toString(), delete_count)); 152 } 153 154 return FunctionTable.resultTable(context, delete_count); 156 157 } 158 159 160 } 161 | Popular Tags |