Tool to dump default schema creation scripts for a set of dialects

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@5073 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2007-02-08 09:41:46 +00:00
parent d855bb345b
commit 72eee7d097
2 changed files with 116 additions and 6 deletions

View File

@@ -2,9 +2,10 @@
schema.update.msg.executing_script=Executing database script: {0} schema.update.msg.executing_script=Executing database script: {0}
schema.update.msg.optional_statement_failed=Optional statement execution failed:\n SQL: {0}\n Error: {1}\n File: {2}\n Line: {3} schema.update.msg.optional_statement_failed=Optional statement execution failed:\n SQL: {0}\n Error: {1}\n File: {2}\n Line: {3}
schema.update.msg.dumping_schema_create=Generating unmodified schema creation script: {0}
schema.update.err.statement_failed=Statement execution failed:\n SQL: {0}\n Error: {1}\n File: {2}\n Line: {3} schema.update.err.statement_failed=Statement execution failed:\n SQL: {0}\n Error: {1}\n File: {2}\n Line: {3}
schema.update.err.update_failed=Schema auto-update failed schema.update.err.update_failed=Schema auto-update failed
schema.update.err.validation_failed=Schema validation failed schema.update.err.validation_failed=Schema validation failed
schema.update.err.update_script_not_run=The following schema upgrade script needs to be executed manually: {0} schema.update.err.update_script_not_run=The following schema upgrade script needs to be executed manually: {0}
schema.update.err.script_not_found=The schema script could not be found at location {0} schema.update.err.script_not_found=The schema script could not be found at location {0}
schema.update.err.statement_terminator=Scripts must terminate all statements with '';'' (line {0} of {1}). schema.update.err.statement_terminator=Scripts must terminate all statements with ';' (line {0} of {1}).

View File

