package liquibase.sqlgenerator.core; import java.util.ArrayList; import java.util.SortedSet; import liquibase.database.Database; import liquibase.exception.ValidationErrors; import liquibase.sql.Sql; import liquibase.sql.UnparsedSql; import liquibase.sqlgenerator.SqlGenerator; import liquibase.sqlgenerator.SqlGeneratorChain; import liquibase.sqlgenerator.SqlGeneratorFactory; import liquibase.statement.core.InsertSetStatement; import liquibase.statement.core.InsertStatement; import liquibase.structure.core.Relation; import liquibase.structure.core.Table; public class InsertSetGenerator extends AbstractSqlGenerator<InsertSetStatement> { @Override public ValidationErrors validate(InsertSetStatement insertStatementSet, Database database, SqlGeneratorChain sqlGeneratorChain) { ValidationErrors validationErrors = new ValidationErrors(); validationErrors.checkRequiredField("tableName", insertStatementSet.peek().getTableName()); validationErrors.checkRequiredField("columns", insertStatementSet.peek().getColumnValues()); // it is an error if any of the individual statements have a different table,schema, or catalog. // if (insertStatement.getSchemaName() != null && !database.supportsSchemas()) { // validationErrors.addError("Database does not support schemas"); // } return validationErrors; } @Override public Sql[] generateSql(InsertSetStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) { if (statement.peek() == null) { return new UnparsedSql[0]; } StringBuffer sql = new StringBuffer(); generateHeader(sql, statement, database); ArrayList<Sql> result = new ArrayList<Sql>(); int index = 0; for (InsertStatement sttmnt : statement.getStatements()) { index++; getInsertGenerator(database).generateValues(sql, sttmnt, database); sql.append(","); if (index > statement.getBatchThreshold()) { result.add(completeStatement(statement, sql)); index = 0; sql = new StringBuffer(); generateHeader(sql, statement, database); } } if (index > 0) { result.add(completeStatement(statement, sql)); } return result.toArray(new UnparsedSql[result.size()]); } private Sql completeStatement(InsertSetStatement statement, StringBuffer sql) { sql.deleteCharAt(sql.lastIndexOf(",")); sql.append(";\n"); return new UnparsedSql(sql.toString(), getAffectedTable(statement)); } public void generateHeader(StringBuffer sql,InsertSetStatement statement, Database database) { InsertStatement insert=statement.peek(); getInsertGenerator(database).generateHeader(sql, insert, database); } protected InsertGenerator getInsertGenerator(Database database) { SortedSet<SqlGenerator> generators = SqlGeneratorFactory.getInstance().getGenerators(new InsertStatement(null, null, null), database); if (generators == null || generators.size() == 0) { return null; } return (InsertGenerator) generators.iterator().next(); } protected Relation getAffectedTable(InsertSetStatement statement) { return new Table().setName(statement.getTableName()).setSchema(statement.getCatalogName(), statement.getSchemaName()); } }