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 Function extends Statement { 38 39 42 private String type; 43 44 47 private TableName fun_name; 48 49 51 public void prepare() throws DatabaseException { 52 type = (String ) cmd.getObject("type"); 53 String function_name = (String ) cmd.getObject("function_name"); 54 55 String schema_name = database.getCurrentSchema(); 57 fun_name = TableName.resolve(schema_name, function_name); 58 fun_name = database.tryResolveCase(fun_name); 59 60 } 61 62 public Table evaluate() throws DatabaseException { 63 64 DatabaseQueryContext context = new DatabaseQueryContext(database); 65 66 boolean ignore_case = database.isInCaseInsensitiveMode(); 68 SchemaDef schema = 69 database.resolveSchemaCase(fun_name.getSchema(), ignore_case); 70 if (schema == null) { 71 throw new DatabaseException("Schema '" + fun_name.getSchema() + 72 "' doesn't exist."); 73 } 74 else { 75 fun_name = new TableName(schema.getName(), fun_name.getName()); 76 } 77 78 if (type.equals("create")) { 79 80 if (!database.getDatabase().canUserCreateProcedureObject(context, 82 user, fun_name)) { 83 throw new UserAccessException( 84 "User not permitted to create function: " + fun_name); 85 } 86 87 if (database.tableExists(fun_name)) { 89 throw new DatabaseException("Database object with name '" + fun_name + 90 "' already exists."); 91 } 92 93 List arg_names = (List ) cmd.getObject("arg_names"); 95 List arg_types = (List ) cmd.getObject("arg_types"); 96 TObject loc_name = (TObject) cmd.getObject("location_name"); 97 TType return_type = (TType) cmd.getObject("return_type"); 98 99 101 102 TType[] arg_type_array = 104 (TType[]) arg_types.toArray(new TType[arg_types.size()]); 105 106 String java_specification = loc_name.getObject().toString(); 108 java.lang.reflect.Method proc_method = 110 ProcedureManager.javaProcedureMethod(java_specification, 111 arg_type_array); 112 if (proc_method == null) { 113 throw new DatabaseException("Unable to find invokation method for " + 114 "Java stored procedure name: " + java_specification); 115 } 116 117 ProcedureName proc_name = new ProcedureName(fun_name); 119 int sz = arg_types.size(); 120 TType[] arg_list = new TType[sz]; 121 for (int i = 0; i < sz; ++i) { 122 arg_list[i] = (TType) arg_types.get(i); 123 } 124 125 ProcedureManager manager = database.getProcedureManager(); 127 manager.defineJavaProcedure(proc_name, java_specification, 128 return_type, arg_list, user.getUserName()); 129 130 database.getGrantManager().addGrant( 133 Privileges.PROCEDURE_ALL_PRIVS, GrantManager.TABLE, 134 proc_name.toString(), user.getUserName(), true, 135 Database.INTERNAL_SECURE_USERNAME); 136 137 } 138 else if (type.equals("drop")) { 139 140 if (!database.getDatabase().canUserDropProcedureObject(context, 142 user, fun_name)) { 143 throw new UserAccessException( 144 "User not permitted to drop function: " + fun_name); 145 } 146 147 ProcedureName proc_name = new ProcedureName(fun_name); 149 ProcedureManager manager = database.getProcedureManager(); 150 manager.deleteProcedure(proc_name); 151 152 database.getGrantManager().revokeAllGrantsOnObject( 154 GrantManager.TABLE, proc_name.toString()); 155 156 } 157 else { 158 throw new RuntimeException ("Unknown type: " + type); 159 } 160 161 return FunctionTable.resultTable(context, 0); 163 164 } 165 166 } 167 168 | Popular Tags |