/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.util.db.management;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.opengamma.OpenGammaRuntimeException;
/**
* A database catalog creation strategy implementation that uses SQL.
*/
public class Oracle11gCatalogCreationStrategy implements CatalogCreationStrategy {
private AbstractDbManagement _dbManagement;
private String _user;
private String _password;
private String _systemUser;
private String _systemPassword;
private String _allCatalogsSql;
private String _blankCatalog;
/**
* Creates an instance.
* @param dbManagement the dialect-specific db management class
* @param user the user name
* @param password the password
* @param systemUser the system user name
* @param systemPassword the system password
* @param getAllCatalogsSql the SQL to get all catalogs, not null
* @param blankCatalog the catalog name to create, not null
*/
public Oracle11gCatalogCreationStrategy(
AbstractDbManagement dbManagement,
String user,
String password,
String systemUser,
String systemPassword,
String getAllCatalogsSql,
String blankCatalog) {
_dbManagement = dbManagement;
_user = user;
_password = password;
_systemUser = systemUser;
_systemPassword = systemPassword;
_allCatalogsSql = getAllCatalogsSql;
_blankCatalog = blankCatalog;
}
//-------------------------------------------------------------------------
@Override
public boolean catalogExists(String catalog) {
@SuppressWarnings("resource")
Connection conn = null;
try {
if (_systemUser != null && !_systemUser.equals("")) {
conn = DriverManager.getConnection(getCatalogToConnectTo(), _systemUser, _systemPassword);
} else if (_user != null && !_user.equals("")) {
conn = DriverManager.getConnection(getCatalogToConnectTo(), _user, _password);
} else {
// PLAT-2745, if we do not have a user, then client may be
// attempting to login to MSSQL using integratedSecurity
// and just the url should be sufficient
conn = DriverManager.getConnection(getCatalogToConnectTo());
}
conn.setAutoCommit(true);
boolean catalogAlreadyExists = false;
try (Statement statement = conn.createStatement()) {
try (ResultSet rs = statement.executeQuery(_allCatalogsSql)) {
while (rs.next()) {
String name = rs.getString("name");
if (name.equalsIgnoreCase(_user)) {
catalogAlreadyExists = true;
}
}
}
}
return catalogAlreadyExists;
} catch (SQLException e) {
throw new OpenGammaRuntimeException("Failed to create catalog", e);
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
}
}
}
}
private String getCatalogToConnectTo() {
if (_blankCatalog == null) {
return _dbManagement.getDbHost();
} else {
return _dbManagement.getCatalogToConnectTo(_blankCatalog);
}
}
@Override
public void create(String catalog) {
if (catalogExists(catalog)) {
return; // nothing to do
}
@SuppressWarnings("resource")
Connection conn = null;
try {
if (_systemUser != null && !_systemUser.equals("")) {
conn = DriverManager.getConnection(getCatalogToConnectTo(), _systemUser, _systemPassword);
} else {
conn = DriverManager.getConnection(getCatalogToConnectTo());
}
conn.setAutoCommit(true);
String createCatalogSql = "CREATE USER " + _user + " IDENTIFIED BY " + _password + "\n" +
"DEFAULT TABLESPACE users\n" +
"TEMPORARY TABLESPACE temp\n" +
"QUOTA UNLIMITED ON users";
//"GRANT CONNECT TO " + _user + ";\n" +
//"GRANT CREATE TABLE TO " + _user + ";\n" +
//"GRANT CREATE SEQUENCE TO " + _user + ";";
try (Statement statement = conn.createStatement()) {
//statement.addBatch("DROP USER " + _user + " CASCADE");
statement.addBatch(createCatalogSql);
statement.addBatch("GRANT CONNECT TO " + _user);
statement.addBatch("GRANT CREATE TABLE TO " + _user);
statement.addBatch("GRANT CREATE SEQUENCE TO " + _user);
statement.executeBatch();
}
} catch (SQLException e) {
throw new OpenGammaRuntimeException("Failed to create catalog", e);
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
}
}
}
}
}