HBX-757 fix
git-svn-id: https://svn.jboss.org/repos/hibernate/core/trunk@15139 1b8cb986-b30d-0410-93ca-fae66ebed9b2
This commit is contained in:
parent
39123a97fc
commit
879d8900d9
|
@ -25,6 +25,8 @@
|
||||||
package org.hibernate.tool.hbm2ddl;
|
package org.hibernate.tool.hbm2ddl;
|
||||||
|
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.Writer;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
|
@ -32,14 +34,20 @@ import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
|
import org.hibernate.JDBCException;
|
||||||
import org.hibernate.cfg.Configuration;
|
import org.hibernate.cfg.Configuration;
|
||||||
|
import org.hibernate.cfg.Environment;
|
||||||
import org.hibernate.cfg.NamingStrategy;
|
import org.hibernate.cfg.NamingStrategy;
|
||||||
import org.hibernate.cfg.Settings;
|
import org.hibernate.cfg.Settings;
|
||||||
import org.hibernate.dialect.Dialect;
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.jdbc.util.FormatStyle;
|
||||||
|
import org.hibernate.jdbc.util.Formatter;
|
||||||
|
import org.hibernate.jdbc.util.SQLStatementLogger;
|
||||||
|
import org.hibernate.util.PropertiesHelper;
|
||||||
import org.hibernate.util.ReflectHelper;
|
import org.hibernate.util.ReflectHelper;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A commandline tool to update a database schema. May also be called from
|
* A commandline tool to update a database schema. May also be called from
|
||||||
|
@ -54,6 +62,12 @@ public class SchemaUpdate {
|
||||||
private Configuration configuration;
|
private Configuration configuration;
|
||||||
private Dialect dialect;
|
private Dialect dialect;
|
||||||
private List exceptions;
|
private List exceptions;
|
||||||
|
private boolean haltOnError = false;
|
||||||
|
private boolean format = true;
|
||||||
|
private String outputFile = null;
|
||||||
|
private String delimiter;
|
||||||
|
private Formatter formatter;
|
||||||
|
private SQLStatementLogger sqlStatementLogger;
|
||||||
|
|
||||||
public SchemaUpdate(Configuration cfg) throws HibernateException {
|
public SchemaUpdate(Configuration cfg) throws HibernateException {
|
||||||
this( cfg, cfg.getProperties() );
|
this( cfg, cfg.getProperties() );
|
||||||
|
@ -67,6 +81,7 @@ public class SchemaUpdate {
|
||||||
props.putAll( connectionProperties );
|
props.putAll( connectionProperties );
|
||||||
connectionHelper = new ManagedProviderConnectionHelper( props );
|
connectionHelper = new ManagedProviderConnectionHelper( props );
|
||||||
exceptions = new ArrayList();
|
exceptions = new ArrayList();
|
||||||
|
formatter = ( PropertiesHelper.getBoolean( Environment.FORMAT_SQL, props ) ? FormatStyle.DDL : FormatStyle.NONE ).getFormatter();
|
||||||
}
|
}
|
||||||
|
|
||||||
public SchemaUpdate(Configuration cfg, Settings settings) throws HibernateException {
|
public SchemaUpdate(Configuration cfg, Settings settings) throws HibernateException {
|
||||||
|
@ -76,6 +91,8 @@ public class SchemaUpdate {
|
||||||
settings.getConnectionProvider()
|
settings.getConnectionProvider()
|
||||||
);
|
);
|
||||||
exceptions = new ArrayList();
|
exceptions = new ArrayList();
|
||||||
|
sqlStatementLogger = settings.getSqlStatementLogger();
|
||||||
|
formatter = ( sqlStatementLogger.isFormatSql() ? FormatStyle.DDL : FormatStyle.NONE ).getFormatter();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
@ -139,6 +156,7 @@ public class SchemaUpdate {
|
||||||
|
|
||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
Statement stmt = null;
|
Statement stmt = null;
|
||||||
|
Writer outputFileWriter = null;
|
||||||
|
|
||||||
exceptions.clear();
|
exceptions.clear();
|
||||||
|
|
||||||
|
@ -160,20 +178,36 @@ public class SchemaUpdate {
|
||||||
|
|
||||||
log.info( "updating schema" );
|
log.info( "updating schema" );
|
||||||
|
|
||||||
|
|
||||||
|
if ( outputFile != null ) {
|
||||||
|
log.info( "writing generated schema to file: " + outputFile );
|
||||||
|
outputFileWriter = new FileWriter( outputFile );
|
||||||
|
}
|
||||||
|
|
||||||
String[] createSQL = configuration.generateSchemaUpdateScript( dialect, meta );
|
String[] createSQL = configuration.generateSchemaUpdateScript( dialect, meta );
|
||||||
for ( int j = 0; j < createSQL.length; j++ ) {
|
for ( int j = 0; j < createSQL.length; j++ ) {
|
||||||
|
|
||||||
final String sql = createSQL[j];
|
final String sql = createSQL[j];
|
||||||
|
String formatted = formatter.format( sql );
|
||||||
try {
|
try {
|
||||||
|
if ( delimiter != null ) {
|
||||||
|
formatted += delimiter;
|
||||||
|
}
|
||||||
if ( script ) {
|
if ( script ) {
|
||||||
System.out.println( sql );
|
System.out.println( formatted );
|
||||||
|
}
|
||||||
|
if ( outputFile != null ) {
|
||||||
|
outputFileWriter.write( formatted + "\n" );
|
||||||
}
|
}
|
||||||
if ( doUpdate ) {
|
if ( doUpdate ) {
|
||||||
log.debug( sql );
|
log.debug( sql );
|
||||||
stmt.executeUpdate( sql );
|
stmt.executeUpdate( formatted );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch ( SQLException e ) {
|
catch ( SQLException e ) {
|
||||||
|
if ( haltOnError ) {
|
||||||
|
throw new JDBCException( "Error during DDL export", e );
|
||||||
|
}
|
||||||
exceptions.add( e );
|
exceptions.add( e );
|
||||||
log.error( "Unsuccessful: " + sql );
|
log.error( "Unsuccessful: " + sql );
|
||||||
log.error( e.getMessage() );
|
log.error( e.getMessage() );
|
||||||
|
@ -199,7 +233,15 @@ public class SchemaUpdate {
|
||||||
exceptions.add( e );
|
exceptions.add( e );
|
||||||
log.error( "Error closing connection", e );
|
log.error( "Error closing connection", e );
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
if( outputFileWriter != null ) {
|
||||||
|
outputFileWriter.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(Exception e) {
|
||||||
|
exceptions.add(e);
|
||||||
|
log.error( "Error closing connection", e );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -211,4 +253,21 @@ public class SchemaUpdate {
|
||||||
public List getExceptions() {
|
public List getExceptions() {
|
||||||
return exceptions;
|
return exceptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setHaltOnError(boolean haltOnError) {
|
||||||
|
this.haltOnError = haltOnError;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFormat(boolean format) {
|
||||||
|
this.formatter = ( format ? FormatStyle.DDL : FormatStyle.NONE ).getFormatter();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOutputFile(String outputFile) {
|
||||||
|
this.outputFile = outputFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDelimiter(String delimiter) {
|
||||||
|
this.delimiter = delimiter;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,10 +70,14 @@ public class SchemaUpdateTask extends MatchingTask {
|
||||||
private List fileSets = new LinkedList();
|
private List fileSets = new LinkedList();
|
||||||
private File propertiesFile = null;
|
private File propertiesFile = null;
|
||||||
private File configurationFile = null;
|
private File configurationFile = null;
|
||||||
|
private File outputFile = null;
|
||||||
private boolean quiet = false;
|
private boolean quiet = false;
|
||||||
private boolean text = true;
|
private boolean text = true;
|
||||||
|
private boolean haltOnError = false;
|
||||||
|
private String delimiter = null;
|
||||||
private String namingStrategy = null;
|
private String namingStrategy = null;
|
||||||
|
|
||||||
|
|
||||||
public void addFileset(FileSet set) {
|
public void addFileset(FileSet set) {
|
||||||
fileSets.add(set);
|
fileSets.add(set);
|
||||||
}
|
}
|
||||||
|
@ -122,6 +126,8 @@ public class SchemaUpdateTask extends MatchingTask {
|
||||||
*/
|
*/
|
||||||
public void execute() throws BuildException {
|
public void execute() throws BuildException {
|
||||||
try {
|
try {
|
||||||
|
log("Running Hibernate Core SchemaUpdate.");
|
||||||
|
log("This is an Ant task supporting only mapping files, if you want to use annotations see http://tools.hibernate.org.");
|
||||||
Configuration cfg = getConfiguration();
|
Configuration cfg = getConfiguration();
|
||||||
getSchemaUpdate(cfg).execute(!quiet, !text);
|
getSchemaUpdate(cfg).execute(!quiet, !text);
|
||||||
}
|
}
|
||||||
|
@ -195,11 +201,39 @@ public class SchemaUpdateTask extends MatchingTask {
|
||||||
properties.load( new FileInputStream(propertiesFile) );
|
properties.load( new FileInputStream(propertiesFile) );
|
||||||
}
|
}
|
||||||
cfg.setProperties(properties);
|
cfg.setProperties(properties);
|
||||||
return new SchemaUpdate(cfg);
|
SchemaUpdate su = new SchemaUpdate(cfg);
|
||||||
|
su.setOutputFile( outputFile.getPath() );
|
||||||
|
su.setDelimiter(delimiter);
|
||||||
|
su.setHaltOnError(haltOnError);
|
||||||
|
return su;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setNamingStrategy(String namingStrategy) {
|
public void setNamingStrategy(String namingStrategy) {
|
||||||
this.namingStrategy = namingStrategy;
|
this.namingStrategy = namingStrategy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public File getOutputFile() {
|
||||||
|
return outputFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOutputFile(File outputFile) {
|
||||||
|
this.outputFile = outputFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isHaltOnError() {
|
||||||
|
return haltOnError;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHaltOnError(boolean haltOnError) {
|
||||||
|
this.haltOnError = haltOnError;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDelimiter() {
|
||||||
|
return delimiter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDelimiter(String delimiter) {
|
||||||
|
this.delimiter = delimiter;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue