FileDocCategorySizeDatePackage
SchemaExport.javaAPI DocHibernate 3.2.511584Tue Nov 07 21:30:04 GMT 2006org.hibernate.tool.hbm2ddl

SchemaExport

public class SchemaExport extends Object
Commandline tool to export table schema to the database. This class may also be called from inside an application.
author
Daniel Bradby, Gavin King

Fields Summary
private static final Log
log
private ConnectionHelper
connectionHelper
private String[]
dropSQL
private String[]
createSQL
private String
outputFile
private String
importFile
private org.hibernate.dialect.Dialect
dialect
private String
delimiter
private final List
exceptions
private boolean
haltOnError
private boolean
format
Constructors Summary
public SchemaExport(org.hibernate.cfg.Configuration cfg)
Create a schema exporter for the given Configuration


	        	 
	     
		this( cfg, cfg.getProperties() );
	
public SchemaExport(org.hibernate.cfg.Configuration cfg, org.hibernate.cfg.Settings settings)
Create a schema exporter for the given Configuration and given settings

		dialect = settings.getDialect();
		connectionHelper = new SuppliedConnectionProviderConnectionHelper(
				settings.getConnectionProvider()
		);
		dropSQL = cfg.generateDropSchemaScript( dialect );
		createSQL = cfg.generateSchemaCreationScript( dialect );
		format = settings.isFormatSqlEnabled();
	
public SchemaExport(org.hibernate.cfg.Configuration cfg, Properties properties)
Create a schema exporter for the given Configuration, with the given database connection properties.

deprecated
properties may be specified via the Configuration object

		dialect = Dialect.getDialect( properties );

		Properties props = new Properties();
		props.putAll( dialect.getDefaultProperties() );
		props.putAll( properties );

		connectionHelper = new ManagedProviderConnectionHelper( props );
		dropSQL = cfg.generateDropSchemaScript( dialect );
		createSQL = cfg.generateSchemaCreationScript( dialect );
		format = PropertiesHelper.getBoolean( Environment.FORMAT_SQL, props );
	
public SchemaExport(org.hibernate.cfg.Configuration cfg, Connection connection)

		this.connectionHelper = new SuppliedConnectionHelper( connection );
		dialect = Dialect.getDialect( cfg.getProperties() );
		dropSQL = cfg.generateDropSchemaScript( dialect );
		createSQL = cfg.generateSchemaCreationScript( dialect );
	
Methods Summary
private voidcreate(boolean script, boolean export, java.io.Writer fileOutput, java.sql.Statement statement)

		for ( int j = 0; j < createSQL.length; j++ ) {
			try {
				execute( script, export, fileOutput, statement, createSQL[j] );
			}
			catch ( SQLException e ) {
				if ( haltOnError ) {
					throw new JDBCException( "Error during DDL export", e );
				}
				exceptions.add( e );
				log.error( "Unsuccessful: " + createSQL[j] );
				log.error( e.getMessage() );
			}
		}
	
public voidcreate(boolean script, boolean export)
Run the schema creation script.

param
script print the DDL to the console
param
export export the script to the database

		execute( script, export, false, false );
	
private voiddrop(boolean script, boolean export, java.io.Writer fileOutput, java.sql.Statement statement)

		for ( int i = 0; i < dropSQL.length; i++ ) {
			try {
				execute( script, export, fileOutput, statement, dropSQL[i] );
			}
			catch ( SQLException e ) {
				exceptions.add( e );
				log.debug( "Unsuccessful: " + dropSQL[i] );
				log.debug( e.getMessage() );
			}
		}
	
public voiddrop(boolean script, boolean export)
Run the drop schema script.

param
script print the DDL to the console
param
export export the script to the database

		execute( script, export, true, false );
	
public voidexecute(boolean script, boolean export, boolean justDrop, boolean justCreate)


		log.info( "Running hbm2ddl schema export" );

		Connection connection = null;
		Writer outputFileWriter = null;
		Reader importFileReader = null;
		Statement statement = null;

		exceptions.clear();

		try {

			try {
				InputStream stream = ConfigHelper.getResourceAsStream( importFile );
				importFileReader = new InputStreamReader( stream );
			}
			catch ( HibernateException e ) {
				log.debug( "import file not found: " + importFile );
			}

			if ( outputFile != null ) {
				log.info( "writing generated schema to file: " + outputFile );
				outputFileWriter = new FileWriter( outputFile );
			}

			if ( export ) {
				log.info( "exporting generated schema to database" );
				connectionHelper.prepare( true );
				connection = connectionHelper.getConnection();
				statement = connection.createStatement();
			}

			if ( !justCreate ) {
				drop( script, export, outputFileWriter, statement );
			}

			if ( !justDrop ) {
				create( script, export, outputFileWriter, statement );
				if ( export && importFileReader != null ) {
					importScript( importFileReader, statement );
				}
			}

			log.info( "schema export complete" );

		}

		catch ( Exception e ) {
			exceptions.add( e );
			log.error( "schema export unsuccessful", e );
		}

		finally {

			try {
				if ( statement != null ) {
					statement.close();
				}
				if ( connection != null ) {
					connectionHelper.release();
				}
			}
			catch ( Exception e ) {
				exceptions.add( e );
				log.error( "Could not close connection", e );
			}

			try {
				if ( outputFileWriter != null ) {
					outputFileWriter.close();
				}
				if ( importFileReader != null ) {
					importFileReader.close();
				}
			}
			catch ( IOException ioe ) {
				exceptions.add( ioe );
				log.error( "Error closing output file: " + outputFile, ioe );
			}

		}
	
