content: /*
   * Copyright 1999-2018 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 com.alibaba.druid.proxy.DruidDriver;
  import com.alibaba.druid.stat.JdbcStatManager;
  import com.alibaba.druid.util.JdbcUtils;
  import junit.framework.TestCase;
  
  import java.io.PrintStream;
  import java.sql.*;
  
  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();
          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);
  
              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);
                      assertTrue(rs.isClosed());
                      JdbcUtils.close(stmt);
                      assertTrue(stmt.isClosed());
                  }
                  JdbcUtils.close(tables);
              }
          } finally {
              JdbcUtils.close(rs);
              JdbcUtils.close(stmt);
              JdbcUtils.close(conn);
              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);
  
              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);
                      assertTrue(rs.isClosed());
                      JdbcUtils.close(stmt);
                      assertTrue(stmt.isClosed());
                  }
                  JdbcUtils.close(tables);
              }
          } finally {
              JdbcUtils.close(rs);
              JdbcUtils.close(stmt);
              JdbcUtils.close(conn);
              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();
          }
      }
  }
  