001: /*
002:
003: Derby - Class org.apache.derby.impl.sql.compile.LockTableNode
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.compile;
023:
024: import org.apache.derby.iapi.services.context.ContextManager;
025:
026: import org.apache.derby.iapi.services.compiler.MethodBuilder;
027:
028: import org.apache.derby.iapi.services.sanity.SanityManager;
029:
030: import org.apache.derby.iapi.error.StandardException;
031:
032: import org.apache.derby.iapi.sql.compile.CompilerContext;
033:
034: import org.apache.derby.iapi.sql.conn.Authorizer;
035:
036: import org.apache.derby.iapi.sql.dictionary.ConglomerateDescriptor;
037: import org.apache.derby.iapi.sql.dictionary.DataDictionary;
038: import org.apache.derby.iapi.sql.dictionary.DataDictionaryContext;
039: import org.apache.derby.iapi.sql.dictionary.SchemaDescriptor;
040: import org.apache.derby.iapi.sql.dictionary.TableDescriptor;
041:
042: import org.apache.derby.iapi.reference.SQLState;
043:
044: import org.apache.derby.iapi.sql.execute.ConstantAction;
045:
046: import org.apache.derby.iapi.sql.Activation;
047: import org.apache.derby.iapi.sql.ResultSet;
048: import org.apache.derby.iapi.reference.ClassName;
049:
050: import org.apache.derby.impl.sql.compile.ActivationClassBuilder;
051: import org.apache.derby.iapi.services.classfile.VMOpcode;
052:
053: /**
054: * A LockTableNode is the root of a QueryTree that represents a LOCK TABLE command:
055: * LOCK TABLE <TableName> IN SHARE/EXCLUSIVE MODE
056: *
057: * @author Jerry Brenner
058: */
059:
060: public class LockTableNode extends MiscellaneousStatementNode {
061: private TableName tableName;
062: private boolean exclusiveMode;
063: private long conglomerateNumber;
064: private TableDescriptor lockTableDescriptor;
065:
066: /**
067: * Initializer for LockTableNode
068: *
069: * @param tableName The table to lock
070: * @param exclusiveMode boolean, whether or not to get an exclusive lock.
071: */
072: public void init(Object tableName, Object exclusiveMode) {
073: this .tableName = (TableName) tableName;
074: this .exclusiveMode = ((Boolean) exclusiveMode).booleanValue();
075: }
076:
077: /**
078: * Convert this object to a String. See comments in QueryTreeNode.java
079: * for how this should be done for tree printing.
080: *
081: * @return This object as a String
082: */
083:
084: public String toString() {
085: if (SanityManager.DEBUG) {
086: return "tableName: " + tableName + "\n" + "exclusiveMode: "
087: + exclusiveMode + "\n" + "conglomerateNumber: "
088: + conglomerateNumber + "\n" + super .toString();
089: } else {
090: return "";
091: }
092: }
093:
094: public String statementToString() {
095: return "LOCK TABLE";
096: }
097:
098: /**
099: * Bind this LockTableNode. This means looking up the table,
100: * verifying it exists and getting the heap conglomerate number.
101: *
102: * @return The bound query tree
103: *
104: * @exception StandardException Thrown on error
105: */
106:
107: public QueryTreeNode bind() throws StandardException {
108: CompilerContext cc = getCompilerContext();
109: ConglomerateDescriptor cd;
110: DataDictionary dd = getDataDictionary();
111: SchemaDescriptor sd;
112:
113: String schemaName = tableName.getSchemaName();
114: sd = getSchemaDescriptor(schemaName);
115:
116: // Users are not allowed to lock system tables
117: if (sd.isSystemSchema()) {
118: throw StandardException.newException(
119: SQLState.LANG_NO_USER_DDL_IN_SYSTEM_SCHEMA,
120: statementToString(), schemaName);
121: }
122:
123: lockTableDescriptor = getTableDescriptor(tableName
124: .getTableName(), sd);
125:
126: if (lockTableDescriptor == null) {
127: // Check if the reference is for a synonym.
128: TableName synonymTab = resolveTableToSynonym(tableName);
129: if (synonymTab == null)
130: throw StandardException.newException(
131: SQLState.LANG_TABLE_NOT_FOUND, tableName);
132: tableName = synonymTab;
133: sd = getSchemaDescriptor(tableName.getSchemaName());
134:
135: lockTableDescriptor = getTableDescriptor(synonymTab
136: .getTableName(), sd);
137: if (lockTableDescriptor == null)
138: throw StandardException.newException(
139: SQLState.LANG_TABLE_NOT_FOUND, tableName);
140: }
141:
142: //throw an exception if user is attempting to lock a temporary table
143: if (lockTableDescriptor.getTableType() == TableDescriptor.GLOBAL_TEMPORARY_TABLE_TYPE) {
144: throw StandardException
145: .newException(SQLState.LANG_NOT_ALLOWED_FOR_DECLARED_GLOBAL_TEMP_TABLE);
146: }
147:
148: conglomerateNumber = lockTableDescriptor
149: .getHeapConglomerateId();
150:
151: /* Get the base conglomerate descriptor */
152: cd = lockTableDescriptor
153: .getConglomerateDescriptor(conglomerateNumber);
154:
155: /* Statement is dependent on the TableDescriptor and ConglomerateDescriptor */
156: cc.createDependency(lockTableDescriptor);
157: cc.createDependency(cd);
158:
159: if (isPrivilegeCollectionRequired()) {
160: // need SELECT privilege to perform lock table statement.
161: cc.pushCurrentPrivType(Authorizer.SELECT_PRIV);
162: cc.addRequiredTablePriv(lockTableDescriptor);
163: cc.popCurrentPrivType();
164: }
165:
166: return this ;
167: }
168:
169: /**
170: * Return true if the node references SESSION schema tables (temporary or permanent)
171: *
172: * @return true if references SESSION schema tables, else false
173: *
174: * @exception StandardException Thrown on error
175: */
176: public boolean referencesSessionSchema() throws StandardException {
177: //If lock table is on a SESSION schema table, then return true.
178: return isSessionSchema(lockTableDescriptor.getSchemaName());
179: }
180:
181: /**
182: * Create the Constant information that will drive the guts of Execution.
183: *
184: * @exception StandardException Thrown on failure
185: */
186: public ConstantAction makeConstantAction() throws StandardException {
187: return getGenericConstantActionFactory()
188: .getLockTableConstantAction(
189: tableName.getFullTableName(),
190: conglomerateNumber, exclusiveMode);
191: }
192: }
|