private voidexecute(boolean script, boolean export, java.io.Writer fileOutput, java.sql.Statement statement, java.lang.String sql)

		String formatted = format( sql );
		if ( delimiter != null ) {
			formatted += delimiter;
		}
		if ( script ) {
			System.out.println( formatted );
		}
		log.debug( formatted );
		if ( outputFile != null ) {
			fileOutput.write( formatted + "\n" );
		}
		if ( export ) {
			statement.executeUpdate( sql );
			SQLWarning warnings = statement.getWarnings();
			if ( warnings != null) {
					JDBCExceptionReporter.logAndClearWarnings( connectionHelper.getConnection() );
			}
		}

		
	
private java.lang.Stringformat(java.lang.String sql)

		return format ?
		       new DDLFormatter( sql ).format() :
		       sql;
	
public java.util.ListgetExceptions()
Returns a List of all Exceptions which occured during the export.

return
A List containig the Exceptions occured during the export

		return exceptions;
	
private voidimportScript(java.io.Reader importFileReader, java.sql.Statement statement)

		log.info( "Executing import script: " + importFile );
		BufferedReader reader = new BufferedReader( importFileReader );
		for ( String sql = reader.readLine(); sql != null; sql = reader.readLine() ) {
			try {
				String trimmedSql = sql.trim();
				if ( trimmedSql.length() == 0 ||
				     trimmedSql.startsWith( "--" ) ||
				     trimmedSql.startsWith( "//" ) ||
				     trimmedSql.startsWith( "/*" ) ) {
					continue;
				}
				else {
					if ( trimmedSql.endsWith( ";" ) ) {
						trimmedSql = trimmedSql.substring( 0, trimmedSql.length() - 1 );
					}
					log.debug( trimmedSql );
					statement.execute( trimmedSql );
				}
			}
			catch ( SQLException e ) {
				throw new JDBCException( "Error during import script execution", e );
			}
		}
	
public static voidmain(java.lang.String[] args)

		try {
			Configuration cfg = new Configuration();

			boolean script = true;
			boolean drop = false;
			boolean create = false;
			boolean halt = false;
			boolean export = true;
			String outFile = null;
			String importFile = "/import.sql";
			String propFile = null;
			boolean format = false;
			String delim = null;

			for ( int i = 0; i < args.length; i++ ) {
				if ( args[i].startsWith( "--" ) ) {
					if ( args[i].equals( "--quiet" ) ) {
						script = false;
					}
					else if ( args[i].equals( "--drop" ) ) {
						drop = true;
					}
					else if ( args[i].equals( "--create" ) ) {
						create = true;
					}
					else if ( args[i].equals( "--haltonerror" ) ) {
						halt = true;
					}
					else if ( args[i].equals( "--text" ) ) {
						export = false;
					}
					else if ( args[i].startsWith( "--output=" ) ) {
						outFile = args[i].substring( 9 );
					}
					else if ( args[i].startsWith( "--import=" ) ) {
						importFile = args[i].substring( 9 );
					}
					else if ( args[i].startsWith( "--properties=" ) ) {
						propFile = args[i].substring( 13 );
					}
					else if ( args[i].equals( "--format" ) ) {
						format = true;
					}
					else if ( args[i].startsWith( "--delimiter=" ) ) {
						delim = args[i].substring( 12 );
					}
					else if ( args[i].startsWith( "--config=" ) ) {
						cfg.configure( args[i].substring( 9 ) );
					}
					else if ( args[i].startsWith( "--naming=" ) ) {
						cfg.setNamingStrategy(
								( NamingStrategy ) ReflectHelper.classForName( args[i].substring( 9 ) )
										.newInstance()
						);
					}
				}
				else {
					String filename = args[i];
					if ( filename.endsWith( ".jar" ) ) {
						cfg.addJar( new File( filename ) );
					}
					else {
						cfg.addFile( filename );
					}
				}

			}

			if ( propFile != null ) {
				Properties props = new Properties();
				props.putAll( cfg.getProperties() );
				props.load( new FileInputStream( propFile ) );
				cfg.setProperties( props );
			}

			SchemaExport se = new SchemaExport( cfg )
					.setHaltOnError( halt )
					.setOutputFile( outFile )
					.setImportFile( importFile )
					.setDelimiter( delim );
			if ( format ) {
				se.setFormat( true );
			}
			se.execute( script, export, drop, create );

		}
		catch ( Exception e ) {
			log.error( "Error creating schema ", e );
			e.printStackTrace();
		}
	
public org.hibernate.tool.hbm2ddl.SchemaExportsetDelimiter(java.lang.String delimiter)
Set the end of statement delimiter

		this.delimiter = delimiter;
		return this;
	
public org.hibernate.tool.hbm2ddl.SchemaExportsetFormat(boolean format)

		this.format = format;
		return this;
	
public org.hibernate.tool.hbm2ddl.SchemaExportsetHaltOnError(boolean haltOnError)

		this.haltOnError = haltOnError;
		return this;
	
public org.hibernate.tool.hbm2ddl.SchemaExportsetImportFile(java.lang.String filename)

		importFile = filename;
		return this;
	
public org.hibernate.tool.hbm2ddl.SchemaExportsetOutputFile(java.lang.String filename)
Set an output filename. The generated script will be written to this file.

		outputFile = filename;
		return this;