@@ -36,8 +36,12 @@ import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.i18n.I18NUtil; import org.alfresco.i18n.I18NUtil;
import org.alfresco.repo.admin.patch.impl.SchemaUpgradeScriptPatch; import org.alfresco.repo.admin.patch.impl.SchemaUpgradeScriptPatch;
import org.alfresco.repo.content.filestore.FileContentWriter; import org.alfresco.repo.content.filestore.FileContentWriter;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.descriptor.Descriptor;
import org.alfresco.service.descriptor.DescriptorService;
import org.alfresco.util.AbstractLifecycleBean; import org.alfresco.util.AbstractLifecycleBean;
import org.alfresco.util.ApplicationContextHelper;
import org.alfresco.util.TempFileProvider; import org.alfresco.util.TempFileProvider;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
@@ -48,7 +52,7 @@ import org.hibernate.cfg.Configuration;
import org.hibernate.dialect.Dialect; import org.hibernate.dialect.Dialect;
import org.hibernate.tool.hbm2ddl.DatabaseMetadata; import org.hibernate.tool.hbm2ddl.DatabaseMetadata;
import org.hibernate.tool.hbm2ddl.SchemaExport; import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEvent;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
@@ -68,6 +72,7 @@ public class SchemaBootstrap extends AbstractLifecycleBean
private static final String MSG_EXECUTING_SCRIPT = "schema.update.msg.executing_script"; private static final String MSG_EXECUTING_SCRIPT = "schema.update.msg.executing_script";
private static final String MSG_OPTIONAL_STATEMENT_FAILED = "schema.update.msg.optional_statement_failed"; private static final String MSG_OPTIONAL_STATEMENT_FAILED = "schema.update.msg.optional_statement_failed";
private static final String MSG_DUMPING_SCHEMA_CREATE = "schema.update.msg.dumping_schema_create";
private static final String ERR_STATEMENT_FAILED = "schema.update.err.statement_failed"; private static final String ERR_STATEMENT_FAILED = "schema.update.err.statement_failed";
private static final String ERR_UPDATE_FAILED = "schema.update.err.update_failed"; private static final String ERR_UPDATE_FAILED = "schema.update.err.update_failed";
private static final String ERR_VALIDATION_FAILED = "schema.update.err.validation_failed"; private static final String ERR_VALIDATION_FAILED = "schema.update.err.validation_failed";
@@ -91,11 +96,16 @@ public class SchemaBootstrap extends AbstractLifecycleBean
applyUpdateScriptPatches = new ArrayList<SchemaUpgradeScriptPatch>(4); applyUpdateScriptPatches = new ArrayList<SchemaUpgradeScriptPatch>(4);
} }
public void setLocalSessionFactory(LocalSessionFactoryBean localSessionFactory) throws BeansException public void setLocalSessionFactory(LocalSessionFactoryBean localSessionFactory)
{ {
this.localSessionFactory = localSessionFactory; this.localSessionFactory = localSessionFactory;
} }
public LocalSessionFactoryBean getLocalSessionFactory()
{
return localSessionFactory;
}
/** /**
* Set this to output the full database creation script * Set this to output the full database creation script
* *
@@ -153,8 +163,17 @@ public class SchemaBootstrap extends AbstractLifecycleBean
this.applyUpdateScriptPatches = scriptPatches; this.applyUpdateScriptPatches = scriptPatches;
} }
private void dumpSchemaCreate(Configuration cfg, File schemaOutputFile) /**
* Helper method to generate a schema creation SQL script from the given Hibernate
* configuration.
*/
public static void dumpSchemaCreate(Configuration cfg, File schemaOutputFile)
{ {
if (logger.isInfoEnabled())
{
String msg = I18NUtil.getMessage(MSG_DUMPING_SCHEMA_CREATE, schemaOutputFile);
logger.info(msg);
}
// if the file exists, delete it // if the file exists, delete it
if (schemaOutputFile.exists()) if (schemaOutputFile.exists())
{ {
@@ -168,7 +187,7 @@ public class SchemaBootstrap extends AbstractLifecycleBean
schemaExport.execute(false, false, false, true); schemaExport.execute(false, false, false, true);
} }
private SessionFactory getLocalSessionFactory() private SessionFactory getSessionFactory()
{ {
return (SessionFactory) localSessionFactory.getObject(); return (SessionFactory) localSessionFactory.getObject();
} }
@@ -576,7 +595,7 @@ public class SchemaBootstrap extends AbstractLifecycleBean
protected void onBootstrap(ApplicationEvent event) protected void onBootstrap(ApplicationEvent event)
{ {
// do everything in a transaction // do everything in a transaction
Session session = getLocalSessionFactory().openSession(); Session session = getSessionFactory().openSession();
Transaction transaction = session.beginTransaction(); Transaction transaction = session.beginTransaction();
try try
{ {
@@ -624,4 +643,94 @@ public class SchemaBootstrap extends AbstractLifecycleBean
{ {
// NOOP // NOOP
} }
private static final String DIR_SCHEMAS = "schemas";
/**
* Dump a set of creation files for all known Hibernate dialects. These will be
* dumped into the default temporary location in a subdirectory named <b>schemas</b>.
*/
public static void main(String[] args)
{
int exitCode = 0;
try
{
exitCode = dumpDialects(args);
}
catch (Throwable e)
{
logger.error("SchemaBootstrap script dump failed", e);
exitCode = 1;
}
// We can exit
System.exit(exitCode);
}
private static int dumpDialects(String[] dialectClassNames)
{
if (dialectClassNames.length == 0)
{
System.out.println(
"\n" +
" ERROR: A list of fully qualified class names is required");
return 1;
}
ApplicationContext ctx = ApplicationContextHelper.getApplicationContext();
SchemaBootstrap schemaBootstrap = (SchemaBootstrap) ctx.getBean("schemaBootstrap");
LocalSessionFactoryBean localSessionFactoryBean = schemaBootstrap.getLocalSessionFactory();
Configuration configuration = localSessionFactoryBean.getConfiguration();
ServiceRegistry serviceRegistry = (ServiceRegistry) ctx.getBean(ServiceRegistry.SERVICE_REGISTRY);
DescriptorService descriptorService = serviceRegistry.getDescriptorService();
Descriptor descriptor = descriptorService.getServerDescriptor();
File tempDir = TempFileProvider.getTempDir();
File schemasDir = new File(tempDir, DIR_SCHEMAS);
if (!schemasDir.exists())
{
schemasDir.mkdir();
}
File dumpDir = new File(schemasDir, descriptor.getVersion());
if (!dumpDir.exists())
{
dumpDir.mkdir();
}
for (String dialectClassName : dialectClassNames)
{
Class dialectClazz = null;
try
{
dialectClazz = Class.forName(dialectClassName);
}
catch (ClassNotFoundException e)
{
System.out.println(
"\n" +
" ERROR: Class not found: " + dialectClassName);
continue;
}
if (!Dialect.class.isAssignableFrom(dialectClazz))
{
System.out.println(
"\n" +
" ERROR: The class name is not a valid dialect: " + dialectClassName);
continue;
}
dumpDialectScript(configuration, dialectClazz, dumpDir);
}
// Done
return 0;
}
private static void dumpDialectScript(Configuration configuration, Class dialectClazz, File directory)
{
// Set the dialect
configuration.setProperty("hibernate.dialect", dialectClazz.getName());
// First dump the dialect's schema
String filename = "default-schema-create-" + dialectClazz.getName() + ".sql";
File dumpFile = new File(directory, filename);
// Write the file
SchemaBootstrap.dumpSchemaCreate(configuration, dumpFile);
}
} }