blob: 570b25c03d5cc727cc54e50d51780c053e7575d3 [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.queries;
import org.eclipse.persistence.exceptions.*;
import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
/**
* <p><b>Purpose</b>:
* Concrete class used for executing non selecting SQL strings.
*
* <p><b>Responsibilities</b>:
* <ul>
* <li> Execute a non selecting raw SQL string.
* </ul>
*
* @author Yvon Lavoie
* @since TOPLink/Java 1.0
*/
public class DataModifyQuery extends ModifyQuery {
/** Used to distinguish query that have a different modify row than translation row. */
protected boolean hasModifyRow;
public DataModifyQuery() {
super();
}
/**
* Warning: Allowing an unverified SQL string to be passed into this
* method makes your application vulnerable to SQL injection attacks.
*/
public DataModifyQuery(String sqlString) {
this();
setSQLString(sqlString);
}
public DataModifyQuery(Call call) {
this();
setCall(call);
}
/**
* Return if a modify row has been set.
* Allows distinguishing query that have a different modify row than translation row.
*/
public boolean hasModifyRow() {
return hasModifyRow;
}
/**
* Set if a modify row has been set.
* Allows distinguishing query that have a different modify row than translation row.
*/
public void setHasModifyRow(boolean hasModifyRow) {
this.hasModifyRow = hasModifyRow;
}
/**
* INTERNAL:
* Perform the work to execute the SQL call.
* Return the row count of the number of rows effected by the SQL call.
*/
@Override
public Object executeDatabaseQuery() throws DatabaseException {
/* Fix to allow executing non-selecting SQL in a UnitOfWork. - RB */
if (this.session.isUnitOfWork()) {
UnitOfWorkImpl unitOfWork = (UnitOfWorkImpl)this.session;
/* bug:4211104 for DataModifyQueries executed during an event, while transaction was started by the uow*/
if (!unitOfWork.getCommitManager().isActive() && !unitOfWork.isInTransaction()) {
unitOfWork.beginEarlyTransaction();
}
unitOfWork.setWasNonObjectLevelModifyQueryExecuted(true);
}
return getQueryMechanism().executeNoSelect();
}
/**
* PUBLIC:
* Return if this is a data modify query.
*/
@Override
public boolean isDataModifyQuery() {
return true;
}
/**
* INTERNAL:
* Prepare the receiver for execution in a session.
*/
@Override
protected void prepare() {
super.prepare();
getQueryMechanism().prepareExecuteNoSelect();
}
/**
* INTERNAL:
* Prepare the receiver for execution in a session. In particular,
* set the descriptor of the receiver to the ClassDescriptor for the
* appropriate class for the receiver's object.
*/
@Override
public void prepareForExecution() throws QueryException {
super.prepareForExecution();
// Only replace the modify row if unset.
if (!this.hasModifyRow) {
this.modifyRow = this.translationRow;
}
}
}