Search in sources :

Example 6 with Schema

use of liquibase.structure.core.Schema in project liquibase by liquibase.

the class SchemaSnapshotGenerator method snapshotObject.

@Override
protected DatabaseObject snapshotObject(DatabaseObject example, DatabaseSnapshot snapshot) throws DatabaseException, InvalidExampleException {
    Database database = snapshot.getDatabase();
    Schema match = null;
    String catalogName = ((Schema) example).getCatalogName();
    String schemaName = example.getName();
    if (database.supportsSchemas()) {
        if (catalogName == null) {
            catalogName = database.getDefaultCatalogName();
        }
        if (schemaName == null) {
            schemaName = database.getDefaultSchemaName();
        }
    } else {
        if (database.supportsCatalogs()) {
            if (catalogName == null && schemaName != null) {
                catalogName = schemaName;
                schemaName = null;
            }
        } else {
            catalogName = null;
            schemaName = null;
        }
    }
    example = new Schema(catalogName, schemaName);
    // use LEGACY quoting since we're dealing with system objects
    ObjectQuotingStrategy currentStrategy = database.getObjectQuotingStrategy();
    database.setObjectQuotingStrategy(ObjectQuotingStrategy.LEGACY);
    try {
        if (database.supportsSchemas()) {
            for (String tableSchema : getDatabaseSchemaNames(database)) {
                CatalogAndSchema schemaFromJdbcInfo = toCatalogAndSchema(tableSchema, database);
                Catalog catalog = new Catalog(schemaFromJdbcInfo.getCatalogName());
                Schema schema = new Schema(catalog, tableSchema);
                if (DatabaseObjectComparatorFactory.getInstance().isSameObject(schema, example, snapshot.getSchemaComparisons(), database)) {
                    if (match == null) {
                        match = schema;
                    } else {
                        throw new InvalidExampleException("Found multiple catalog/schemas matching " + ((Schema) example).getCatalogName() + "." + example.getName());
                    }
                }
            }
        } else {
            Catalog catalog = new Catalog(catalogName);
            match = new Schema(catalog, catalogName);
        }
    } catch (SQLException e) {
        throw new DatabaseException(e);
    } finally {
        database.setObjectQuotingStrategy(currentStrategy);
    }
    if (match != null && (match.getName() == null || match.getName().equalsIgnoreCase(database.getDefaultSchemaName()))) {
        match.setDefault(true);
    }
    return match;
}
Also used : InvalidExampleException(liquibase.snapshot.InvalidExampleException) SQLException(java.sql.SQLException) Schema(liquibase.structure.core.Schema) CatalogAndSchema(liquibase.CatalogAndSchema) Database(liquibase.database.Database) AbstractJdbcDatabase(liquibase.database.AbstractJdbcDatabase) CatalogAndSchema(liquibase.CatalogAndSchema) DatabaseException(liquibase.exception.DatabaseException) ObjectQuotingStrategy(liquibase.database.ObjectQuotingStrategy) Catalog(liquibase.structure.core.Catalog)

Example 7 with Schema

use of liquibase.structure.core.Schema in project liquibase by liquibase.

the class SequenceSnapshotGenerator method addTo.

@Override
protected void addTo(DatabaseObject foundObject, DatabaseSnapshot snapshot) throws DatabaseException, InvalidExampleException {
    if (!snapshot.getDatabase().supportsSequences()) {
        return;
    }
    if (foundObject instanceof Schema) {
        Schema schema = (Schema) foundObject;
        Database database = snapshot.getDatabase();
        if (!database.supportsSequences()) {
            updateListeners("Sequences not supported for " + database.toString() + " ...");
        }
        //noinspection unchecked
        List<Map<String, ?>> sequences = ExecutorService.getInstance().getExecutor(database).queryForList(new RawSqlStatement(getSelectSequenceSql(schema, database)));
        if (sequences != null) {
            for (Map<String, ?> sequence : sequences) {
                schema.addDatabaseObject(mapToSequence(sequence, (Schema) foundObject, database));
            }
        }
    }
}
Also used : RawSqlStatement(liquibase.statement.core.RawSqlStatement) Schema(liquibase.structure.core.Schema) CatalogAndSchema(liquibase.CatalogAndSchema) Database(liquibase.database.Database) Map(java.util.Map)

