package org.flywaydb.core.internal.parser;
import org.flywaydb.core.api.FlywayException;
import org.flywaydb.core.api.configuration.Configuration;
import org.flywaydb.core.api.logging.Log;
import org.flywaydb.core.api.logging.LogFactory;
import org.flywaydb.core.internal.database.base.Database;
import org.flywaydb.core.internal.database.base.Schema;
import org.flywaydb.core.internal.resource.ResourceName;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TimeZone;
public class ParsingContext {
private static final Log LOG = LogFactory.getLog(ParsingContext.class);
private static final String DEFAULT_SCHEMA_PLACEHOLDER = "flyway:defaultSchema";
private static final String USER_PLACEHOLDER = "flyway:user";
private static final String DATABASE_PLACEHOLDER = "flyway:database";
private static final String TIMESTAMP_PLACEHOLDER = "flyway:timestamp";
private static final String FILENAME_PLACEHOLDER = "flyway:filename";
private final Map<String, String> placeholders = new HashMap<>();
private Database database;
public Map<String, String> getPlaceholders() {
return placeholders;
}
private void setDatabase(Database database) {
this.database = database;
}
public Database getDatabase() {
return database;
}
public void populate(Database database, Configuration configuration) {
setDatabase(database);
String defaultSchemaName = configuration.getDefaultSchema();
String[] schemaNames = configuration.getSchemas();
Schema currentSchema = getCurrentSchema(database);
String catalog = database.getCatalog();
String currentUser = getCurrentUser(database);
if (defaultSchemaName == null) {
if (schemaNames.length > 0) {
defaultSchemaName = schemaNames[0];
} else {
defaultSchemaName = currentSchema.getName();
}
}
if (defaultSchemaName != null) {
placeholders.put(DEFAULT_SCHEMA_PLACEHOLDER, defaultSchemaName);
}
if (catalog != null) {
placeholders.put(DATABASE_PLACEHOLDER, catalog);
}
placeholders.put(USER_PLACEHOLDER, currentUser);
placeholders.put(TIMESTAMP_PLACEHOLDER, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
public void updateFilenamePlaceholder(ResourceName resourceName) {
if (resourceName.isValid()) {
placeholders.put(FILENAME_PLACEHOLDER, resourceName.getFilename());
} else {
placeholders.remove(FILENAME_PLACEHOLDER);
}
}
private Schema getCurrentSchema(Database database) {
try {
return database.getMainConnection().getCurrentSchema();
} catch (FlywayException e) {
LOG.debug("Could not get schema for " + DEFAULT_SCHEMA_PLACEHOLDER + " placeholder.");
return null;
}
}
private String getCurrentUser(Database database) {
try {
return database.getCurrentUser();
} catch (FlywayException e) {
LOG.debug("Could not get user for " + USER_PLACEHOLDER + " placeholder.");
return null;
}
}
}