blob: 426e27b94831725e4d304fbc23424c41086178aa [file] [log] [blame]
/*
* Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.internal.expressions;
import java.io.*;
import java.util.HashSet;
import java.util.Collection;
import org.eclipse.persistence.queries.ObjectBuildingQuery;
/**
* <b>Purpose:</b>Represents The FOR UPDATE pessimistically locking clause.
* @author Stephen McRitchie
* @since Oracle Toplink 10g AS
*/
public class ForUpdateClause implements Serializable, Cloneable {
protected static final ForUpdateClause NO_LOCK_CLAUSE = new ForUpdateClause();
short lockMode;
Integer waitTimeout;
public ForUpdateClause() {
this.lockMode = ObjectBuildingQuery.NO_LOCK;
}
public ForUpdateClause(short lockMode) {
this.lockMode = lockMode;
}
public ForUpdateClause(Integer waitTimeout) {
this.lockMode = ObjectBuildingQuery.LOCK;
this.waitTimeout = waitTimeout;
}
@Override
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException never) {
return null;
}
}
public static ForUpdateClause newInstance(short lockMode) {
if (lockMode == ObjectBuildingQuery.NO_LOCK) {
return NO_LOCK_CLAUSE;
} else {
return new ForUpdateClause(lockMode);
}
}
public static ForUpdateClause newInstance(Integer waitTimeout) {
return new ForUpdateClause(waitTimeout);
}
public boolean isForUpdateOfClause() {
return false;
}
public boolean isReferenceClassLocked() {
return true;
}
public short getLockMode() {
return lockMode;
}
public Integer getWaitTimeout() {
return waitTimeout;
}
/**
* INTERNAL:
* Prints the as of clause for an expression inside of the FROM clause.
*/
public void printSQL(ExpressionSQLPrinter printer, SQLSelectStatement statement) {
// Append lock strings
if (getLockMode() == ObjectBuildingQuery.LOCK) {
if (waitTimeout == null) {
printer.printString(printer.getPlatform().getSelectForUpdateString());
} else {
printer.printString(printer.getPlatform().getSelectForUpdateWaitString(waitTimeout));
}
} else if (lockMode == ObjectBuildingQuery.LOCK_NOWAIT) {
printer.printString(printer.getPlatform().getSelectForUpdateNoWaitString());
}
}
/**
* INTERNAL:
* Returns collection of aliases of the tables to be locked.
* Only used by platforms that lock tables individually in FROM clause
* (platform.shouldPrintLockingClauseAfterWhereClause()==false)
* like SQLServer
*/
public Collection getAliasesOfTablesToBeLocked(SQLSelectStatement statement) {
return new HashSet(statement.getTableAliases().keySet());
}
}