Example 8 with Schema

use of liquibase.structure.core.Schema in project liquibase by liquibase.

the class CreateTableGeneratorInformix method generateSql.

@Override
public Sql[] generateSql(CreateTableStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) {
    StringBuilder buffer = new StringBuilder();
    buffer.append("CREATE TABLE ").append(database.escapeTableName(statement.getCatalogName(), statement.getSchemaName(), statement.getTableName())).append(" ");
    buffer.append("(");
    boolean isSinglePrimaryKeyColumn = statement.getPrimaryKeyConstraint() != null && statement.getPrimaryKeyConstraint().getColumns().size() == 1;
    boolean isPrimaryKeyAutoIncrement = false;
    Iterator<String> columnIterator = statement.getColumns().iterator();
    List<String> primaryKeyColumns = new LinkedList<String>();
    while (columnIterator.hasNext()) {
        String column = columnIterator.next();
        buffer.append(database.escapeColumnName(statement.getCatalogName(), statement.getSchemaName(), statement.getTableName(), column));
        buffer.append(" ").append(statement.getColumnTypes().get(column).toDatabaseDataType(database).toSql());
        AutoIncrementConstraint autoIncrementConstraint = null;
        for (AutoIncrementConstraint currentAutoIncrementConstraint : statement.getAutoIncrementConstraints()) {
            if (column.equals(currentAutoIncrementConstraint.getColumnName())) {
                autoIncrementConstraint = currentAutoIncrementConstraint;
                break;
            }
        }
        boolean isAutoIncrementColumn = autoIncrementConstraint != null;
        boolean isPrimaryKeyColumn = statement.getPrimaryKeyConstraint() != null && statement.getPrimaryKeyConstraint().getColumns().contains(column);
        isPrimaryKeyAutoIncrement = isPrimaryKeyAutoIncrement || isPrimaryKeyColumn && isAutoIncrementColumn;
        if (isPrimaryKeyColumn) {
            primaryKeyColumns.add(column);
        }
        if (statement.getDefaultValue(column) != null) {
            Object defaultValue = statement.getDefaultValue(column);
            buffer.append(" DEFAULT ");
            buffer.append(statement.getColumnTypes().get(column).objectToSql(defaultValue, database));
        }
        if (isAutoIncrementColumn) {
            // TODO: check if database supports auto increment on non primary key column
            if (database.supportsAutoIncrement()) {
                String autoIncrementClause = database.getAutoIncrementClause(autoIncrementConstraint.getStartWith(), autoIncrementConstraint.getIncrementBy());
                if (autoIncrementClause.length() > 0) {
                    buffer.append(" ").append(autoIncrementClause);
                }
            } else {
                LogFactory.getLogger().warning(database.getShortName() + " does not support autoincrement columns as requested for " + (database.escapeTableName(statement.getCatalogName(), statement.getSchemaName(), statement.getTableName())));
            }
        }
        if (statement.getNotNullColumns().contains(column)) {
            buffer.append(" NOT NULL");
        }
        if (columnIterator.hasNext()) {
            buffer.append(", ");
        }
    }
    buffer.append(",");
    // Fix according to: https://liquibase.jira.com/browse/CORE-1775
    if (isSinglePrimaryKeyColumn && isPrimaryKeyAutoIncrement) {
        if (statement.getPrimaryKeyConstraint() != null && statement.getPrimaryKeyConstraint().getColumns().size() > 0) {
            buffer.append(" PRIMARY KEY (");
            buffer.append(StringUtils.join(primaryKeyColumns, ", "));
            buffer.append(")");
            // Setting up table space for PK's index if it exist
            buffer.append(",");
        }
    }
    for (ForeignKeyConstraint fkConstraint : statement.getForeignKeyConstraints()) {
        String referencesString = fkConstraint.getReferences();
        if (!referencesString.contains(".") && database.getDefaultSchemaName() != null) {
            referencesString = database.getDefaultSchemaName() + "." + referencesString;
        }
        buffer.append(" FOREIGN KEY (").append(database.escapeColumnName(statement.getCatalogName(), statement.getSchemaName(), statement.getTableName(), fkConstraint.getColumn())).append(") REFERENCES ").append(referencesString);
        if (fkConstraint.isDeleteCascade()) {
            buffer.append(" ON DELETE CASCADE");
        }
        buffer.append(" CONSTRAINT ");
        buffer.append(database.escapeConstraintName(fkConstraint.getForeignKeyName()));
        if (fkConstraint.isInitiallyDeferred()) {
            buffer.append(" INITIALLY DEFERRED");
        }
        if (fkConstraint.isDeferrable()) {
            buffer.append(" DEFERRABLE");
        }
        buffer.append(",");
    }
    for (UniqueConstraint uniqueConstraint : statement.getUniqueConstraints()) {
        if (uniqueConstraint.getConstraintName() != null && !constraintNameAfterUnique(database)) {
            buffer.append(" CONSTRAINT ");
            buffer.append(database.escapeConstraintName(uniqueConstraint.getConstraintName()));
        }
        buffer.append(" UNIQUE (");
        buffer.append(database.escapeColumnNameList(StringUtils.join(uniqueConstraint.getColumns(), ", ")));
        buffer.append(")");
        if (uniqueConstraint.getConstraintName() != null && constraintNameAfterUnique(database)) {
            buffer.append(" CONSTRAINT ");
            buffer.append(database.escapeConstraintName(uniqueConstraint.getConstraintName()));
        }
        buffer.append(",");
    }
    String sql = buffer.toString().replaceFirst(",\\s*$", "") + ")";
    if (statement.getTablespace() != null && database.supportsTablespaces()) {
        sql += " IN " + statement.getTablespace();
    }
    return new Sql[] { new UnparsedSql(sql, new Table().setName(statement.getTableName()).setSchema(new Schema(statement.getCatalogName(), statement.getSchemaName()))) };
}
Also used : AutoIncrementConstraint(liquibase.statement.AutoIncrementConstraint) Table(liquibase.structure.core.Table) UnparsedSql(liquibase.sql.UnparsedSql) ForeignKeyConstraint(liquibase.statement.ForeignKeyConstraint) Schema(liquibase.structure.core.Schema) UniqueConstraint(liquibase.statement.UniqueConstraint) LinkedList(java.util.LinkedList) Sql(liquibase.sql.Sql) UnparsedSql(liquibase.sql.UnparsedSql)

