/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.test.synth.sql;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import org.h2.util.New;
/**
* Represents a connection to a real database.
*/
class DbConnection implements DbInterface {
private TestSynth config;
private int id;
private String driver;
private String url;
private String user;
private String password;
private Connection conn;
private Connection sentinel;
private boolean useSentinel;
DbConnection(TestSynth config, String driver, String url, String user, String password, int id, boolean useSentinel) {
this.config = config;
this.driver = driver;
this.url = url;
this.user = user;
this.password = password;
this.id = id;
this.useSentinel = useSentinel;
log("url=" + url);
}
public void reset() throws SQLException {
log("reset;");
DatabaseMetaData meta = conn.getMetaData();
Statement stat = conn.createStatement();
ArrayList<String> tables = New.arrayList();
ResultSet rs = meta.getTables(null, null, null, new String[] { "TABLE" });
while (rs.next()) {
String schemaName = rs.getString("TABLE_SCHEM");
if (!"INFORMATION_SCHEMA".equals(schemaName)) {
tables.add(rs.getString("TABLE_NAME"));
}
}
while (tables.size() > 0) {
int dropped = 0;
for (int i = 0; i < tables.size(); i++) {
try {
String table = tables.get(i);
stat.execute("DROP TABLE " + table);
dropped++;
tables.remove(i);
i--;
} catch (SQLException e) {
// maybe a referential integrity
}
}
// could not drop any table and still tables to drop
if (dropped == 0 && tables.size() > 0) {
throw new AssertionError("Cannot drop " + tables);
}
}
}
public void connect() throws Exception {
if (useSentinel && sentinel == null) {
sentinel = getConnection();
}
log("connect to " + url + ";");
conn = getConnection();
}
private Connection getConnection() throws Exception {
log("(getConnection to " + url + ");");
if (driver == null) {
return config.getConnection("synth");
}
Class.forName(driver);
return DriverManager.getConnection(url, user, password);
}
public void disconnect() throws SQLException {
log("disconnect " + url + ";");
conn.close();
}
public void end() throws SQLException {
log("end " + url + ";");
if (sentinel != null) {
sentinel.close();
sentinel = null;
}
}
public void createTable(Table table) throws SQLException {
execute(table.getCreateSQL());
}
public void dropTable(Table table) throws SQLException {
execute(table.getDropSQL());
}
public void createIndex(Index index) throws SQLException {
execute(index.getCreateSQL());
index.getTable().addIndex(index);
}
public void dropIndex(Index index) throws SQLException {
execute(index.getDropSQL());
index.getTable().removeIndex(index);
}
public Result insert(Table table, Column[] c, Value[] v) throws SQLException {
String sql = table.getInsertSQL(c, v);
execute(sql);
return new Result(sql, 1);
}
private void execute(String sql) throws SQLException {
log(sql + ";");
conn.createStatement().execute(sql);
}
public Result select(String sql) throws SQLException {
log(sql + ";");
Statement stat = conn.createStatement();
Result result = new Result(config, sql, stat.executeQuery(sql));
return result;
}
public Result delete(Table table, String condition) throws SQLException {
String sql = "DELETE FROM " + table.getName();
if (condition != null) {
sql += " WHERE " + condition;
}
log(sql + ";");
Statement stat = conn.createStatement();
Result result = new Result(sql, stat.executeUpdate(sql));
return result;
}
public Result update(Table table, Column[] columns, Value[] values, String condition) throws SQLException {
String sql = "UPDATE " + table.getName() + " SET ";
for (int i = 0; i < columns.length; i++) {
if (i > 0) {
sql += ", ";
}
sql += columns[i].getName() + "=" + values[i].getSQL();
}
if (condition != null) {
sql += " WHERE " + condition;
}
log(sql + ";");
Statement stat = conn.createStatement();
Result result = new Result(sql, stat.executeUpdate(sql));
return result;
}
public void setAutoCommit(boolean b) throws SQLException {
log("set autoCommit " + b + ";");
conn.setAutoCommit(b);
}
public void commit() throws SQLException {
log("commit;");
conn.commit();
}
public void rollback() throws SQLException {
log("rollback;");
conn.rollback();
}
private void log(String s) {
config.log(id, s);
}
public String toString() {
return url;
}
}