Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: org/apache/derby/impl/sql/execute/DropSchemaConstantAction.java


1   /*
2   
3      Derby - Class org.apache.derby.impl.sql.execute.DropSchemaConstantAction
4   
5      Copyright 1998, 2004 The Apache Software Foundation or its licensors, as applicable.
6   
7      Licensed under the Apache License, Version 2.0 (the "License");
8      you may not use this file except in compliance with the License.
9      You may obtain a copy of the License at
10  
11        http://www.apache.org/licenses/LICENSE-2.0
12  
13     Unless required by applicable law or agreed to in writing, software
14     distributed under the License is distributed on an "AS IS" BASIS,
15     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16     See the License for the specific language governing permissions and
17     limitations under the License.
18  
19   */
20  
21  package org.apache.derby.impl.sql.execute;
22  
23  import org.apache.derby.iapi.services.sanity.SanityManager;
24  import org.apache.derby.iapi.error.StandardException;
25  import org.apache.derby.iapi.sql.dictionary.ColumnDescriptor;
26  import org.apache.derby.iapi.sql.dictionary.ConglomerateDescriptor;
27  import org.apache.derby.iapi.sql.dictionary.DataDescriptorGenerator;
28  import org.apache.derby.iapi.sql.dictionary.DataDictionary;
29  import org.apache.derby.iapi.sql.dictionary.SchemaDescriptor;
30  
31  import org.apache.derby.iapi.sql.depend.DependencyManager;
32  import org.apache.derby.iapi.sql.conn.LanguageConnectionContext;
33  import org.apache.derby.iapi.store.access.TransactionController;
34  
35  import org.apache.derby.iapi.reference.SQLState;
36  
37  import org.apache.derby.iapi.sql.execute.ConstantAction;
38  
39  import org.apache.derby.iapi.sql.Activation;
40  
41  import org.apache.derby.catalog.UUID;
42  
43  /**
44   *  This class  describes actions that are ALWAYS performed for a
45   *  DROP SCHEMA Statement at Execution time.
46   *
47   *  @author jamie
48   */
49  
50  class DropSchemaConstantAction extends DDLConstantAction
51  {
52  
53  
54    private final String        schemaName;
55  
56  
57    // CONSTRUCTORS
58  
59    /**
60     *  Make the ConstantAction for a DROP TABLE statement.
61     *
62     *  @param  schemaName      Table name.
63     *
64     */
65    DropSchemaConstantAction(String  schemaName)
66    {
67      this.schemaName = schemaName;
68    }
69  
70    ///////////////////////////////////////////////
71    //
72    // OBJECT SHADOWS
73    //
74    ///////////////////////////////////////////////
75  
76    public  String  toString()
77    {
78      // Do not put this under SanityManager.DEBUG - it is needed for
79      // error reporting.
80      return "DROP SCHEMA " + schemaName;
81    }
82  
83    // INTERFACE METHODS
84  
85  
86    /**
87     *  This is the guts of the Execution-time logic for DROP TABLE.
88     *
89     *  @see ConstantAction#executeConstantAction
90     *
91     * @exception StandardException    Thrown on failure
92     */
93    public void  executeConstantAction( Activation activation )
94              throws StandardException
95    {
96      SchemaDescriptor  sd;
97  
98      LanguageConnectionContext lcc = activation.getLanguageConnectionContext();
99      DataDictionary dd = lcc.getDataDictionary();
100     DependencyManager dm = dd.getDependencyManager();
101     TransactionController tc = lcc.getTransactionExecute();
102 
103     /*
104     ** Inform the data dictionary that we are about to write to it.
105     ** There are several calls to data dictionary "get" methods here
106     ** that might be done in "read" mode in the data dictionary, but
107     ** it seemed safer to do this whole operation in "write" mode.
108     **
109     ** We tell the data dictionary we're done writing at the end of
110     ** the transaction.
111     */
112     dd.startWriting(lcc);
113 
114     sd = dd.getSchemaDescriptor(schemaName, null, true);
115 
116     //If user is attempting to drop SESSION schema and there is no physical SESSION schema, then throw an exception
117     //Need to handle it this special way is because SESSION schema is also used for temporary tables. If there is no
118     //physical SESSION schema, we internally generate an in-memory SESSION schema in order to support temporary tables
119     //But there is no way for the user to access that in-memory SESSION schema. Following if will be true if there is
120     //no physical SESSION schema and hence getSchemaDescriptor has returned an in-memory SESSION schema
121     if (schemaName.equals(SchemaDescriptor.STD_DECLARED_GLOBAL_TEMPORARY_TABLES_SCHEMA_NAME) && (sd != null) && (sd.getUUID() == null))
122       throw StandardException.newException(SQLState.LANG_SCHEMA_DOES_NOT_EXIST, schemaName);
123 
124     /*
125     ** Make sure the schema is empty.
126     ** In the future we want to drop everything
127     ** in the schema if it is CASCADE.
128     */
129     if (!dd.isSchemaEmpty(sd))
130     {
131       throw StandardException.newException(SQLState.LANG_SCHEMA_NOT_EMPTY, schemaName);
132     } 
133 
134     /* Prepare all dependents to invalidate.  (This is there chance
135      * to say that they can't be invalidated.  For example, an open
136      * cursor referencing a table/view that the user is attempting to
137      * drop.) If no one objects, then invalidate any dependent objects.
138      * We check for invalidation before we drop the table descriptor
139      * since the table descriptor may be looked up as part of
140      * decoding tuples in SYSDEPENDS.
141      */
142     dm.invalidateFor(sd, DependencyManager.DROP_SCHEMA, lcc);
143 
144     dd.dropSchemaDescriptor(schemaName, tc);
145 
146     /*
147     ** If we have dropped the current default schema,
148     ** then we will set the default to null.  The
149     ** LCC is free to set the new default schema to 
150      ** some system defined default.
151     */
152     sd = lcc.getDefaultSchema();
153     if ((sd != null) &&
154       schemaName.equals(sd.getSchemaName()))
155     {
156       lcc.setDefaultSchema((SchemaDescriptor)null);
157     }
158 
159   }
160 
161 }