mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
git-svn-id: http://code.alibabatech.com/svn/druid/trunk@21 b9813039-fb51-4c41-a8b9-e21c2acb5095
288 lines
11 KiB
Java
288 lines
11 KiB
Java
/*
|
|
* Copyright 2011 Alibaba Group.
|
|
*
|
|
* 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.Assert;
|
|
import junit.framework.TestCase;
|
|
|
|
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();
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
}
|