1 24 25 package com.mckoi.database.interpret; 26 27 import com.mckoi.database.*; 28 import java.util.ArrayList ; 29 import java.util.List ; 30 31 36 37 public class ViewManager extends Statement { 38 39 42 private String type; 43 44 47 private String view_name; 48 49 52 private TableName vname; 53 54 57 private TableSelectExpression select_expression; 58 59 63 private QueryPlanNode plan; 64 65 66 68 public void prepare() throws DatabaseException { 69 type = (String ) cmd.getObject("type"); 70 view_name = (String ) cmd.getObject("view_name"); 71 72 String schema_name = database.getCurrentSchema(); 73 vname = TableName.resolve(schema_name, view_name); 74 vname = database.tryResolveCase(vname); 75 76 if (type.equals("create")) { 77 select_expression = 79 (TableSelectExpression) cmd.getObject("select_expression"); 80 ArrayList col_list = (ArrayList ) cmd.getObject("column_list"); 82 83 TableExpressionFromSet from_set = 85 Planner.generateFromSet(select_expression, database); 86 plan = Planner.formQueryPlan(database, select_expression, from_set, 88 new ArrayList ()); 89 90 int sz = (col_list == null) ? 0 : col_list.size(); 93 Variable[] original_vars = from_set.generateResolvedVariableList(); 94 Variable[] new_column_vars = new Variable[original_vars.length]; 95 96 if (sz > 0) { 97 if (sz != original_vars.length) { 98 throw new StatementException( 99 "Column list is not the same size as the columns selected."); 100 } 101 for (int i = 0; i < sz; ++i) { 102 String col_name = (String ) col_list.get(i); 103 new_column_vars[i] = new Variable(vname, col_name); 104 } 105 } 106 else { 107 sz = original_vars.length; 108 for (int i = 0; i < sz; ++i) { 109 new_column_vars[i] = new Variable(vname, original_vars[i].getName()); 110 } 111 } 112 113 for (int i = 0; i < sz; ++i) { 115 Variable cur_v = new_column_vars[i]; 116 for (int n = i + 1; n < sz; ++n) { 117 if (new_column_vars[n].equals(cur_v)) { 118 throw new DatabaseException( 119 "Duplicate column name '" + cur_v + "' in view. " + 120 "A view may not contain duplicate column names."); 121 } 122 } 123 } 124 125 plan = new QueryPlan.SubsetNode(plan, original_vars, new_column_vars); 127 128 } 129 130 } 131 132 public Table evaluate() throws DatabaseException { 133 134 DatabaseQueryContext context = new DatabaseQueryContext(database); 135 136 if (type.equals("create")) { 137 if (!database.getDatabase().canUserCreateTableObject(context, 139 user, vname)) { 140 throw new UserAccessException( 141 "User not permitted to create view: " + view_name); 142 } 143 144 boolean ignore_case = database.isInCaseInsensitiveMode(); 146 SchemaDef schema = 147 database.resolveSchemaCase(vname.getSchema(), ignore_case); 148 if (schema == null) { 149 throw new DatabaseException("Schema '" + vname.getSchema() + 150 "' doesn't exist."); 151 } 152 else { 153 vname = new TableName(schema.getName(), vname.getName()); 154 } 155 156 Select.checkUserSelectPermissions(context, user, plan); 159 160 if (database.tableExists(vname)) { 162 throw new DatabaseException("View or table with name '" + vname + 163 "' already exists."); 164 } 165 166 QueryPlanNode plan_copy; 168 try { 169 plan_copy = (QueryPlanNode) plan.clone(); 170 } 171 catch (CloneNotSupportedException e) { 172 Debug().writeException(e); 173 throw new DatabaseException("Clone error: " + e.getMessage()); 174 } 175 176 Table t = plan.evaluate(context); 179 DataTableDef data_table_def = new DataTableDef(t.getDataTableDef()); 180 data_table_def.setTableName(vname); 181 182 ViewDef view_def = new ViewDef(data_table_def, plan_copy); 184 185 database.createView(query, view_def); 187 188 database.getGrantManager().addGrant( 191 Privileges.TABLE_ALL_PRIVS, GrantManager.TABLE, vname.toString(), 192 user.getUserName(), true, Database.INTERNAL_SECURE_USERNAME); 193 194 } 195 else if (type.equals("drop")) { 196 197 if (!database.getDatabase().canUserDropTableObject(context, 199 user, vname)) { 200 throw new UserAccessException( 201 "User not permitted to drop view: " + view_name); 202 } 203 204 database.dropView(vname); 206 207 database.getGrantManager().revokeAllGrantsOnObject( 209 GrantManager.TABLE, vname.toString()); 210 211 } 212 else { 213 throw new Error ("Unknown view command type: " + type); 214 } 215 216 return FunctionTable.resultTable(context, 0); 217 } 218 219 220 } 221 222 | Popular Tags |