Example 9 with Schema

use of liquibase.structure.core.Schema in project liquibase by liquibase.

the class CreateProcedureGenerator method surroundWithSchemaSets.

/**
     * Convenience method for when the schemaName is set but we don't want to parse the body
     */
public static void surroundWithSchemaSets(List<Sql> sql, String schemaName, Database database) {
    if ((StringUtils.trimToNull(schemaName) != null) && !LiquibaseConfiguration.getInstance().getProperty(ChangeLogParserCofiguration.class, ChangeLogParserCofiguration.USE_PROCEDURE_SCHEMA).getValue(Boolean.class)) {
        String defaultSchema = database.getDefaultSchemaName();
        if (database instanceof OracleDatabase) {
            sql.add(0, new UnparsedSql("ALTER SESSION SET CURRENT_SCHEMA=" + database.escapeObjectName(schemaName, Schema.class)));
            sql.add(new UnparsedSql("ALTER SESSION SET CURRENT_SCHEMA=" + database.escapeObjectName(defaultSchema, Schema.class)));
        } else if (database instanceof DB2Database) {
            sql.add(0, new UnparsedSql("SET CURRENT SCHEMA " + schemaName));
            sql.add(new UnparsedSql("SET CURRENT SCHEMA " + defaultSchema));
        }
    }
}
Also used : OracleDatabase(liquibase.database.core.OracleDatabase) DB2Database(liquibase.database.core.DB2Database) UnparsedSql(liquibase.sql.UnparsedSql) Schema(liquibase.structure.core.Schema) ChangeLogParserCofiguration(liquibase.parser.ChangeLogParserCofiguration)

