/*
* Copyright 1999-2017 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.druid.bvt.proxy;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import junit.framework.TestCase;
import org.junit.Assert;
import com.alibaba.druid.proxy.DruidDriver;
import com.alibaba.druid.stat.JdbcStatManager;
public class CallStatementTest extends TestCase {
/**
* Procedures that should be created before the tests are run and dropped when the tests have finished. First
* element in each row is the name of the procedure, second element is SQL which creates it.
*/
private static final String[] PROCEDURES = {
"CREATE PROCEDURE RETRIEVE_DYNAMIC_RESULTS(number INT) "
+ "LANGUAGE JAVA PARAMETER STYLE JAVA EXTERNAL NAME '" + CallStatementTest.class.getName()
+ ".retrieveDynamicResults' " + "DYNAMIC RESULT SETS 4",
"CREATE PROCEDURE RETRIEVE_CLOSED_RESULT() LANGUAGE JAVA " + "PARAMETER STYLE JAVA EXTERNAL NAME '"
+ CallStatementTest.class.getName() + ".retrieveClosedResult' " + "DYNAMIC RESULT SETS 1",
"CREATE PROCEDURE RETRIEVE_EXTERNAL_RESULT("
+ "DBNAME VARCHAR(128), DBUSER VARCHAR(128), DBPWD VARCHAR(128)) LANGUAGE JAVA "
+ "PARAMETER STYLE JAVA EXTERNAL NAME '" + CallStatementTest.class.getName()
+ ".retrieveExternalResult' " + "DYNAMIC RESULT SETS 1",
"CREATE PROCEDURE PROC_WITH_SIDE_EFFECTS(ret INT) LANGUAGE JAVA " + "PARAMETER STYLE JAVA EXTERNAL NAME '"
+ CallStatementTest.class.getName() + ".procWithSideEffects' " + "DYNAMIC RESULT SETS 2",
"CREATE PROCEDURE NESTED_RESULT_SETS(proctext VARCHAR(128)) LANGUAGE JAVA "
+ "PARAMETER STYLE JAVA EXTERNAL NAME '" + CallStatementTest.class.getName()
+ ".nestedDynamicResultSets' " + "DYNAMIC RESULT SETS 6"
};
private static String create_url = "jdbc:wrap-jdbc:filters=default,commonLogging,log4j:name=demo:jdbc:derby:memory:callableStatementDB;create=true";
protected void setUp() throws Exception {
Class.forName("com.alibaba.druid.proxy.DruidDriver");
Connection conn = DriverManager.getConnection(create_url);
createTable();
conn.close();
}
private void createTable() throws SQLException {
Connection conn = DriverManager.getConnection(create_url);
Statement stmt = conn.createStatement();
stmt.execute("CREATE TABLE T_CLOB (ID INTEGER, DATA CLOB)");
for (int i = 0; i < PROCEDURES.length; i++) {
stmt.execute(PROCEDURES[i]);
}
stmt.close();
conn.close();
}
private void dropTable() throws SQLException {
Connection conn = DriverManager.getConnection(create_url);
Statement stmt = conn.createStatement();
stmt.execute("DROP TABLE T_CLOB");
stmt.close();
conn.close();
}
protected void tearDown() throws Exception {
dropTable();
DruidDriver.getProxyDataSources().clear();
Assert.assertEquals(0, JdbcStatManager.getInstance().getSqlList().size());
}
public void test_precall() throws Exception {
f_testExecuteQueryWithNoDynamicResultSets();
f_testExecuteQueryWithNoDynamicResultSets_callable();
}
public void f_testExecuteQueryWithNoDynamicResultSets() throws SQLException {
Connection connect = DriverManager.getConnection(create_url);
Statement stmt = connect.createStatement();
SQLException error = null;
try {
stmt.executeQuery("CALL RETRIEVE_DYNAMIC_RESULTS(0)");
} catch (SQLException sqle) {
error = sqle;
}
Assert.assertNotNull(error);
stmt.close();
connect.close();
}
public void f_testExecuteQueryWithNoDynamicResultSets_callable() throws SQLException {
Connection connect = DriverManager.getConnection(create_url);
CallableStatement cs = connect.prepareCall("CALL RETRIEVE_DYNAMIC_RESULTS(?)");
cs.setInt(1, 0);
SQLException error = null;
try {
cs.executeQuery();
fail("executeQuery() didn't fail.");
} catch (SQLException sqle) {
error = sqle;
}
Assert.assertNotNull(error);
cs.close();
connect.close();
}
public static void retrieveClosedResult(ResultSet[] closed) throws SQLException {
Connection connect = DriverManager.getConnection(create_url);
closed[0] = connect.createStatement().executeQuery("VALUES(1)");
closed[0].close();
connect.close();
}
public static void retrieveExternalResult(String dbName, String user, String password, ResultSet[] external)
throws SQLException {
Connection conn = DriverManager.getConnection(create_url);
external[0] = conn.createStatement().executeQuery("VALUES(1)");
}
public static void selectRows(int p1, ResultSet[] data) throws SQLException {
System.out.println("selectRows - 1 arg - 1 rs");
Connection conn = DriverManager.getConnection("jdbc:default:connection");
PreparedStatement ps = conn.prepareStatement("select * from t1 where i = ?");
ps.setInt(1, p1);
data[0] = ps.executeQuery();
conn.close();
}
public static void selectRows(int p1, int p2, ResultSet[] data1, ResultSet[] data2) throws SQLException {
System.out.println("selectRows - 2 arg - 2 rs");
Connection conn = DriverManager.getConnection("jdbc:default:connection");
PreparedStatement ps = conn.prepareStatement("select * from t1 where i = ?");
ps.setInt(1, p1);
data1[0] = ps.executeQuery();
ps = conn.prepareStatement("select * from t1 where i >= ?");
ps.setInt(1, p2);
data2[0] = ps.executeQuery();
if (p2 == 99) data2[0].close();
// return no results
if (p2 == 199) {
data1[0].close();
data1[0] = null;
data2[0].close();
data2[0] = null;
}
// swap results
if (p2 == 299) {
ResultSet rs = data1[0];
data1[0] = data2[0];
data2[0] = rs;
}
conn.close();
}
// select all rows from a table
public static void selectRows(String table, ResultSet[] rs) throws SQLException {
Connection conn = DriverManager.getConnection("jdbc:default:connection");
Statement stmt = conn.createStatement();
rs[0] = stmt.executeQuery("SELECT * FROM " + table);
conn.close();
}
public static void fivejp(ResultSet[] data1, ResultSet[] data2, ResultSet[] data3, ResultSet[] data4,
ResultSet[] data5) throws SQLException {
Connection conn = DriverManager.getConnection("jdbc:default:connection");
PreparedStatement ps1 = conn.prepareStatement("select * from MRS.FIVERS where i > ?");
ps1.setInt(1, 1);
data1[0] = ps1.executeQuery();
PreparedStatement ps2 = conn.prepareStatement("select * from MRS.FIVERS where i > ?");
ps2.setInt(1, 2);
data2[0] = ps2.executeQuery();
PreparedStatement ps3 = conn.prepareStatement("select * from MRS.FIVERS where i > ?");
ps3.setInt(1, 3);
data3[0] = ps3.executeQuery();
PreparedStatement ps4 = conn.prepareStatement("select * from MRS.FIVERS where i > ?");
ps4.setInt(1, 4);
data4[0] = ps4.executeQuery();
PreparedStatement ps5 = conn.prepareStatement("select * from MRS.FIVERS where i > ?");
ps5.setInt(1, 5);
data5[0] = ps5.executeQuery();
conn.close();
}
public static void parameter1(int a, String b, String c, java.sql.ResultSet[] rs) throws SQLException {
System.out.print("PT1 a=" + a);
if (b == null) System.out.println(" b = null");
else System.out.print(" b=<" + b + ">(" + b.length() + ")");
if (c == null) System.out.println(" c = null");
else System.out.print(" c=<" + c + ">(" + c.length() + ")");
System.out.println("");
Connection conn = DriverManager.getConnection("jdbc:default:connection");
PreparedStatement ps = conn.prepareStatement("insert into PT1 values (?, ?, ?)");
ps.setInt(1, a);
ps.setString(2, b);
ps.setString(3, c);
ps.executeUpdate();
ps.close();
ps = conn.prepareStatement("select a,b, length(b), c, length(c) from PT1 where a = ?");
ps.setInt(1, a);
rs[0] = ps.executeQuery();
conn.close();
}
public static void parameter2(int a, java.math.BigDecimal b, java.math.BigDecimal c, java.sql.ResultSet[] rs)
throws SQLException {
Connection conn = DriverManager.getConnection("jdbc:default:connection");
PreparedStatement ps = conn.prepareStatement("insert into PT1 values (?, ?, ?)");
ps.setInt(1, a);
ps.setString(2, b.toString());
ps.setString(3, c.toString());
ps.executeUpdate();
ps.close();
ps = conn.prepareStatement("select a,b,c from PT1 where a = ?");
ps.setInt(1, a);
rs[0] = ps.executeQuery();
conn.close();
}
public static void retrieveDynamicResults(int number, ResultSet[] rs1, ResultSet[] rs2, ResultSet[] rs3,
ResultSet[] rs4) throws SQLException {
Connection c = DriverManager.getConnection("jdbc:default:connection");
if (number > 0) {
rs1[0] = c.createStatement().executeQuery("VALUES(1)");
}
if (number > 1) {
rs2[0] = c.createStatement().executeQuery("VALUES(1)");
}
if (number > 2) {
rs3[0] = c.createStatement().executeQuery("VALUES(1)");
}
if (number > 3) {
rs4[0] = c.createStatement().executeQuery("VALUES(1)");
}
c.close();
}
public static void outparams1(int[] p1, int p2) {
p1[0] = p2 * 2;
}
}