1 23 24 package org.continuent.sequoia.controller.requests; 25 26 import java.io.Serializable ; 27 import java.sql.SQLException ; 28 import java.util.SortedSet ; 29 import java.util.TreeSet ; 30 31 import org.continuent.sequoia.common.i18n.Translate; 32 import org.continuent.sequoia.controller.semantic.SemanticBehavior; 33 import org.continuent.sequoia.controller.sql.schema.DatabaseSchema; 34 import org.continuent.sequoia.controller.sql.schema.DatabaseTable; 35 36 47 public class DropRequest extends AbstractWriteRequest implements Serializable 48 { 49 private static final long serialVersionUID = 5702833689405251895L; 50 51 protected boolean altersAggregateList = true; 54 protected boolean altersDatabaseCatalog = true; 55 protected boolean altersDatabaseSchema = true; 56 protected boolean altersMetadataCache = true; 57 protected boolean altersQueryResultCache = true; 58 protected boolean altersSomething = true; 59 protected boolean altersStoredProcedureList = true; 60 protected boolean altersUserDefinedTypes = true; 61 protected boolean altersUsers = true; 62 63 67 protected SortedSet tablesToDrop = null; 68 69 84 public DropRequest(String sqlQuery, boolean escapeProcessing, int timeout, 85 String lineSeparator) 86 { 87 super(sqlQuery, escapeProcessing, timeout, lineSeparator, RequestType.DROP); 88 setMacrosAreProcessed(true); } 90 91 94 public boolean altersAggregateList() 95 { 96 return altersAggregateList; 97 } 98 99 102 public boolean altersDatabaseCatalog() 103 { 104 return altersDatabaseCatalog; 105 } 106 107 110 public boolean altersDatabaseSchema() 111 { 112 return altersDatabaseSchema; 113 } 114 115 118 public boolean altersMetadataCache() 119 { 120 return altersMetadataCache; 121 } 122 123 126 public boolean altersQueryResultCache() 127 { 128 return altersQueryResultCache; 129 } 130 131 134 public boolean altersSomething() 135 { 136 return altersSomething; 137 } 138 139 142 public boolean altersStoredProcedureList() 143 { 144 return altersStoredProcedureList; 145 } 146 147 150 public boolean altersUserDefinedTypes() 151 { 152 return altersUserDefinedTypes; 153 } 154 155 158 public boolean altersUsers() 159 { 160 return altersUsers; 161 } 162 163 166 public void cloneParsing(AbstractRequest request) 167 { 168 if (!request.isParsed()) 169 return; 170 cloneParsingCommons(request); 171 cloneTableNameAndColumns((AbstractWriteRequest) request); 172 isParsed = true; 173 } 174 175 178 public boolean needsMacroProcessing() 179 { 180 return false; 181 } 182 183 187 public void parse(DatabaseSchema schema, int granularity, 188 boolean isCaseSensitive) throws SQLException 189 { 190 if (granularity == ParsingGranularities.NO_PARSING) 191 { 192 isParsed = true; 193 return; 194 } 195 196 try 197 { 198 String originalSQL = this.trimCarriageReturnAndTabs(); 199 String sql = originalSQL.toLowerCase(); 200 201 sql = sql.substring("drop".length()).trim(); 203 originalSQL = originalSQL.substring("drop".length()).trim(); 204 205 if (sql.startsWith("database")) 207 { altersDatabaseCatalog = true; 209 altersDatabaseSchema = false; 210 altersStoredProcedureList = false; 211 altersUserDefinedTypes = false; 212 altersUsers = false; 213 return; 214 } 215 216 if (sql.startsWith("index") || sql.startsWith("role") 217 || sql.startsWith("sequence")) 218 { altersSomething = false; 223 return; 224 } 225 if (sql.startsWith("function") || sql.startsWith("method") 226 || sql.startsWith("procedure") || sql.startsWith("trigger") 227 || sql.startsWith("type")) 228 { altersDatabaseCatalog = false; 231 altersDatabaseSchema = false; 232 altersStoredProcedureList = true; 233 altersUserDefinedTypes = true; 234 altersUsers = false; 235 return; 236 } 237 238 altersDatabaseCatalog = false; 240 altersDatabaseSchema = true; 241 altersStoredProcedureList = false; 242 altersUserDefinedTypes = false; 243 altersUsers = false; 244 if (sql.startsWith("schema") || sql.startsWith("view")) 245 return; 247 248 int tableIdx = sql.indexOf("table"); 250 if (tableIdx < 0) 251 throw new SQLException ("Unsupported DROP statement: '" 252 + sqlQueryOrTemplate + "'"); 253 254 if (isCaseSensitive) 255 sql = originalSQL.substring(tableIdx + 5).trim(); 256 else 257 sql = sql.substring(tableIdx + 5).trim(); 258 259 int endTableName = sql.indexOf(" "); 260 261 if (endTableName >= 0) 262 sql = sql.substring(0, endTableName).trim(); 263 264 if (schema == null) 265 tableName = sql; 266 else 267 { 268 DatabaseTable t = schema.getTable(sql, isCaseSensitive); 270 if (t == null) 271 throw new SQLException ("Unknown table '" + sql 272 + "' in this DROP statement '" + sqlQueryOrTemplate + "'", 273 "42P01"); 274 else 275 tableName = t.getName(); 276 } 277 writeLockedTables = new TreeSet (); 278 tablesToDrop = new TreeSet (); 279 writeLockedTables.add(tableName); 280 tablesToDrop.add(tableName); 281 addDependingTables(schema, writeLockedTables); 282 isParsed = true; 283 } 284 finally 285 { 286 if (isParsed) 287 { 288 setSemantic(new SemanticBehavior(null, writeLockedTables, null, 289 altersDatabaseSchema(), altersMetadataCache(), 290 altersQueryResultCache(), altersUsers(), isReadOnly, 291 needsMacroProcessing(), SemanticBehavior.SERIALIZABLE_ORDER, 292 requiresConnectionPoolFlush 293 ? SemanticBehavior.FLUSH_ALL_USERS 294 : SemanticBehavior.FLUSH_NONE)); 295 } 296 } 297 } 298 299 304 public boolean returnsResultSet() 305 { 306 return false; 307 } 308 309 312 public String getParsingResultsAsString() 313 { 314 StringBuffer sb = new StringBuffer (super.getParsingResultsAsString()); 315 sb.append(Translate.get("request.alters", 316 new String []{String.valueOf(altersAggregateList()), 317 String.valueOf(altersDatabaseCatalog()), 318 String.valueOf(altersDatabaseSchema()), 319 String.valueOf(altersMetadataCache()), 320 String.valueOf(altersQueryResultCache()), 321 String.valueOf(altersSomething()), 322 String.valueOf(altersStoredProcedureList()), 323 String.valueOf(altersUserDefinedTypes()), 324 String.valueOf(altersUsers())})); 325 return sb.toString(); 326 } 327 328 331 public void debug() 332 { 333 super.debug(); 334 if (tableName != null) 335 System.out.println("Dropped table '" + tableName + "'"); 336 else 337 System.out.println("No information about dropped table"); 338 339 System.out.println(); 340 } 341 342 349 public SortedSet getTablesToDrop() 350 { 351 return tablesToDrop; 352 } 353 } | Popular Tags |