package org.cagrid.gts.service.impl;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import org.projectmobius.db.ConnectionManager;
import org.projectmobius.db.DatabaseException;
import org.projectmobius.db.Query;
public class MySQLDatabase extends Database {
private ConnectionManager root;
private ConnectionManager dbCM = null;
private boolean dbBuilt = false;
public MySQLDatabase(ConnectionManager cm, String db) {
super(db);
this.root = cm;
}
@Override
protected ConnectionManager getConnectionManager() throws DatabaseException {
if (dbCM == null) {
dbCM = new ConnectionManager(getDatabaseName(), root.getUrlPrefix(), root.getDriver(), root.getHost(), root
.getPort(), root.getUsername(), root.getPassword());
}
return dbCM;
}
@Override
public void createDatabase() throws DatabaseException {
try {
if (!dbBuilt) {
if (!databaseExists(getDatabaseName())) {
Query.update(this.root, "create database " + getDatabaseName());
}
dbBuilt = true;
}
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new DatabaseException("An error occured while trying to create the database (" + getDatabaseName()
+ ")");
}
}
@Override
public void destroyDatabase() throws DatabaseException {
try {
if (databaseExists(getDatabaseName())) {
Query.update(this.root, "drop database if exists " + getDatabaseName());
}
if (dbCM != null) {
dbCM.destroy();
}
if (root != null) {
root.closeAllUnusedConnections();
}
dbCM = null;
dbBuilt = false;
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new DatabaseException("An error occured while trying to destroy the database (" + getDatabaseName()
+ ")");
}
}
private boolean databaseExists(String db) throws DatabaseException {
boolean exists = false;
Connection c = null;
if (getConnectionManager() == root) {
return true;
}
try {
c = this.root.getConnection();
DatabaseMetaData dbMetadata = c.getMetaData();
ResultSet dbs = dbMetadata.getCatalogs();
while (dbs.next()) {
if (dbs.getString(1).equalsIgnoreCase(db)) {
exists = true;
}
}
dbs.close();
} catch (Exception e) {
this.root.releaseConnection(c);
log.error(e.getMessage(), e);
throw new DatabaseException(e.getMessage());
}
this.root.releaseConnection(c);
return exists;
}
}