/** * 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.SQLException; import java.sql.Statement; import java.util.Collection; import org.hibernate.dialect.Dialect; import org.hibernate.dialect.Oracle10gDialect; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.util.test.TestProperties; /** * Database management for Oracle databases. */ public final class Oracle11gDbManagement extends AbstractDbManagement { /** * Singleton instance. */ private static final Oracle11gDbManagement INSTANCE = new Oracle11gDbManagement(); /** * The underlying Hibernate dialect. */ private Oracle10gDialect _hibernateDialect; /** * Restricted constructor. */ private Oracle11gDbManagement() { } /** * Gets the singleton instance. * * @return the instance, not null */ public static Oracle11gDbManagement getInstance() { return INSTANCE; } //------------------------------------------------------------------------- @Override public synchronized Dialect getHibernateDialect() { if (_hibernateDialect == null) { // constructed lazily so we don't get log message about 'using dialect' if we're not actually using it _hibernateDialect = new Oracle10gDialect(); } return _hibernateDialect; } @Override public Class<?> getJDBCDriverClass() { try { return Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException ex) { throw new OpenGammaRuntimeException("Could not load the Oracle JDBC driver: " + ex.getMessage()); } // Use the Oracle driver... // return oracle.jdbc.driver.OracleDriver.class; } @Override public String getDatabaseName() { return "oracle11g"; } //------------------------------------------------------------------------- @Override public String getCatalogToConnectTo(String catalog) { return getDbHost(); } @Override public String getAllSchemasSQL(String catalog) { return "SELECT username as name FROM ALL_USERS"; } @Override public String getAllForeignKeyConstraintsSQL(String catalog, String schema) { String sql = "SELECT constraint_name AS name, table_name FROM USER_CONSTRAINTS WHERE constraint_type = 'R' AND owner='" + getUser() + "'"; return sql; } @Override public String getAllSequencesSQL(String catalog, String schema) { return "SELECT object_name as name FROM ALL_OBJECTS where OBJECT_TYPE = 'SEQUENCE' AND owner='" + getUser() + "'"; } @Override public String getAllTablesSQL(String catalog, String schema) { return "SELECT table_name as name FROM USER_TABLES"; } @Override public String getAllViewsSQL(String catalog, String schema) { return "SELECT object_name as name FROM ALL_OBJECTS where OBJECT_TYPE = 'VIEW' AND owner='" + getUser() + "'"; } @Override public String getAllColumnsSQL(String catalog, String schema, String table) { StringBuilder sql = new StringBuilder("SELECT column_name AS name, data_type AS datatype, " + "nullable AS allowsnull, data_default AS defaultvalue FROM ALL_TAB_COLUMNS WHERE owner = '" + getUser() + "' AND table_name = '" + table + "'"); return sql.toString(); } @Override public String getCreateSchemaSQL(String catalog, String schema) { return ""; } @Override public String getSchemaVersionTable(String schemaGroupName) { return (schemaGroupName + SCHEMA_VERSION_TABLE_SUFFIX).toLowerCase(); } @Override public String getSchemaVersionSQL(String catalog, String schemaGroupName) { return "SELECT version_value FROM " + getSchemaVersionTable(schemaGroupName) + " WHERE version_key = 'schema_patch'"; } private String getSystemUser() { String user = System.getProperty("system.user"); if (user == null) { user = TestProperties.getTestProperties().getProperty("oracle11g.jdbc.system.username"); } return user; } private String getSystemPassword() { String pw = System.getProperty("system.password"); if (pw == null) { pw = TestProperties.getTestProperties().getProperty("oracle11g.jdbc.system.password"); } return pw; } @Override public CatalogCreationStrategy getCatalogCreationStrategy() { return new Oracle11gCatalogCreationStrategy( this, getUser(), getPassword(), getSystemUser(), getSystemPassword(), "SELECT username as name FROM ALL_USERS", null); } @Override public void dropSchema(String catalog, String schema) { // Does not handle triggers or stored procedures yet try { if (!getCatalogCreationStrategy().catalogExists(catalog)) { System.out.println("Catalog " + catalog + " does not exist"); return; // nothing to drop } try (Connection conn = DriverManager.getConnection(getCatalogToConnectTo(catalog), getSystemUser(), getSystemPassword())) { if (schema != null) { try (Statement statement = conn.createStatement()) { Collection<String> schemas = getAllSchemas(catalog, statement); if (!schemas.contains(schema)) { System.out.println("Schema " + schema + " does not exist"); return; // nothing to drop } } } setActiveSchema(conn, schema); try (Statement statement = conn.createStatement()) { statement.addBatch("DROP USER " + getUser() + " CASCADE"); statement.executeBatch(); } } } catch (SQLException e) { throw new OpenGammaRuntimeException("Failed to drop schema", e); } } }