package org.mifos.db.populate;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.mifos.core.MifosResourceUtil;
import org.mifos.framework.persistence.SqlExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DefaultDatabaseLoader {
private final String[] BASE_DB_SCRIPTS = { "sql/base-schema.sql", "sql/base-data.sql", "sql/init_mifos_password.sql" };
private final String[] DB_PENTAHO_DW_SCRIPTS = { "sql/load_mifos_datawarehouse.sql",
"sql/load_mifos_datawarehouse_stored_procedures.sql", "sql/load_ppi_poverty_lines.sql",
"sql/load_dw_ppi_survey.sql" };
private String dbName;
private String dbPentahoDW;
private Connection connection;
private static Logger logger = LoggerFactory.getLogger(DefaultDatabaseLoader.class);
public DefaultDatabaseLoader(Connection connection, String dbName,
String dbPentahoDW) {
this.connection = connection;
this.dbName = dbName;
this.dbPentahoDW = dbPentahoDW;
}
public void createDatabase() throws SQLException {
Statement statement = null;
try {
statement = connection.createStatement();
if (!"".equals(dbName)) {
statement.execute(String.format("create database if not exists %s", dbName));
}
if (!"".equals(dbPentahoDW)) {
statement.execute(String.format("create database if not exists %s", dbPentahoDW));
}
statement.close();
} finally {
if (statement != null) {
statement.close();
}
}
}
public void populateDatabase() throws SQLException, IOException {
loadDbFromSqlFiles(dbName, BASE_DB_SCRIPTS);
loadDbFromSqlFiles(dbPentahoDW, DB_PENTAHO_DW_SCRIPTS);
}
private void loadDbFromSqlFiles(String dbToLoadName, String[] fileNames) throws SQLException, IOException {
if (!"".equals(dbToLoadName)) {
connection.setCatalog(dbToLoadName);
ResultSet res = connection.getMetaData().getTables(null, null, null, new String[] { "TABLE" });
if (res.next()) {
logger.info("Database " + dbToLoadName + " already populated");
} else {
InputStream[] inputStreams = MifosResourceUtil.getSQLFilesAsStreams(fileNames);
SqlExecutor.executeMultipleFiles(inputStreams, connection);
}
}
}
public String getDbName() {
return dbName;
}
public void setDbName(String dbName) {
this.dbName = dbName;
}
public String getDbPentahoDW() {
return dbPentahoDW;
}
public void setDbPentahoDW(String dbPentahoDW) {
this.dbPentahoDW = dbPentahoDW;
}
public Connection getConnection() {
return connection;
}
public void setConnection(Connection connection) {
this.connection = connection;
}
}