001: /*
002:
003: Derby - Class org.apache.derby.impl.sql.execute.LockTableConstantAction
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:
026: import org.apache.derby.iapi.sql.execute.ConstantAction;
027:
028: import org.apache.derby.iapi.reference.SQLState;
029:
030: import org.apache.derby.iapi.sql.Activation;
031:
032: import org.apache.derby.iapi.error.StandardException;
033:
034: import org.apache.derby.iapi.store.access.ConglomerateController;
035: import org.apache.derby.iapi.store.access.TransactionController;
036:
037: import org.apache.derby.catalog.UUID;
038:
039: /**
040: * This class describes actions that are ALWAYS performed for a
041: * LOCK TABLE Statement at Execution time.
042: *
043: * @author jamie
044: */
045:
046: class LockTableConstantAction extends GenericConstantAction {
047:
048: private final String fullTableName;
049: private final long conglomerateNumber;
050: private final boolean exclusiveMode;
051:
052: // CONSTRUCTORS
053:
054: /**
055: * Make the ConstantAction for a LOCK TABLE statement.
056: *
057: * @param fullTableName Full name of the table.
058: * @param conglomerateNumber Conglomerate number for the heap
059: * @param exclusiveMode Whether or not to get an exclusive lock.
060: */
061: LockTableConstantAction(String fullTableName,
062: long conglomerateNumber, boolean exclusiveMode) {
063: this .fullTableName = fullTableName;
064: this .conglomerateNumber = conglomerateNumber;
065: this .exclusiveMode = exclusiveMode;
066: }
067:
068: // OBJECT METHODS
069:
070: public String toString() {
071: // Do not put this under SanityManager.DEBUG - it is needed for
072: // error reporting.
073: return "LOCK TABLE " + fullTableName;
074: }
075:
076: // INTERFACE METHODS
077:
078: /**
079: * This is the guts of the Execution-time logic for LOCK TABLE.
080: *
081: * @see ConstantAction#executeConstantAction
082: *
083: * @exception StandardException Thrown on failure
084: */
085: public void executeConstantAction(Activation activation)
086: throws StandardException {
087: ConglomerateController cc;
088: TransactionController tc;
089:
090: /* Get a ConglomerateController for the base conglomerate */
091: tc = activation.getTransactionController();
092:
093: try {
094: cc = tc
095: .openConglomerate(
096: conglomerateNumber,
097: false,
098: (exclusiveMode) ? (TransactionController.OPENMODE_FORUPDATE | TransactionController.OPENMODE_FOR_LOCK_ONLY)
099: : TransactionController.OPENMODE_FOR_LOCK_ONLY,
100: TransactionController.MODE_TABLE,
101: TransactionController.ISOLATION_SERIALIZABLE);
102: cc.close();
103: } catch (StandardException se) {
104: String msgId = se.getMessageId();
105: if (msgId.equals(SQLState.DEADLOCK)
106: || msgId.equals(SQLState.LOCK_TIMEOUT)
107: || msgId.equals(SQLState.LOCK_TIMEOUT_LOG)) {
108: String mode = (exclusiveMode) ? "EXCLUSIVE" : "SHARE";
109: se = StandardException.newException(
110: SQLState.LANG_CANT_LOCK_TABLE, se,
111: fullTableName, mode);
112: }
113:
114: throw se;
115: }
116: }
117: }
|