/** * Generate the appropriate 'create table' and matching 'drop table' statements and add them to * the 'apply' and 'rollback' buffers. */ @Override public void generate(DdlWrite writer, CreateTable createTable) throws IOException { reset(); String tableName = lowerName(createTable.getName()); List<Column> columns = createTable.getColumn(); List<Column> pk = determinePrimaryKeyColumns(columns); boolean singleColumnPrimaryKey = pk.size() == 1; boolean useIdentity = false; boolean useSequence = false; if (singleColumnPrimaryKey) { IdType useDbIdentityType = platformDdl.useIdentityType(createTable.getIdentityType()); useIdentity = (IdType.IDENTITY == useDbIdentityType); useSequence = (IdType.SEQUENCE == useDbIdentityType); } DdlBuffer apply = writer.apply(); apply.append("create table ").append(tableName).append(" ("); for (int i = 0; i < columns.size(); i++) { apply.newLine(); writeColumnDefinition(apply, columns.get(i), useIdentity); if (i < columns.size() - 1) { apply.append(","); } } writeCheckConstraints(apply, createTable); writeUniqueConstraints(apply, createTable); writeCompoundUniqueConstraints(apply, createTable); if (!pk.isEmpty()) { // defined on the columns writePrimaryKeyConstraint(apply, tableName, toColumnNames(pk)); } apply.newLine().append(")").endOfStatement(); // add drop table to the rollback buffer - do this before // we drop the related sequence (if sequences are used) dropTable(writer.rollback(), tableName); if (useSequence) { writeSequence(writer, createTable); } // add blank line for a bit of whitespace between tables apply.end(); writer.rollback().end(); writeAddForeignKeys(writer, createTable); if (isTrue(createTable.isWithHistory())) { createWithHistory(writer, createTable.getName()); } }