Example 10 with Schema

use of liquibase.structure.core.Schema in project liquibase by liquibase.

the class CreateProcedureGenerator method addSchemaToText.

/**
     * Convenience method for other classes similar to this that want to be able to modify the procedure text to add the schema
     */
public static String addSchemaToText(String procedureText, String schemaName, String keywordBeforeName, Database database) {
    if (schemaName == null) {
        return procedureText;
    }
    if ((StringUtils.trimToNull(schemaName) != null) && LiquibaseConfiguration.getInstance().getProperty(ChangeLogParserCofiguration.class, ChangeLogParserCofiguration.USE_PROCEDURE_SCHEMA).getValue(Boolean.class)) {
        StringClauses parsedSql = SqlParser.parse(procedureText, true, true);
        StringClauses.ClauseIterator clauseIterator = parsedSql.getClauseIterator();
        Object next = "START";
        while (next != null && !next.toString().equalsIgnoreCase(keywordBeforeName) && clauseIterator.hasNext()) {
            if (!keywordBeforeName.equalsIgnoreCase("PACKAGE") && ((String) next).equalsIgnoreCase("PACKAGE")) {
                return procedureText;
            }
            next = clauseIterator.nextNonWhitespace();
        }
        if (next != null && clauseIterator.hasNext()) {
            Object procNameClause = clauseIterator.nextNonWhitespace();
            if (procNameClause instanceof String) {
                String[] nameParts = ((String) procNameClause).split("\\.");
                String finalName;
                if (nameParts.length == 1) {
                    finalName = database.escapeObjectName(schemaName, Schema.class) + "." + nameParts[0];
                } else if (nameParts.length == 2) {
                    finalName = database.escapeObjectName(schemaName, Schema.class) + "." + nameParts[1];
                } else if (nameParts.length == 3) {
                    finalName = nameParts[0] + "." + database.escapeObjectName(schemaName, Schema.class) + "." + nameParts[2];
                } else {
                    //just go with what was there
                    finalName = (String) procNameClause;
                }
                clauseIterator.replace(finalName);
            }
            procedureText = parsedSql.toString();
        }
    }
    return procedureText;
}
Also used : Schema(liquibase.structure.core.Schema) StringClauses(liquibase.util.StringClauses)

Aggregations

Schema (liquibase.structure.core.Schema)23 CatalogAndSchema (liquibase.CatalogAndSchema)9 Table (liquibase.structure.core.Table)6 Database (liquibase.database.Database)5 OracleDatabase (liquibase.database.core.OracleDatabase)4 SQLException (java.sql.SQLException)3 AbstractJdbcDatabase (liquibase.database.AbstractJdbcDatabase)3 DatabaseException (liquibase.exception.DatabaseException)3 RawSqlStatement (liquibase.statement.core.RawSqlStatement)3 Column (liquibase.structure.core.Column)3 View (liquibase.structure.core.View)3 InformixDatabase (liquibase.database.core.InformixDatabase)2 CachedRow (liquibase.snapshot.CachedRow)2 JdbcDatabaseSnapshot (liquibase.snapshot.JdbcDatabaseSnapshot)2 UnparsedSql (liquibase.sql.UnparsedSql)2 Catalog (liquibase.structure.core.Catalog)2 Index (liquibase.structure.core.Index)2 InvocationTargetException (java.lang.reflect.InvocationTargetException)1 ParseException (java.text.ParseException)1 ArrayList (java.util.ArrayList)1