package tap.db_testtools;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import org.h2.tools.RunScript;
public final class DBTools {
public static int count = 0;
public final static void main(final String[] args) throws Throwable{
try{
createTestDB();
for(int i = 0; i < 3; i++){
Thread t = new Thread(new Runnable(){
@Override
public void run(){
count++;
try{
Connection conn = DBTools.createConnection("h2", null, null, DBTools.DB_TEST_PATH, DBTools.DB_TEST_USER, DBTools.DB_TEST_PWD);
System.out.println("Start - " + count + ": ");
String query = "SELECT * FROM hipparcos WHERE vmag BETWEEN " + (5 + count) + " AND " + (10 + count) + ";";
System.out.println(query);
ResultSet rs = DBTools.select(conn, query);
try{
rs.last();
System.out.println("Nb rows: " + rs.getRow());
}catch(SQLException e){
e.printStackTrace();
}
if (DBTools.closeConnection(conn))
System.out.println("[DEBUG] Connection closed!");
}catch(DBToolsException e){
e.printStackTrace();
}
System.out.println("End - " + count);
count--;
}
});
t.start();
}
}finally{
dropTestDB();
}
}
public static class DBToolsException extends Exception {
private static final long serialVersionUID = 1L;
public DBToolsException(){
super();
}
public DBToolsException(String message, Throwable cause){
super(message, cause);
}
public DBToolsException(String message){
super(message);
}
public DBToolsException(Throwable cause){
super(cause);
}
}
/* ********************************************************************* */
/* H2 TEST DATABASE ATTRIBUTES AND FUNCTIONS */
public static String DB_TEST_JDBC_DRIVER = "org.h2.Driver";
public static String DB_TEST_PATH = "./test/tap/db_testtools/db-test/db-test";
public static String DB_TEST_URL = "jdbc:h2:" + DB_TEST_PATH;
public static String DB_TEST_USER = "junit";
public static String DB_TEST_PWD = "super-pwd";
public static String DB_TEST_TRANSLATOR = "adql.translator.H2Translator";
public static String DB_TEST_SCRIPTS_DIR = "./test/tap/db_testtools/db-test/";
public static void createTestDB() throws SQLException{
createTestDB(true);
}
public static void createTestDB(final boolean dropFirstIfExists) throws SQLException{
if (dropFirstIfExists)
dropTestDB();
RunScript.execute(DBTools.DB_TEST_URL, DBTools.DB_TEST_USER, DBTools.DB_TEST_PWD, DBTools.DB_TEST_SCRIPTS_DIR + "create-db.sql", null, false);
}
public static void createAddTAPSchema() throws SQLException{
RunScript.execute(DBTools.DB_TEST_URL, DBTools.DB_TEST_USER, DBTools.DB_TEST_PWD, DBTools.DB_TEST_SCRIPTS_DIR + "create-tap_schema.sql", null, false);
RunScript.execute(DBTools.DB_TEST_URL, DBTools.DB_TEST_USER, DBTools.DB_TEST_PWD, DBTools.DB_TEST_SCRIPTS_DIR + "fill-tap_schema.sql", null, false);
}
public static void dropTestDB(){
// Delete the Database:
File f = new File(DB_TEST_PATH + ".mv.db");
if (f.exists())
f.delete();
// Delete its corresponding H2 error log:
f = new File(DB_TEST_PATH + ".trace.db");
if (f.exists())
f.delete();
}
/* ********************************************************************* */
/* DATABASE CONNECTION FUNCTIONS */
public final static HashMap<String,String> VALUE_JDBC_DRIVERS = new HashMap<String,String>(4);
static{
VALUE_JDBC_DRIVERS.put("oracle", "oracle.jdbc.OracleDriver");
VALUE_JDBC_DRIVERS.put("postgresql", "org.postgresql.Driver");
VALUE_JDBC_DRIVERS.put("mysql", "com.mysql.jdbc.Driver");
VALUE_JDBC_DRIVERS.put("sqlite", "org.sqlite.JDBC");
VALUE_JDBC_DRIVERS.put("h2", "org.h2.Driver");
}
private DBTools(){}
public final static Connection createConnection(String dbms, final String server, final String port, final String dbName, final String user, final String passwd) throws DBToolsException{
// 1. Resolve the DBMS and get its JDBC driver:
if (dbms == null)
throw new DBToolsException("Missing DBMS (expected: oracle, postgresql, mysql, sqlite or h2)!");
dbms = dbms.toLowerCase();
String jdbcDriver = VALUE_JDBC_DRIVERS.get(dbms);
if (jdbcDriver == null)
throw new DBToolsException("Unknown DBMS (\"" + dbms + "\")!");
// 2. Load the JDBC driver:
try{
Class.forName(jdbcDriver);
}catch(ClassNotFoundException e){
throw new DBToolsException("Impossible to load the JDBC driver: " + e.getMessage(), e);
}
// 3. Establish the connection:
Connection connection = null;
try{
connection = DriverManager.getConnection("jdbc:" + dbms + ":" + ((server != null && server.trim().length() > 0) ? "//" + server + ((port != null && port.trim().length() > 0) ? (":" + port) : "") + "/" : "") + dbName, user, passwd);
}catch(SQLException e){
throw new DBToolsException("Connection failed: " + e.getMessage(), e);
}
if (connection == null)
throw new DBToolsException("Failed to make connection!");
return connection;
}
public final static boolean closeConnection(final Connection conn) throws DBToolsException{
try{
if (conn != null && !conn.isClosed()){
conn.close();
try{
Thread.sleep(200);
}catch(InterruptedException e){
System.err.println("WARNING: can't wait/sleep before testing the connection close status! [" + e.getMessage() + "]");
}
return conn.isClosed();
}else
return true;
}catch(SQLException e){
throw new DBToolsException("Closing connection failed: " + e.getMessage(), e);
}
}
public final static ResultSet select(final Connection conn, final String selectQuery) throws DBToolsException{
if (conn == null || selectQuery == null || selectQuery.trim().length() == 0)
throw new DBToolsException("One parameter is missing!");
try{
Statement stmt = conn.createStatement();
return stmt.executeQuery(selectQuery);
}catch(SQLException e){
throw new DBToolsException("Can't execute the given SQL query: " + e.getMessage(), e);
}
}
}