blob: b5afd08b048aa39e76194f1c3651bb747a9c2eac [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 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.testing.tests.feature;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.persistence.descriptors.DescriptorQueryManager;
import org.eclipse.persistence.exceptions.DatabaseException;
import org.eclipse.persistence.queries.InsertObjectQuery;
import org.eclipse.persistence.sessions.UnitOfWork;
import org.eclipse.persistence.testing.models.employee.domain.Address;
import org.eclipse.persistence.testing.models.employee.domain.Employee;
/**
* Bug 214910: Add query timeout support to batched update queries (Oracle DB 9.0.1+)<br>
* Test the query timeout feature in batch queries.
* For data queries , a queryTimeout on the largest DatabaseQuery of the batch will be used.
* For object queries, a queryTimeout on the largest DescriptorQueryManager (parent) or DatabaseQuery
* of the batch will be used.
*/
public abstract class QueryTimeoutBatchDescriptorQueryManagerTest extends QueryTimeoutBatchTestCase {
@Override
protected int getParentQueryTimeout() { return 2; }
@Override
protected int getChildQueryTimeout() { return -1; }
@Override
protected String getQuerySQLPostfix() {
return ", SUM(e.address_id) as version from address e, address b, address b, address c, address c, address c, address b";
}
/**
* Test that the queryTimeout passed by the client to the QueryManager is
* picked up by the BatchWritingMechanism and set on the Statement.
*/
@Override
public void test() {
UnitOfWork uow = null;
try {
uow = setupPlatform();
initializeDatabase(uow);
// Get new UOW
uow = getSession().acquireUnitOfWork();
registerObjects(uow);
verifyBefore(uow);
uow.commit();
} catch (Exception e) {
/** Throws
* Internal Exception: java.sql.SQLException: ORA-01013: user requested cancel of current operation
*/
//e.printStackTrace();
//System.err.print(e.getMessage());
if (e instanceof DatabaseException) {
limitExceeded = true;
vendorErrorCodeEncountered = ((DatabaseException)e).getDatabaseErrorCode();
}
// Release transaction mutex
//((AbstractSession)uow).rollbackTransaction();
} finally {
resetPlatform();
}
}
/**
* Iterate and register a number of objects in the unitOfWork
*/
@Override
protected List<Employee> registerObjects(UnitOfWork uow) {
List<Employee> objectListForEditing = new ArrayList<Employee>();
Address address = null;
Employee employee = null;
for (int i = 0; i < getNumberOfInserts(); i++) {
address = new Address();
address.setCity(new StringBuffer("city").append(i).toString());
address.setProvince(new StringBuffer("province").append(i).toString());
employee = new Employee();
employee.setFirstName(new StringBuffer("first").append(i).toString());
employee.setLastName(new StringBuffer("last").append(i).toString());
//employee.setId(new java.math.BigDecimal(i));
employee.setAddress(address);
uow.registerObject(employee);
// Use the return clone for editing
objectListForEditing.add(employee);
// Test framework callback
// Set the timeout at the descriptor level for each object
setDescriptorLevelQueryTimeout(uow.getDescriptor(employee).getDescriptorQueryManager());
setDescriptorLevelQueryTimeout(uow.getDescriptor(address).getDescriptorQueryManager());
// Test framework callback
// Set the timeout on each query object (already defined)
setQueryLevelQueryTimeout(uow, employee);
setQueryLevelQueryTimeout(uow, address);
// Add custom insertQuery
InsertObjectQuery query = new InsertObjectQuery();
//queryCount++;
// insert into employee (emp_id, version) SELECT 40003, SUM(e.address_id) as version from address e, address b, address b, address c, address c;
StringBuffer sBuffer = new StringBuffer(getQuerySQLPrefix());
sBuffer.append(getCurrentIDSequence() + i);
//sBuffer.append(i);
sBuffer.append(getQuerySQLPostfix());
query.setSQLString(sBuffer.toString());
// Override parent
query.setQueryTimeout(getChildQueryTimeout());
// We don't set the f_name parameter so Ignore: WARNING: Missing Query parameter for named argument: 1 null will be substituted.
uow.getDescriptor(employee).getDescriptorQueryManager().setInsertQuery(query);
}
return objectListForEditing;
}
/**
* This is a callback from the object loop in registerObjects that allows the test
* to set a timeout globally on the DescriptorQueryManager
*/
@Override
public void setDescriptorLevelQueryTimeout(DescriptorQueryManager queryManager) {
// Set timeout globally on the root object using the last call appended
queryManager.setQueryTimeout(getParentQueryTimeout());
}
/**
* This is a callback from the object loop in registerObjects that allows the test
* to set a timeout on individual queries
*/
@Override
public void setQueryLevelQueryTimeout(UnitOfWork uow, Object object) {
}
}