1 23 24 package org.continuent.sequoia.controller.requests; 25 26 import java.sql.SQLException ; 27 import java.util.ArrayList ; 28 import java.util.TreeSet ; 29 30 import org.continuent.sequoia.common.i18n.Translate; 31 import org.continuent.sequoia.controller.semantic.SemanticBehavior; 32 import org.continuent.sequoia.controller.sql.schema.DatabaseColumn; 33 import org.continuent.sequoia.controller.sql.schema.DatabaseSchema; 34 import org.continuent.sequoia.controller.sql.schema.DatabaseTable; 35 import org.continuent.sequoia.controller.sql.schema.TableColumn; 36 37 43 public class AlterRequest extends AbstractWriteRequest 44 { 45 private static final long serialVersionUID = 8386732943389593826L; 46 47 48 protected transient DatabaseTable table = null; 49 50 51 protected transient DatabaseColumn column = null; 52 53 protected transient boolean isDrop = false; 54 protected transient boolean isAdd = false; 55 56 protected boolean altersAggregateList = true; 59 protected boolean altersDatabaseCatalog = true; 60 protected boolean altersDatabaseSchema = true; 61 protected boolean altersMetadataCache = true; 62 protected boolean altersQueryResultCache = true; 63 protected boolean altersSomething = true; 64 protected boolean altersStoredProcedureList = true; 65 protected boolean altersUserDefinedTypes = true; 66 protected boolean altersUsers = true; 67 68 83 public AlterRequest(String sqlQuery, boolean escapeProcessing, int timeout, 84 String lineSeparator) 85 { 86 super(sqlQuery, escapeProcessing, timeout, lineSeparator, RequestType.ALTER); 87 setMacrosAreProcessed(true); } 89 90 93 public boolean altersAggregateList() 94 { 95 return altersAggregateList; 96 } 97 98 101 public boolean altersDatabaseCatalog() 102 { 103 return altersDatabaseCatalog; 104 } 105 106 109 public boolean altersDatabaseSchema() 110 { 111 return altersDatabaseSchema; 112 } 113 114 117 public boolean altersMetadataCache() 118 { 119 return altersMetadataCache; 120 } 121 122 125 public boolean altersQueryResultCache() 126 { 127 return altersQueryResultCache; 128 } 129 130 133 public boolean altersSomething() 134 { 135 return altersSomething; 136 } 137 138 141 public boolean altersStoredProcedureList() 142 { 143 return altersStoredProcedureList; 144 } 145 146 149 public boolean altersUserDefinedTypes() 150 { 151 return altersUserDefinedTypes; 152 } 153 154 157 public boolean altersUsers() 158 { 159 return altersUsers; 160 } 161 162 165 public void cloneParsing(AbstractRequest request) 166 { 167 if (!request.isParsed()) 168 return; 169 cloneParsingCommons(request); 170 AlterRequest alterRequest = (AlterRequest) request; 171 cloneTableNameAndColumns(alterRequest); 172 table = alterRequest.getDatabaseTable(); 173 column = alterRequest.getColumn(); 174 isParsed = true; 175 } 176 177 182 public DatabaseColumn getColumn() 183 { 184 return column; 185 } 186 187 192 public DatabaseTable getDatabaseTable() 193 { 194 return table; 195 } 196 197 202 public boolean isAdd() 203 { 204 return isAdd; 205 } 206 207 210 public boolean needsMacroProcessing() 211 { 212 return false; 213 } 214 215 219 public void parse(DatabaseSchema schema, int granularity, 220 boolean isCaseSensitive) throws SQLException 221 { 222 226 227 if (granularity == ParsingGranularities.NO_PARSING) 228 { 229 isParsed = true; 230 return; 231 } 232 233 String originalSQL = this.trimCarriageReturnAndTabs(); 234 String sql = originalSQL.toLowerCase(); 235 236 int tableIdx = sql.indexOf("table"); 238 if (tableIdx == -1) 239 throw new SQLException ( 240 "Malformed Alter Request. Should start with [ALTER TABLE]"); 241 sql = sql.substring(tableIdx + 5).trim(); 242 243 int index = 0; 244 int addIdx = sql.indexOf(" add "); 246 if (addIdx != -1) 247 { 248 isAdd = true; 249 index = addIdx; 250 } 251 else 252 { 253 int dropIdx = sql.indexOf(" drop "); 255 if (dropIdx != -1) 256 { 257 isDrop = true; 258 index = dropIdx; 259 } 260 } 261 262 if (isAdd || isDrop) 263 { if (isCaseSensitive) sql = originalSQL.substring(originalSQL.length() - sql.length()); 266 267 tableName = sql.substring(0, index).trim(); 268 table = new DatabaseTable(tableName); 269 writeLockedTables = new TreeSet (); 270 writeLockedTables.add(tableName); 271 addDependingTables(schema, writeLockedTables); 272 273 if ((schema != null) && (granularity > ParsingGranularities.TABLE)) 274 { 275 int subsIndex = index + 6 + 2; if (isAdd) 277 subsIndex += 3; 278 else 279 subsIndex += 4; 281 282 columns = new ArrayList (); 283 sql = sql.substring(subsIndex).trim(); 284 285 if (isAdd) 286 { 287 int colIndex = sql.indexOf(' '); 288 String colName = sql.substring(0, colIndex); 289 290 int uniqueIndex = sql.toLowerCase().indexOf("unique"); 291 int primary = sql.toLowerCase().indexOf("primary"); 292 if (uniqueIndex != -1 || primary != -1) 293 column = new DatabaseColumn(colName, true); 294 else 295 column = new DatabaseColumn(colName, false); 296 columns.add(new TableColumn(tableName, colName)); 297 } 298 else if (isDrop) 299 { 300 String colName = sql.trim(); 301 column = schema.getTable(tableName).getColumn(colName); 302 columns.add(new TableColumn(tableName, colName)); 303 } 304 } 305 } 306 setSemantic(new SemanticBehavior(null, writeLockedTables, null, 308 altersDatabaseSchema, altersMetadataCache, altersQueryResultCache, 309 altersUsers, isReadOnly, needsMacroProcessing(), 310 SemanticBehavior.SERIALIZABLE_ORDER, requiresConnectionPoolFlush 311 ? SemanticBehavior.FLUSH_ALL_USERS 312 : SemanticBehavior.FLUSH_NONE)); 313 isParsed = true; 314 } 315 316 321 public boolean returnsResultSet() 322 { 323 return false; 324 } 325 326 329 public String getParsingResultsAsString() 330 { 331 StringBuffer sb = new StringBuffer (super.getParsingResultsAsString()); 332 sb.append(Translate.get("request.alter.table", table)); 333 sb.append(Translate.get("request.alter.column", column)); 334 sb.append(Translate.get("request.alter.is.drop", isDrop)); 335 sb.append(Translate.get("request.alter.is.add", isAdd)); 336 sb.append(Translate.get("request.alters", 337 new String []{String.valueOf(altersAggregateList()), 338 String.valueOf(altersDatabaseCatalog()), 339 String.valueOf(altersDatabaseSchema()), 340 String.valueOf(altersMetadataCache()), 341 String.valueOf(altersQueryResultCache()), 342 String.valueOf(altersSomething()), 343 String.valueOf(altersStoredProcedureList()), 344 String.valueOf(altersUserDefinedTypes()), 345 String.valueOf(altersUsers())})); 346 347 return sb.toString(); 348 } 349 } | Popular Tags |