package database;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.junit.Test;
import de.open4me.depot.sql.SQLChange;
import de.willuhn.logging.Logger;
public class DataBaseCreation {
@Test
public void runH2() throws ClassNotFoundException, SQLException, IOException {
File file = File.createTempFile("depotviewer", "test");
file.delete(); // Not safe, but in this case ok
test("org.h2.Driver","jdbc:h2:" + file.getAbsolutePath(), "", "");
}
@Test
public void runMYSQL() throws ClassNotFoundException, SQLException, IOException {
FileReader reader = new FileReader( "credential.txt" );
Properties credentail = new Properties();
credentail.load( reader );
reader.close();
String dbname = createTempDB("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/", credentail.getProperty("user"), credentail.getProperty("pwd"));
test("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/" + dbname + "?useUnicode=Yes&characterEncoding=ISO8859_1", "hibiscus", "hibiscus");
}
private String createTempDB(String classname, String jdbc, String user, String pwd) throws ClassNotFoundException, SQLException {
Class.forName(classname);
String dbname = "hibiscus_test_" + System.currentTimeMillis();
Connection conn = DriverManager.getConnection(jdbc, user, pwd);
conn.setAutoCommit(false);
Statement statement = conn.createStatement();
statement.execute("create database " + dbname + ";");
// CREATE USER 'hibiscus'@'localhost' IDENTIFIED BY 'hibiscus';
statement.execute("GRANT ALL PRIVILEGES ON " + dbname + ".* TO 'hibiscus'@'localhost';");
return dbname;
}
/**
* Alle Tabellen innerhalb dieser Datenbank löschen
* @param classname
* @param jdbc
* @param user
* @param pwd
* @throws ClassNotFoundException
* @throws SQLException
*/
public void clearMysql(String classname, String jdbc, String user, String pwd) throws ClassNotFoundException, SQLException {
Class.forName(classname);
Connection conn = DriverManager.getConnection(jdbc, user, pwd);
conn.setAutoCommit(false);
Statement statement = conn.createStatement();
statement.execute("SET FOREIGN_KEY_CHECKS = 0;");
ResultSet ret = statement.executeQuery("SELECT concat('DROP TABLE IF EXISTS ', table_name, ';')\n" +
"FROM information_schema.tables\n" +
"WHERE table_schema = 'hibiscus';");
List<String> queries = new ArrayList<String>();
while (ret.next()) {
System.out.println();
queries.add(ret.getString(1));
}
for (String s : queries) {
statement.execute(s);
}
ret.close();
statement.execute("SET FOREIGN_KEY_CHECKS = 1;");
conn.commit();
}
public void test(String classname, String jdbc, String user, String pwd) throws ClassNotFoundException, SQLException {
Class.forName(classname);
List<SQLChange> liste = SQLChange.getChangesSinceVersion(0);
Connection conn = null;
conn = DriverManager.getConnection(jdbc, user, pwd);
conn.setAutoCommit(false);
Statement statement = conn.createStatement();
statement.execute(
"create table konto (\n" +
" id int NOT NULL auto_increment,\n" +
" PRIMARY KEY (id)\n" +
");");
conn.commit();
conn.close();
try {
for (SQLChange changeset : liste) {
Logger.info("Depot-Viewer: Updating DB to " + changeset.getVersion());
conn = DriverManager.getConnection(jdbc, user, pwd);
conn.setAutoCommit(false);
statement = conn.createStatement();
for (String query : changeset.getQuery()) {
statement.execute(query);
}
statement.execute("update depotviewer_cfg set value = " + changeset.getVersion() + " where `key`='dbversion'");
conn.commit();
conn.close();
}
} catch (Exception e) {
Logger.error("Fehler bei Aktualisierung der Datenbank", e);
if (conn != null) {
try {
conn.rollback();
conn.close();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
throw e;
}
}
}