liquibase.command.core.InternalSnapshotCommandStep Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of liquibase-core Show documentation
Show all versions of liquibase-core Show documentation
Liquibase is a tool for managing and executing database changes.
The newest version!
package liquibase.command.core;
import liquibase.CatalogAndSchema;
import liquibase.Scope;
import liquibase.command.*;
import liquibase.database.Database;
import liquibase.database.ObjectQuotingStrategy;
import liquibase.database.core.*;
import liquibase.exception.LiquibaseException;
import liquibase.license.LicenseServiceUtils;
import liquibase.serializer.SnapshotSerializerFactory;
import liquibase.snapshot.DatabaseSnapshot;
import liquibase.snapshot.SnapshotControl;
import liquibase.snapshot.SnapshotGeneratorFactory;
import liquibase.snapshot.SnapshotListener;
import liquibase.util.StringUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
public class InternalSnapshotCommandStep extends AbstractCommandStep {
public static final String[] COMMAND_NAME = {"internalSnapshot"};
public static final CommandArgumentDefinition DATABASE_ARG;
public static final CommandArgumentDefinition SCHEMAS_ARG;
public static final CommandArgumentDefinition SERIALIZER_FORMAT_ARG;
public static final CommandArgumentDefinition SNAPSHOT_LISTENER_ARG;
public static final CommandArgumentDefinition SNAPSHOT_CONTROL_ARG;
private Map snapshotMetadata;
static {
final CommandBuilder builder = new CommandBuilder(COMMAND_NAME);
DATABASE_ARG = builder.argument("database", Database.class).required().build();
SCHEMAS_ARG = builder.argument("schemas", CatalogAndSchema[].class).build();
SERIALIZER_FORMAT_ARG = builder.argument("serializerFormat", String.class).build();
SNAPSHOT_LISTENER_ARG = builder.argument("snapshotListener", SnapshotListener.class).build();
SNAPSHOT_CONTROL_ARG = builder.argument("snapshotControl", SnapshotControl.class).hidden().build();
}
@Override
public String[][] defineCommandNames() {
return new String[][] { COMMAND_NAME };
}
@Override
public void adjustCommandDefinition(CommandDefinition commandDefinition) {
super.adjustCommandDefinition(commandDefinition);
commandDefinition.setInternal(true);
}
public static CatalogAndSchema[] parseSchemas(Database database, String... schemas) {
if ((schemas == null) || (schemas.length == 0) || (schemas[0] == null)) {
return null;
}
schemas = StringUtil.join(schemas, ",").split("\\s*,\\s*");
List finalList = new ArrayList<>();
for (String schema : schemas) {
finalList.add(new CatalogAndSchema(null, schema).customize(database));
}
return finalList.toArray(new CatalogAndSchema[0]);
}
public Map getSnapshotMetadata() {
return snapshotMetadata;
}
public void setSnapshotMetadata(Map snapshotMetadata) {
this.snapshotMetadata = snapshotMetadata;
}
@Override
public void run(CommandResultsBuilder resultsBuilder) throws Exception {
CommandScope commandScope = resultsBuilder.getCommandScope();
Database database = commandScope.getArgumentValue(DATABASE_ARG);
SnapshotListener snapshotListener = commandScope.getArgumentValue(SNAPSHOT_LISTENER_ARG);
CatalogAndSchema[] schemas = commandScope.getArgumentValue(SCHEMAS_ARG);
InternalSnapshotCommandStep.logUnsupportedDatabase(database, this.getClass());
SnapshotControl snapshotControl = commandScope.getArgumentValue(SNAPSHOT_CONTROL_ARG);
if (snapshotControl == null) {
snapshotControl = new SnapshotControl(database);
}
snapshotControl.setSnapshotListener(snapshotListener);
if (schemas == null) {
schemas = new CatalogAndSchema[]{database.getDefaultSchema()};
}
ObjectQuotingStrategy originalQuotingStrategy = database.getObjectQuotingStrategy();
database.setObjectQuotingStrategy(ObjectQuotingStrategy.QUOTE_ALL_OBJECTS);
DatabaseSnapshot snapshot;
try {
snapshot = SnapshotGeneratorFactory.getInstance().createSnapshot(schemas, database, snapshotControl);
} finally {
database.setObjectQuotingStrategy(originalQuotingStrategy);
}
snapshot.setMetadata(this.getSnapshotMetadata());
resultsBuilder.addResult("snapshot", snapshot);
}
public static String printSnapshot(CommandScope commandScope, CommandResults snapshotResults) throws LiquibaseException {
String format = commandScope.getArgumentValue(InternalSnapshotCommandStep.SERIALIZER_FORMAT_ARG);
if (format == null) {
format = "txt";
}
return SnapshotSerializerFactory.getInstance().getSerializer(format.toLowerCase(Locale.US)).serialize((DatabaseSnapshot) snapshotResults.getResult("snapshot"), true);
}
public static void logUnsupportedDatabase(Database database, Class callingClass) {
if (LicenseServiceUtils.isProLicenseValid() && database != null) {
if (!(database instanceof MSSQLDatabase
|| database instanceof OracleDatabase
|| database instanceof MySQLDatabase
|| database instanceof DB2Database
|| database instanceof PostgresDatabase
|| database.getShortName().equalsIgnoreCase("bigquery")
|| database.getShortName().equalsIgnoreCase("snowflake"))) { //TODO: Update to use SnowflakeDatabase once the liquibase-snowflake module is fully integrated into liquibase-core
Scope.getCurrentScope().getUI().sendMessage("INFO This command might not yet capture Liquibase Pro additional object types on " + database.getShortName());
}
}
}
}