@Override protected DatabaseObject snapshotObject(DatabaseObject example, DatabaseSnapshot snapshot) throws DatabaseException, InvalidExampleException { if (example.getSnapshotId() != null) { return example; } org.hibernate.mapping.Table hibernateTable = findHibernateTable(example, snapshot); if (hibernateTable == null) { return example; } Table table = new Table().setName(hibernateTable.getName()); LOG.info("Found table " + table.getName()); // table.setSnapshotId(SnapshotIdService.getInstance().generateId()); table.setSchema(example.getSchema()); return table; }
keySize.setAccessible(true); table = new Table().setName((String) tableName.get(tableGenerator)); pkColumn.setCertainDataType(false); pkColumn.setRelation(table); table.getColumns().add(pkColumn); valueColumn.setCertainDataType(false); valueColumn.setRelation(table); table.getColumns().add(valueColumn);
protected boolean isApplicable() throws CustomChangeException { try { String correctedTableName = database.correctObjectName("REALM", Table.class); if (SnapshotGeneratorFactory.getInstance().has(new Table().setName(correctedTableName), database)) { ResultSet resultSet = connection.createStatement().executeQuery("SELECT ID FROM " + getTableName(correctedTableName)); try { return (resultSet.next()); } finally { resultSet.close(); } } else { return false; } } catch (Exception e) { throw new CustomChangeException("Failed to check database availability", e); } }
Table table = new Table().setName(hibernateTable.getName()); PrimaryKey primaryKey = null; int pkColumnPosition = 0; LOG.info("Found table " + table.getName()); table.setSchema(example.getSchema()); table.setPrimaryKey(primaryKey); table.getColumns().add(column);
@Override public Table snapshot(IdentifierGenerator ig) { TableGenerator tableGenerator = (TableGenerator) ig; Table table = new Table().setName(tableGenerator.getTableName()); Column pkColumn = new Column(); pkColumn.setName(tableGenerator.getSegmentColumnName()); DataType pkDataType = new DataType(PK_DATA_TYPE); pkDataType.setColumnSize(tableGenerator.getSegmentValueLength()); pkColumn.setType(pkDataType); pkColumn.setCertainDataType(false); pkColumn.setRelation(table); table.getColumns().add(pkColumn); PrimaryKey primaryKey = new PrimaryKey(); primaryKey.setName(tableGenerator.getTableName() + "PK"); primaryKey.addColumn(0, new Column(pkColumn.getName()).setRelation(table)); primaryKey.setTable(table); table.setPrimaryKey(primaryKey); Column valueColumn = new Column(); valueColumn.setName(tableGenerator.getValueColumnName()); valueColumn.setType(new DataType(VALUE_DATA_TYPE)); valueColumn.setNullable(false); valueColumn.setCertainDataType(false); valueColumn.setRelation(table); table.getColumns().add(valueColumn); return table; }
while (fkIterator.hasNext()) { org.hibernate.mapping.ForeignKey hibernateForeignKey = (org.hibernate.mapping.ForeignKey) fkIterator.next(); Table currentTable = new Table().setName(hibernateTable.getName()); currentTable.setSchema(hibernateTable.getCatalog(), hibernateTable.getSchema()); Table referencedTable = new Table().setName(hibernateReferencedTable.getName()); referencedTable.setSchema(hibernateReferencedTable.getCatalog(), hibernateReferencedTable.getSchema()); table.getOutgoingForeignKeys().add(fk); table.getSchema().addDatabaseObject(fk);
protected String normalizeTableName(liquibase.structure.core.Table table, DatabaseSnapshot databaseSnapshot) { //Work around MySQL & case-insensitive dbs liquibase.structure.core.Table fkTable = databaseSnapshot.get(table); String fkTableName; if(fkTable != null) { fkTableName = fkTable.getName(); } else { logger.warn("Could not normalize table name: " + table.getName() + "; most probably this is a sign of a foreign key to another schema, which is not supported at the moment."); fkTableName = null; } return fkTableName; }
String fkName = liquibaseFK.getName(); logger.info("Synchronizing foreign key {}", fkName); String fkTableName = liquibaseFK.getForeignKeyTable().getName(); Table sourceTable = DatabaseLogic.findTableByNameIgnoreCase(sourceSchema, fkTableName); String pkSchemaName = liquibasePkTable.getSchema().getName(); String pkTableName = normalizeTableName(liquibasePkTable, databaseSnapshot); targetFK.setToSchema(pkSchemaName);
table.getUniqueConstraints().add(uniqueConstraint); UniqueConstraint uniqueConstraint = new UniqueConstraint(); uniqueConstraint.setTable(table); String name = "UC_" + table.getName().toUpperCase() + column.getName().toUpperCase() + "_COL"; if (name.length() > 64) { name = name.substring(0, 63); uniqueConstraint.setName(name); LOG.info("Found unique constraint " + uniqueConstraint.toString()); table.getUniqueConstraints().add(uniqueConstraint); Iterator<UniqueConstraint> ucIter = table.getUniqueConstraints().iterator(); while (ucIter.hasNext()) { UniqueConstraint uc = ucIter.next(); if (uc.getName() == null || uc.getName().isEmpty()) { String name = table.getName() + uc.getColumnNames(); name = "UCIDX" + hashedName(name); uc.setName(name);
boolean hasDeploymentIdColumn = changelogTable.getColumn(DEPLOYMENT_ID_COLUMN) != null; String deploymentId = changelogHistoryService.getDeploymentId(); logger.debugv("Adding missing column {0}={1} to {2} table", DEPLOYMENT_ID_COLUMN, deploymentId,changelogTable.getName()); changelogTable.getName(), DEPLOYMENT_ID_COLUMN, "VARCHAR(10)", null)); statementsToExecute.add(new UpdateStatement(database.getLiquibaseCatalogName(), database.getLiquibaseSchemaName(), changelogTable.getName()) .addNewColumnValue(DEPLOYMENT_ID_COLUMN, deploymentId)); statementsToExecute.add(new SetNullableStatement(database.getLiquibaseCatalogName(), database.getLiquibaseSchemaName(), changelogTable.getName(), DEPLOYMENT_ID_COLUMN, "VARCHAR(10)", false));
@Override protected void addTo(DatabaseObject foundObject, DatabaseSnapshot snapshot) throws DatabaseException, InvalidExampleException { if (foundObject instanceof Table) { org.hibernate.mapping.Table hibernateTable = findHibernateTable(foundObject, snapshot); if (hibernateTable == null) { return; } Iterator columnIterator = hibernateTable.getColumnIterator(); while (columnIterator.hasNext()) { org.hibernate.mapping.Column hibernateColumn = (org.hibernate.mapping.Column) columnIterator.next(); Column column = new Column(); column.setName(hibernateColumn.getName()); column.setRelation((Table) foundObject); snapshotColumn(column, snapshot); ((Table) foundObject).getColumns().add(column); } } }
table.setPrimaryKey(pk); Index index = new Index(); index.setName("IX_" + pk.getName()); index.setUnique(true); pk.setBackingIndex(index); table.getIndexes().add(index);
protected boolean isApplicable() throws CustomChangeException { try { String correctedTableName = database.correctObjectName("REALM", Table.class); if (SnapshotGeneratorFactory.getInstance().has(new Table().setName(correctedTableName), database)) { ResultSet resultSet = connection.createStatement().executeQuery("SELECT ID FROM " + getTableName(correctedTableName)); try { return (resultSet.next()); } finally { resultSet.close(); } } else { return false; } } catch (Exception e) { throw new CustomChangeException("Failed to check database availability", e); } }
protected String normalizeTableName(liquibase.structure.core.Table table, DatabaseSnapshot databaseSnapshot) { //Work around MySQL & case-insensitive dbs liquibase.structure.core.Table fkTable = databaseSnapshot.get(table); String fkTableName; if(fkTable != null) { fkTableName = fkTable.getName(); } else { logger.warn("Could not normalize table name: " + table.getName() + "; most probably this is a sign of a foreign key to another schema, which is not supported at the moment."); fkTableName = null; } return fkTableName; }
String fkName = liquibaseFK.getName(); logger.info("Synchronizing foreign key {}", fkName); String fkTableName = liquibaseFK.getForeignKeyTable().getName(); Table sourceTable = DatabaseLogic.findTableByNameIgnoreCase(sourceSchema, fkTableName); String pkSchemaName = liquibasePkTable.getSchema().getName(); String pkTableName = normalizeTableName(liquibasePkTable, databaseSnapshot); targetFK.setToSchema(pkSchemaName);
protected void syncColumns (liquibase.structure.core.Table liquibaseTable, final Table sourceTable, Table targetTable) { logger.debug("Synchronizing columns"); for(liquibase.structure.core.Column liquibaseColumn : liquibaseTable.getColumns()) { logger.debug("Processing column: {}", liquibaseColumn.getName());
@Override protected void addTo(DatabaseObject foundObject, DatabaseSnapshot snapshot) throws DatabaseException, InvalidExampleException { if (!snapshot.getSnapshotControl().shouldInclude(Table.class)) { return; } if (foundObject instanceof Schema) { Schema schema = (Schema) foundObject; HibernateDatabase database = (HibernateDatabase) snapshot.getDatabase(); Configuration cfg = database.getConfiguration(); Iterator<org.hibernate.mapping.Table> tableMappings = cfg.getTableMappings(); while (tableMappings.hasNext()) { org.hibernate.mapping.Table hibernateTable = tableMappings.next(); if (hibernateTable.isPhysicalTable()) { Table table = new Table().setName(hibernateTable.getName()); table.setSchema(schema); LOG.info("Found table " + table.getName()); schema.addDatabaseObject(table); } } } } }
@Override public SqlStatement[] generateStatements(Database database) throws CustomChangeException { try { StringBuilder sb = new StringBuilder(); sb.append("Generated codeSecret for realms: "); Connection connection = ((JdbcConnection) (database.getConnection())).getWrappedConnection(); ArrayList<SqlStatement> statements = new ArrayList<SqlStatement>(); String correctedTableName = database.correctObjectName("REALM", Table.class); if (SnapshotGeneratorFactory.getInstance().has(new Table().setName(correctedTableName), database)) { ResultSet resultSet = connection.createStatement().executeQuery("SELECT ID FROM " + LiquibaseJpaUpdaterProvider.getTable(correctedTableName, database.getDefaultSchemaName()) + " WHERE CODE_SECRET IS NULL"); while (resultSet.next()) { String id = resultSet.getString(1); UpdateStatement statement = new UpdateStatement(null, null, correctedTableName) .addNewColumnValue("CODE_SECRET", KeycloakModelUtils.generateCodeSecret()) .setWhereClause("ID='" + id + "'"); statements.add(statement); if (!resultSet.isFirst()) { sb.append(", "); } sb.append(id); } if (!statements.isEmpty()) { confirmationMessage = sb.toString(); } } return statements.toArray(new SqlStatement[statements.size()]); } catch (Exception e) { throw new CustomChangeException("Failed to add realm code secret", e); } }
protected void syncTables(DatabaseSnapshot databaseSnapshot, Schema sourceSchema, Schema targetSchema) { logger.info("Synchronizing tables"); for (liquibase.structure.core.Table liquibaseTable : databaseSnapshot.get(liquibase.structure.core.Table.class)) { String tableName = liquibaseTable.getName(); logger.info("Processing table: {}", tableName); Table sourceTable = DatabaseLogic.findTableByNameIgnoreCase(sourceSchema, tableName); if(sourceTable == null) { logger.debug("Added new table: {}", tableName); sourceTable = new Table(); } Table targetTable = new Table(targetSchema); targetSchema.getTables().add(targetTable); targetTable.setTableName(tableName); logger.debug("Merging table attributes and annotations"); targetTable.setEntityName(sourceTable.getEntityName()); targetTable.setJavaClass(sourceTable.getJavaClass()); targetTable.setShortName(sourceTable.getShortName()); copyAnnotations(sourceTable, targetTable); syncColumns(liquibaseTable, sourceTable, targetTable); copySelectionProviders(sourceTable, targetTable); } }
protected void syncColumns (liquibase.structure.core.Table liquibaseTable, final Table sourceTable, Table targetTable) { logger.debug("Synchronizing columns"); for(liquibase.structure.core.Column liquibaseColumn : liquibaseTable.getColumns()) { logger.debug("Processing column: {}", liquibaseColumn.getName());