/* * 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.io.PrintStream; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.Date; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.sql.Types; import junit.framework.TestCase; import org.junit.Assert; import com.alibaba.druid.proxy.DruidDriver; import com.alibaba.druid.stat.JdbcStatManager; import com.alibaba.druid.util.JdbcUtils; public class SchemaReadTest extends TestCase { private static String url = "jdbc:wrap-jdbc:filters=default,commonLogging,log4j:name=demo:jdbc:derby:classpath:petstore-db"; protected void tearDown() throws Exception { DruidDriver.getProxyDataSources().clear(); Assert.assertEquals(0, JdbcStatManager.getInstance().getSqlList().size()); } public void test_schema() throws Exception { Class.forName("com.alibaba.druid.proxy.DruidDriver"); Connection conn = null; Statement stmt = null; ResultSet rs = null; try { conn = DriverManager.getConnection(url); Assert.assertTrue(conn.isReadOnly()); // just call conn.getHoldability(); conn.getTransactionIsolation(); conn.getWarnings(); conn.getTypeMap(); conn.getAutoCommit(); conn.getCatalog(); conn.getClientInfo(); conn.getClientInfo("xx"); DatabaseMetaData metadata = conn.getMetaData(); { ResultSet tableTypes = metadata.getTableTypes(); JdbcUtils.printResultSet(tableTypes, System.out); JdbcUtils.close(tableTypes); } { conn.setAutoCommit(false); ResultSet tables = metadata.getTables(null, null, null, null); JdbcUtils.printResultSet(tables, System.out); conn.commit(); conn.setAutoCommit(true); JdbcUtils.close(tables); } { ResultSet tables = metadata.getTables(null, null, null, null); while (tables.next()) { String schema = tables.getString(2); String tableName = tables.getString(3); String sql = "SELECT * FROM " + schema + "." + tableName; stmt = conn.createStatement(); rs = stmt.executeQuery(sql); JdbcUtils.printResultSet(rs, System.out); JdbcUtils.close(rs); Assert.assertTrue(rs.isClosed()); JdbcUtils.close(stmt); Assert.assertTrue(stmt.isClosed()); } JdbcUtils.close(tables); } } finally { JdbcUtils.close(rs); JdbcUtils.close(stmt); JdbcUtils.close(conn); Assert.assertTrue(conn.isClosed()); } } public void test_schema2() throws Exception { Class.forName("com.alibaba.druid.proxy.DruidDriver"); Connection conn = null; Statement stmt = null; ResultSet rs = null; try { conn = DriverManager.getConnection(url); Assert.assertTrue(conn.isReadOnly()); // just call conn.getHoldability(); conn.getTransactionIsolation(); conn.getWarnings(); conn.getTypeMap(); conn.getAutoCommit(); conn.getCatalog(); conn.getClientInfo(); conn.getClientInfo("xx"); conn.isValid(10); DatabaseMetaData metadata = conn.getMetaData(); { ResultSet tableTypes = metadata.getTableTypes(); printResultSetUseColumnName(tableTypes, System.out); JdbcUtils.close(tableTypes); } { conn.setAutoCommit(false); ResultSet tables = metadata.getTables(null, null, null, null); printResultSetUseColumnName(tables, System.out); conn.commit(); conn.setAutoCommit(true); JdbcUtils.close(tables); } { ResultSet tables = metadata.getTables(null, null, null, null); while (tables.next()) { String schema = tables.getString(2); String tableName = tables.getString(3); String sql = "SELECT * FROM " + schema + "." + tableName; stmt = conn.createStatement(); rs = stmt.executeQuery(sql); printResultSetUseColumnName(rs, System.out); JdbcUtils.close(rs); Assert.assertTrue(rs.isClosed()); JdbcUtils.close(stmt); Assert.assertTrue(stmt.isClosed()); } JdbcUtils.close(tables); } } finally { JdbcUtils.close(rs); JdbcUtils.close(stmt); JdbcUtils.close(conn); Assert.assertTrue(conn.isClosed()); } } public static void printResultSetUseColumnName(ResultSet rs, PrintStream out) throws SQLException { ResultSetMetaData metadata = rs.getMetaData(); int columnCount = metadata.getColumnCount(); for (int columnIndex = 1; columnIndex <= columnCount; ++columnIndex) { if (columnIndex != 1) { out.print('\t'); } out.print(metadata.getColumnName(columnIndex)); } out.println(); while (rs.next()) { for (int columnIndex = 1; columnIndex <= columnCount; ++columnIndex) { if (columnIndex != 1) { out.print('\t'); } String columnName = metadata.getColumnName(columnIndex); int type = metadata.getColumnType(columnIndex); if (type == Types.VARCHAR || type == Types.CHAR || type == Types.NVARCHAR || type == Types.NCHAR) { out.print(rs.getString(columnName)); } else if (type == Types.DATE) { Date date = rs.getDate(columnName); if (rs.wasNull()) { out.print("null"); } else { out.print(date.toString()); } } else if (type == Types.BIT) { boolean value = rs.getBoolean(columnName); if (rs.wasNull()) { out.print("null"); } else { out.print(Boolean.toString(value)); } } else if (type == Types.BOOLEAN) { boolean value = rs.getBoolean(columnName); if (rs.wasNull()) { out.print("null"); } else { out.print(Boolean.toString(value)); } } else if (type == Types.TINYINT) { byte value = rs.getByte(columnName); if (rs.wasNull()) { out.print("null"); } else { out.print(Byte.toString(value)); } } else if (type == Types.SMALLINT) { short value = rs.getShort(columnName); if (rs.wasNull()) { out.print("null"); } else { out.print(Short.toString(value)); } } else if (type == Types.INTEGER) { int value = rs.getInt(columnName); if (rs.wasNull()) { out.print("null"); } else { out.print(Integer.toString(value)); } } else if (type == Types.BIGINT) { long value = rs.getLong(columnName); if (rs.wasNull()) { out.print("null"); } else { out.print(Long.toString(value)); } } else if (type == Types.TIMESTAMP) { out.print(String.valueOf(rs.getTimestamp(columnName))); } else if (type == Types.DECIMAL) { out.print(String.valueOf(rs.getBigDecimal(columnName))); } else if (type == Types.CLOB) { out.print(String.valueOf(rs.getString(columnName))); } else if (type == Types.JAVA_OBJECT) { Object objec = rs.getObject(columnName); if (rs.wasNull()) { out.print("null"); } else { out.print(String.valueOf(objec)); } } else if (type == Types.LONGVARCHAR) { Object objec = rs.getString(columnName); if (rs.wasNull()) { out.print("null"); } else { out.print(String.valueOf(objec)); } } else { Object objec = rs.getObject(columnName); if (rs.wasNull()) { out.print("null"); } else { out.print(String.valueOf(objec)); } } } out.println(); } } }