diff --git a/config/alfresco/bootstrap-context.xml b/config/alfresco/bootstrap-context.xml index 8a34820730..378f2a8eba 100644 --- a/config/alfresco/bootstrap-context.xml +++ b/config/alfresco/bootstrap-context.xml @@ -49,11 +49,20 @@ + + + + + + + + + diff --git a/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java b/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java index cac0647cb6..e60b44f41a 100644 --- a/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java +++ b/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Alfresco Software Limited. + * Copyright (C) 2005-2010 Alfresco Software Limited. * * This file is part of Alfresco * @@ -229,6 +229,17 @@ public class SchemaBootstrap extends AbstractLifecycleBean this.descriptorService = descriptorService; } + + /** + * Defines the DatabaseMetaDataHelper to be used + * + * @param databaseMetaDataHelper + */ + public void setDatabaseMetaDataHelper(DatabaseMetaDataHelper databaseMetaDataHelper) + { + this.databaseMetaDataHelper = databaseMetaDataHelper; + } + /** * Sets the previously auto-detected Hibernate dialect. * @@ -260,6 +271,7 @@ public class SchemaBootstrap extends AbstractLifecycleBean private int maximumStringLength; private Properties globalProperties; private String dbSchemaName; + private DatabaseMetaDataHelper databaseMetaDataHelper; private ThreadLocal executedStatementsThreadLocal = new ThreadLocal(); @@ -563,7 +575,7 @@ public class SchemaBootstrap extends AbstractLifecycleBean */ private int countAppliedPatches(Configuration cfg, Connection connection) throws Exception { - String defaultSchema = dbSchemaName != null ? dbSchemaName : DatabaseMetaDataHelper.getSchema(connection); + String defaultSchema = dbSchemaName != null ? dbSchemaName : databaseMetaDataHelper.getSchema(connection); if (defaultSchema != null && defaultSchema.length() == 0) { @@ -1021,7 +1033,7 @@ public class SchemaBootstrap extends AbstractLifecycleBean setJobExecutorActivate(false). buildProcessEngine(); - String schemaName = dbSchemaName != null ? dbSchemaName : DatabaseMetaDataHelper.getSchema(connection); + String schemaName = dbSchemaName != null ? dbSchemaName : databaseMetaDataHelper.getSchema(connection); // create or upgrade the DB schema engine.getManagementService().databaseSchemaUpgrade(connection, null, schemaName); } @@ -1774,6 +1786,17 @@ public class SchemaBootstrap extends AbstractLifecycleBean { logger.warn("Error closing DB connection: " + e.getMessage()); } + try + { + if (session != null) + { + session.close(); + } + } + catch (Throwable e) + { + logger.warn("Error closing Hibernate session: " + e.getMessage()); + } // Remove the connection reference from the threadlocal boostrap SchemaBootstrapConnectionProvider.setBootstrapConnection(null); @@ -1866,7 +1889,7 @@ public class SchemaBootstrap extends AbstractLifecycleBean XMLToSchema xmlToSchema = new XMLToSchema(is); xmlToSchema.parse(); Schema reference = xmlToSchema.getSchema(); - ExportDb exporter = new ExportDb(dataSource, dialect, descriptorService); + ExportDb exporter = new ExportDb(dataSource, dialect, descriptorService, databaseMetaDataHelper); exporter.setDbSchemaName(dbSchemaName); // Ensure that the database objects we're validating are filtered // by the same prefix as the reference file. diff --git a/source/java/org/alfresco/util/DatabaseMetaDataHelper.java b/source/java/org/alfresco/util/DatabaseMetaDataHelper.java index 8997b3bca1..6a352e87cd 100644 --- a/source/java/org/alfresco/util/DatabaseMetaDataHelper.java +++ b/source/java/org/alfresco/util/DatabaseMetaDataHelper.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2012 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -24,6 +24,8 @@ import java.sql.ResultSet; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.hibernate.cfg.Configuration; +import org.springframework.orm.hibernate3.LocalSessionFactoryBean; /** * Helper class to collect all of our DatabaseMetaData interpretations in one place. @@ -35,12 +37,19 @@ public class DatabaseMetaDataHelper { private static Log logger = LogFactory.getLog(DatabaseMetaDataHelper.class); + private Configuration cfg; + + public void setLocalSessionFactory(LocalSessionFactoryBean localSessionFactory) + { + this.cfg = localSessionFactory.getConfiguration(); + } + /** * Trys to determine the schema name from the DatabaseMetaData obtained from the Connection. * @param connection A database connection * @return */ - public static String getSchema(Connection connection) + private String getSchemaFromConnection(Connection connection) { if (connection == null) { @@ -89,4 +98,33 @@ public class DatabaseMetaDataHelper { } return null; } + + public String getSchema(Connection connection) + { + String schema = null; + + if (this.cfg != null) + { + String tmpSchema = this.cfg.getProperty("hibernate.default_schema"); + if (tmpSchema != null && tmpSchema.trim().length() > 0) + { + schema = tmpSchema; + } + } + + // if hibernate.default_schema was specified as a system property, then override previous value + String tmpSchema = System.getProperty("hibernate.default_schema"); + if (tmpSchema != null && tmpSchema.length() > 0) + { + schema = tmpSchema; + } + + if (schema == null) + { + schema = getSchemaFromConnection(connection); + } + + return schema; + } + } diff --git a/source/java/org/alfresco/util/schemacomp/ExportDb.java b/source/java/org/alfresco/util/schemacomp/ExportDb.java index 53bbc83efd..716dfee516 100644 --- a/source/java/org/alfresco/util/schemacomp/ExportDb.java +++ b/source/java/org/alfresco/util/schemacomp/ExportDb.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Alfresco Software Limited. + * Copyright (C) 2005-2011 Alfresco Software Limited. * * This file is part of Alfresco * @@ -30,6 +30,7 @@ import javax.sql.DataSource; import org.alfresco.service.descriptor.Descriptor; import org.alfresco.service.descriptor.DescriptorService; +import org.alfresco.util.DatabaseMetaDataHelper; import org.alfresco.util.PropertyCheck; import org.alfresco.util.schemacomp.model.Column; import org.alfresco.util.schemacomp.model.ForeignKey; @@ -55,6 +56,9 @@ public class ExportDb /** Reverse map from database types to JDBC types (loaded from a Hibernate dialect). */ private final Map reverseTypeMap = new TreeMap(); + /** The database metadata helper */ + private DatabaseMetaDataHelper databaseMetaDataHelper; + /** The JDBC DataSource. */ private DataSource dataSource; @@ -80,7 +84,8 @@ public class ExportDb { this((DataSource) context.getBean("dataSource"), (Dialect) context.getBean("dialect"), - (DescriptorService) context.getBean("descriptorComponent")); + (DescriptorService) context.getBean("descriptorComponent"), + (DatabaseMetaDataHelper) context.getBean("databaseMetaDataHelper")); } @@ -90,11 +95,12 @@ public class ExportDb * @param connection the database connection to use for metadata queries * @param dialect the Hibernate dialect */ - public ExportDb(final DataSource dataSource, final Dialect dialect, DescriptorService descriptorService) + public ExportDb(final DataSource dataSource, final Dialect dialect, DescriptorService descriptorService, DatabaseMetaDataHelper databaseMetaDataHelper) { this.dataSource = dataSource; this.dialect = dialect; this.descriptorService = descriptorService; + this.databaseMetaDataHelper = databaseMetaDataHelper; init(); } @@ -202,7 +208,7 @@ public class ExportDb { final DatabaseMetaData dbmd = con.getMetaData(); - String schemaName = getSchemaName(dbmd); + String schemaName = databaseMetaDataHelper.getSchema(con); schema = new Schema(schemaName, namePrefix, schemaVersion, true); String[] prefixFilters = namePrefixFilters(dbmd); @@ -383,36 +389,6 @@ public class ExportDb tables.close(); } - /** - * Assume that if there are schemas, we want the one named after the connection user - * or the one called "dbo" (MS SQL hack) - * - * @param dbmd - * @return The schema name, or null otherwise. - * @throws SQLException - */ - private String getSchemaName(final DatabaseMetaData dbmd) throws SQLException - { - if (this.dbSchemaName != null) - { - return this.dbSchemaName; - } - - String schemaName = null; - final ResultSet schemas = dbmd.getSchemas(); - while (schemas.next()) - { - final String thisSchema = schemas.getString("TABLE_SCHEM"); - if (thisSchema.equalsIgnoreCase(dbmd.getUserName()) || thisSchema.equalsIgnoreCase("dbo")) - { - schemaName = thisSchema; - break; - } - } - schemas.close(); - return schemaName; - } - /** * Convert a boolean string as used in the database, to a boolean value.