001: /*
002:
003: Derby - Class org.apache.derby.impl.sql.execute.DropSchemaConstantAction
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to you under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021:
022: package org.apache.derby.impl.sql.execute;
023:
024: import org.apache.derby.iapi.services.sanity.SanityManager;
025: import org.apache.derby.iapi.error.StandardException;
026: import org.apache.derby.iapi.sql.dictionary.ConglomerateDescriptor;
027: import org.apache.derby.iapi.sql.dictionary.DataDescriptorGenerator;
028: import org.apache.derby.iapi.sql.dictionary.DataDictionary;
029: import org.apache.derby.iapi.sql.dictionary.SchemaDescriptor;
030:
031: import org.apache.derby.iapi.sql.depend.DependencyManager;
032: import org.apache.derby.iapi.sql.conn.LanguageConnectionContext;
033: import org.apache.derby.iapi.store.access.TransactionController;
034:
035: import org.apache.derby.iapi.reference.SQLState;
036:
037: import org.apache.derby.iapi.sql.execute.ConstantAction;
038:
039: import org.apache.derby.iapi.sql.Activation;
040:
041: import org.apache.derby.catalog.UUID;
042:
043: /**
044: * This class describes actions that are ALWAYS performed for a
045: * DROP SCHEMA Statement at Execution time.
046: *
047: * @author jamie
048: */
049:
050: class DropSchemaConstantAction extends DDLConstantAction {
051:
052: private final String schemaName;
053:
054: // CONSTRUCTORS
055:
056: /**
057: * Make the ConstantAction for a DROP TABLE statement.
058: *
059: * @param schemaName Table name.
060: *
061: */
062: DropSchemaConstantAction(String schemaName) {
063: this .schemaName = schemaName;
064: }
065:
066: ///////////////////////////////////////////////
067: //
068: // OBJECT SHADOWS
069: //
070: ///////////////////////////////////////////////
071:
072: public String toString() {
073: // Do not put this under SanityManager.DEBUG - it is needed for
074: // error reporting.
075: return "DROP SCHEMA " + schemaName;
076: }
077:
078: // INTERFACE METHODS
079:
080: /**
081: * This is the guts of the Execution-time logic for DROP TABLE.
082: *
083: * @see ConstantAction#executeConstantAction
084: *
085: * @exception StandardException Thrown on failure
086: */
087: public void executeConstantAction(Activation activation)
088: throws StandardException {
089: SchemaDescriptor sd;
090:
091: LanguageConnectionContext lcc = activation
092: .getLanguageConnectionContext();
093: DataDictionary dd = lcc.getDataDictionary();
094: DependencyManager dm = dd.getDependencyManager();
095: TransactionController tc = lcc.getTransactionExecute();
096:
097: /*
098: ** Inform the data dictionary that we are about to write to it.
099: ** There are several calls to data dictionary "get" methods here
100: ** that might be done in "read" mode in the data dictionary, but
101: ** it seemed safer to do this whole operation in "write" mode.
102: **
103: ** We tell the data dictionary we're done writing at the end of
104: ** the transaction.
105: */
106: dd.startWriting(lcc);
107:
108: sd = dd.getSchemaDescriptor(schemaName, null, true);
109:
110: //If user is attempting to drop SESSION schema and there is no physical SESSION schema, then throw an exception
111: //Need to handle it this special way is because SESSION schema is also used for temporary tables. If there is no
112: //physical SESSION schema, we internally generate an in-memory SESSION schema in order to support temporary tables
113: //But there is no way for the user to access that in-memory SESSION schema. Following if will be true if there is
114: //no physical SESSION schema and hence getSchemaDescriptor has returned an in-memory SESSION schema
115: if (schemaName
116: .equals(SchemaDescriptor.STD_DECLARED_GLOBAL_TEMPORARY_TABLES_SCHEMA_NAME)
117: && (sd != null) && (sd.getUUID() == null))
118: throw StandardException.newException(
119: SQLState.LANG_SCHEMA_DOES_NOT_EXIST, schemaName);
120:
121: /*
122: ** Make sure the schema is empty.
123: ** In the future we want to drop everything
124: ** in the schema if it is CASCADE.
125: */
126: if (!dd.isSchemaEmpty(sd)) {
127: throw StandardException.newException(
128: SQLState.LANG_SCHEMA_NOT_EMPTY, schemaName);
129: }
130:
131: /* Prepare all dependents to invalidate. (This is there chance
132: * to say that they can't be invalidated. For example, an open
133: * cursor referencing a table/view that the user is attempting to
134: * drop.) If no one objects, then invalidate any dependent objects.
135: * We check for invalidation before we drop the table descriptor
136: * since the table descriptor may be looked up as part of
137: * decoding tuples in SYSDEPENDS.
138: */
139: dm.invalidateFor(sd, DependencyManager.DROP_SCHEMA, lcc);
140:
141: dd.dropSchemaDescriptor(schemaName, tc);
142:
143: /*
144: ** If we have dropped the current default schema,
145: ** then we will set the default to null. The
146: ** LCC is free to set the new default schema to
147: ** some system defined default.
148: */
149: sd = lcc.getDefaultSchema();
150: if ((sd != null) && schemaName.equals(sd.getSchemaName())) {
151: lcc.setDefaultSchema((SchemaDescriptor) null);
152: }
153:
154: }
155:
156: }
|