blob: 33af2bf2cafb06dbf935fa98e37563c81beeefd6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2013 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 v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.testing.tests.customsqlstoredprocedures;
import java.util.Vector;
import java.math.BigDecimal;
import org.eclipse.persistence.internal.databaseaccess.DatabaseCall;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.employee.domain.Employee;
public class StoredProcWithOutputParamsAndResultSetTest extends TestCase {
boolean useCustomSQL;
boolean shouldBindAllParameters;
boolean shouldBindAllParametersOriginal;
public StoredProcWithOutputParamsAndResultSetTest(boolean useCustomSQL, boolean shouldBindAllParameters) {
super();
this.useCustomSQL = useCustomSQL;
this.shouldBindAllParameters = shouldBindAllParameters;
if (useCustomSQL) {
setName(getName() + " customSQL");
} else {
setName(getName() + " storedProc");
}
if (shouldBindAllParameters) {
setName(getName() + " Bind");
} else {
setName(getName() + " don'tBind");
}
}
public void setup() {
shouldBindAllParametersOriginal = getSession().getLogin().getShouldBindAllParameters();
//right now only the stored procedure is set up in SQLServer
if (!(getSession().getPlatform().isSQLServer() || getSession().getPlatform().isSybase() || getSession().getPlatform().isSQLAnywhere())) {
throw new TestWarningException("This test can only be run in SQLServer. Or Sybase or SQLAnywhere");
}
getSession().getLogin().setShouldBindAllParameters(shouldBindAllParameters);
}
public void test() {
ReadAllQuery readQuery = new ReadAllQuery(Employee.class);
DatabaseCall call;
SQLCall sqlCall;
StoredProcedureCall spCall;
// sybase can not do out params only
boolean useInOut = getSession().getPlatform().isSybase() || getSession().getPlatform().isSQLAnywhere();
if (useCustomSQL) {
String prefix;
if (useInOut) {
prefix = "####";
} else {
prefix = "###";
}
String parameterNamePrefix = getSession().getPlatform().getStoredProcedureParameterPrefix();
sqlCall = new SQLCall("EXECUTE Select_Output_and_ResultSet " + parameterNamePrefix + "ARG1 = #argument, " +
parameterNamePrefix + "VERSION = " + prefix + "version " + getSession().getPlatform().getOutputProcedureToken());
sqlCall.setCustomSQLArgumentType("version", BigDecimal.class);
call = sqlCall;
} else {
spCall = new StoredProcedureCall();
spCall.setProcedureName("Select_Output_and_ResultSet");
spCall.addNamedArgument("ARG1", "argument");
if (useInOut) {
spCall.addNamedInOutputArgumentValue("VERSION", new Long(0), "VERSION", java.math.BigDecimal.class);
} else {
spCall.addNamedOutputArgument("VERSION", "VERSION", BigDecimal.class);
}
call = spCall;
}
call.setReturnsResultSet(true);
readQuery.setCall(call);
readQuery.addArgument("argument");
if (useCustomSQL && useInOut) {
readQuery.addArgument("version");
}
getSession().removeQuery("dblogin");
getSession().addQuery("dblogin", readQuery);
Vector args = new Vector(2);
args.addElement(new Integer(1));
if (useCustomSQL && useInOut) {
args.addElement(new Long(0));
}
try {
Vector vResult = (Vector)getSession().executeQuery("dblogin", args);
} catch (ClassCastException e) {
throw new TestErrorException("Stored Procedure is returning a Row and the query expects a Vector");
}
readQuery = new ReadAllQuery(Employee.class);
if (useCustomSQL) {
return;
} else {
spCall = new StoredProcedureCall();
spCall.setProcedureName("Select_Output_and_ResultSet");
spCall.addNamedArgumentValue("ARG1", new Integer(1));
if (useInOut) {
spCall.addNamedInOutputArgumentValue("VERSION", new Long(0), "VERSION", java.math.BigDecimal.class);
} else {
spCall.addNamedOutputArgument("VERSION", "VERSION", BigDecimal.class);
}
call = spCall;
}
call.setReturnsResultSet(true);
readQuery.setCall(call);
try {
Vector vResult = (Vector)getSession().executeQuery(readQuery);
} catch (ClassCastException e) {
throw new TestErrorException("Stored Procedure is returning a Row and the query expects a Vector");
}
}
public void reset() {
getSession().getLogin().setShouldBindAllParameters(shouldBindAllParametersOriginal);
}
}