Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master' into dependabot/maven/li…
Browse files Browse the repository at this point in the history
…quibase-dist/com.h2database-h2-2.0.202
  • Loading branch information
suryaaki committed Dec 27, 2021
2 parents 5c1a4af + efd286a commit 2ff4e20
Show file tree
Hide file tree
Showing 20 changed files with 499 additions and 95 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/snyk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ jobs:
SLACK_COLOR: ${{ job.status }} # or a specific color like 'good' or '#ff00ff'
SLACK_MESSAGE: "${{ github.job }}: ${{ job.status }} @here"
SLACK_USERNAME: "liquibot"
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
SLACK_WEBHOOK: ${{ secrets.SNYK_LIQUIBASE_SLACK_WEBHOOK }}
MSG_MINIMAL: actions url
SLACK_ICON_EMOJI: ':liquibase:'
SLACK_LINK_NAMES: true
69 changes: 65 additions & 4 deletions liquibase-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,13 @@
<version>1.3</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
<scope>provided</scope>
<version>4.3.1</version>
</dependency>
<version>5.0.0</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
Expand Down Expand Up @@ -155,10 +155,11 @@
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>3.3.0</version>
<version>5.1.2</version>
<configuration>
<instructions>
<Bundle-SymbolicName>org.liquibase.core</Bundle-SymbolicName>
<Bundle-Activator>liquibase.osgi.Activator</Bundle-Activator>
<Import-Package>
javax.activation*;resolution:=optional,
javax.servlet.*;version="[2.6,4)";resolution:=optional,
Expand All @@ -167,6 +168,66 @@
org.yaml.snakeyaml.*,
*;resolution:=optional
</Import-Package>
<Provide-Capability>
osgi.serviceloader; osgi.serviceloader=liquibase.serializer.ChangeLogSerializer,
osgi.serviceloader; osgi.serviceloader=liquibase.parser.NamespaceDetails,
osgi.serviceloader; osgi.serviceloader=liquibase.database.Database,
osgi.serviceloader; osgi.serviceloader=liquibase.change.Change,
osgi.serviceloader; osgi.serviceloader=liquibase.database.DatabaseConnection,
osgi.serviceloader; osgi.serviceloader=liquibase.precondition.Precondition,
osgi.serviceloader; osgi.serviceloader=liquibase.serializer.SnapshotSerializer,
osgi.serviceloader; osgi.serviceloader=liquibase.configuration.AutoloadedConfigurations,
osgi.serviceloader; osgi.serviceloader=liquibase.diff.DiffGenerator,
osgi.serviceloader; osgi.serviceloader=liquibase.lockservice.LockService,
osgi.serviceloader; osgi.serviceloader=liquibase.changelog.ChangeLogHistoryService,
osgi.serviceloader; osgi.serviceloader=liquibase.datatype.LiquibaseDataType,
osgi.serviceloader; osgi.serviceloader=liquibase.configuration.ConfigurationValueProvider,
osgi.serviceloader; osgi.serviceloader=liquibase.logging.LogService,
osgi.serviceloader; osgi.serviceloader=liquibase.snapshot.SnapshotGenerator,
osgi.serviceloader; osgi.serviceloader=liquibase.parser.ChangeLogParser,
osgi.serviceloader; osgi.serviceloader=liquibase.servicelocator.ServiceLocator,
osgi.serviceloader; osgi.serviceloader=liquibase.diff.compare.DatabaseObjectComparator,
osgi.serviceloader; osgi.serviceloader=liquibase.command.LiquibaseCommand,
osgi.serviceloader; osgi.serviceloader=liquibase.license.LicenseService,
osgi.serviceloader; osgi.serviceloader=liquibase.diff.output.changelog.ChangeGenerator,
osgi.serviceloader; osgi.serviceloader=liquibase.executor.Executor,
osgi.serviceloader; osgi.serviceloader=liquibase.structure.DatabaseObject,
osgi.serviceloader; osgi.serviceloader=liquibase.parser.SnapshotParser,
osgi.serviceloader; osgi.serviceloader=liquibase.hub.HubService,
osgi.serviceloader; osgi.serviceloader=liquibase.command.CommandStep,
osgi.serviceloader; osgi.serviceloader=liquibase.sqlgenerator.SqlGenerator
</Provide-Capability>
<Require-Capability>
osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)",
osgi.extender; filter:="(osgi.extender=osgi.serviceloader.processor)",
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.serializer.ChangeLogSerializer)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.parser.NamespaceDetails)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.database.Database)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.change.Change)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.database.DatabaseConnection)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.precondition.Precondition)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.serializer.SnapshotSerializer)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.configuration.AutoloadedConfigurations)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.diff.DiffGenerator)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.lockservice.LockService)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.changelog.ChangeLogHistoryService)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.datatype.LiquibaseDataType)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.configuration.ConfigurationValueProvider)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.logging.LogService)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.snapshot.SnapshotGenerator)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.parser.ChangeLogParser)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.servicelocator.ServiceLocator)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.diff.compare.DatabaseObjectComparator)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.command.LiquibaseCommand)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.license.LicenseService)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.diff.output.changelog.ChangeGenerator)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.executor.Executor)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.structure.DatabaseObject)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.parser.SnapshotParser)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.hub.HubService)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.command.CommandStep)"; cardinality:=multiple,
osgi.serviceloader; filter:="(osgi.serviceloader=liquibase.sqlgenerator.SqlGenerator)"; cardinality:=multiple
</Require-Capability>
</instructions>
</configuration>
<executions>
Expand Down
3 changes: 3 additions & 0 deletions liquibase-core/src/main/java/liquibase/Scope.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import liquibase.logging.Logger;
import liquibase.logging.core.JavaLogService;
import liquibase.logging.core.LogServiceFactory;
import liquibase.osgi.Activator;
import liquibase.resource.ClassLoaderResourceAccessor;
import liquibase.resource.ResourceAccessor;
import liquibase.servicelocator.ServiceLocator;
Expand Down Expand Up @@ -55,6 +56,7 @@ public enum Attr {
fileEncoding,
databaseChangeLog,
changeSet,
osgiPlatform
}

private static ScopeManager scopeManager;
Expand Down Expand Up @@ -95,6 +97,7 @@ public static Scope getCurrentScope() {
}

rootScope.values.put(Attr.serviceLocator.name(), serviceLocator);
rootScope.values.put(Attr.osgiPlatform.name(), Activator.OSGIContainerChecker.isOsgiPlatform());
}
return scopeManager.getCurrentScope();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,19 @@
import liquibase.change.*;
import liquibase.database.Database;
import liquibase.database.core.DB2Database;
import liquibase.database.core.SQLiteDatabase;
import liquibase.database.core.PostgresDatabase;
import liquibase.database.core.SQLiteDatabase.AlterTableVisitor;
import liquibase.exception.DatabaseException;
import liquibase.datatype.DataTypeFactory;
import liquibase.datatype.LiquibaseDataType;
import liquibase.datatype.core.BooleanType;
import liquibase.statement.DatabaseFunction;
import liquibase.statement.SqlStatement;
import liquibase.statement.core.ReorganizeTableStatement;
import liquibase.statement.core.SetNullableStatement;
import liquibase.statement.core.UpdateStatement;
import liquibase.structure.core.Column;
import liquibase.structure.core.Index;
import liquibase.util.BooleanUtil;
import liquibase.util.StringUtil;

import java.util.ArrayList;
Expand Down Expand Up @@ -135,9 +139,41 @@ public void setConstraintName(String constraintName) {
public SqlStatement[] generateStatements(Database database) {
List<SqlStatement> statements = new ArrayList<>();

if (defaultNullValue != null) {
if (defaultNullValue != null && !defaultNullValue.equalsIgnoreCase("null")) {
final String columnDataType = this.getColumnDataType();

Object finalDefaultNullValue = defaultNullValue;
if (columnDataType != null) {
final LiquibaseDataType datatype = DataTypeFactory.getInstance().fromDescription(columnDataType, database);
if (datatype instanceof BooleanType) {
//need to detect a boolean or bit type and handle it correctly sometimes or it is not converted to the correct datatype
finalDefaultNullValue = datatype.objectToSql(finalDefaultNullValue, database);
if (finalDefaultNullValue.equals("0")) {
finalDefaultNullValue = 0;
} else if (finalDefaultNullValue.equals("1")) {
finalDefaultNullValue = 1;
}

if (columnDataType.toLowerCase().contains("bit")) {
if (BooleanUtil.parseBoolean(finalDefaultNullValue.toString())) {
finalDefaultNullValue = 1;
} else {
finalDefaultNullValue = 0;
}
}

if (database instanceof PostgresDatabase) {
if (finalDefaultNullValue.equals(0)) {
finalDefaultNullValue = new DatabaseFunction( "B'0'");
} else if (finalDefaultNullValue.equals(1)) {
finalDefaultNullValue = new DatabaseFunction( "B'1'");
}
}
}
}

statements.add(new UpdateStatement(getCatalogName(), getSchemaName(), getTableName())
.addNewColumnValue(getColumnName(), defaultNullValue)
.addNewColumnValue(getColumnName(), finalDefaultNullValue)
.setWhereClause(database.escapeObjectName(getColumnName(), Column.class) +
" IS NULL"));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import liquibase.util.ObjectUtil;

import java.util.*;
import liquibase.util.OsgiUtil;

/**
* Adapts CustomChange implementations to the standard change system used by Liquibase.
Expand Down Expand Up @@ -69,16 +70,21 @@ public CustomChangeWrapper setClass(String className) throws CustomChangeExcepti
return this;
}
this.className = className;
try {
try {
Boolean osgiPlatform = Scope.getCurrentScope().get(Scope.Attr.osgiPlatform, Boolean.class);
if (Boolean.TRUE.equals(osgiPlatform)) {
customChange = (CustomChange)OsgiUtil.loadClass(className).getConstructor().newInstance();
} else {
try {
customChange = (CustomChange) Class.forName(className, true, Scope.getCurrentScope().getClassLoader()).getConstructor().newInstance();
} catch (ClassCastException e) { //fails in Ant in particular
try {
customChange = (CustomChange) Class.forName(className, true, Scope.getCurrentScope().getClassLoader()).getConstructor().newInstance();
} catch (ClassCastException e) { //fails in Ant in particular
try {
customChange = (CustomChange) Thread.currentThread().getContextClassLoader().loadClass(className).getConstructor().newInstance();
} catch (ClassNotFoundException e1) {
customChange = (CustomChange) Class.forName(className).getConstructor().newInstance();
}
customChange = (CustomChange) Thread.currentThread().getContextClassLoader().loadClass(className).getConstructor().newInstance();
} catch (ClassNotFoundException e1) {
customChange = (CustomChange) Class.forName(className).getConstructor().newInstance();
}
}
}
} catch (Exception e) {
throw new CustomChangeException(e);
}
Expand Down Expand Up @@ -316,7 +322,12 @@ public void customLoadLogic(ParsedNode parsedNode, ResourceAccessor resourceAcce

CustomChange customChange = null;
try {
customChange = (CustomChange) Class.forName(className, false, Scope.getCurrentScope().getClassLoader()).getConstructor().newInstance();
Boolean osgiPlatform = Scope.getCurrentScope().get(Scope.Attr.osgiPlatform, Boolean.class);
if (Boolean.TRUE.equals(osgiPlatform)) {
customChange = (CustomChange)OsgiUtil.loadClass(className).getConstructor().newInstance();
} else {
customChange = (CustomChange) Class.forName(className, false, Scope.getCurrentScope().getClassLoader()).getConstructor().newInstance();
}
} catch (Exception e) {
throw new UnexpectedLiquibaseException(e);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package liquibase.database.core;

import liquibase.database.DatabaseConnection;
import liquibase.exception.DatabaseException;
import liquibase.statement.SqlStatement;
import liquibase.statement.core.RawSqlStatement;

public class EnterpriseDBDatabase extends PostgresDatabase {

@Override
public boolean isCorrectDatabaseImplementation(DatabaseConnection conn) throws DatabaseException {
final String url = conn.getURL();
return url.contains("edb") || (url.contains("postgres") && url.contains(":5444"));
}

@Override
public String getShortName() {
return "edb";
}

@Override
public int getPriority() {
return PRIORITY_DATABASE + 5;
}


@Override
public String getDefaultDriver(String url) {
if (url.startsWith("jdbc:edb:")) {
return "com.edb.Driver";
}
return null;
}

@Override
public Integer getDefaultPort() {
return 5444;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,6 @@ public class PostgresDatabase extends AbstractJdbcDatabase {
private static final int PGSQL_DEFAULT_TCP_PORT_NUMBER = 5432;
private static final Logger LOG = Scope.getCurrentScope().getLog(PostgresDatabase.class);

/**
* Represents Postgres DB types.
* Note: As we know COMMUNITY, RDS and AWS AURORA have the same Postgres engine. We use just COMMUNITY for those 3
* If we need we can extend this ENUM in future
*/
public enum DbTypes {
EDB, COMMUNITY, RDS, AURORA
}

private Set<String> systemTablesAndViews = new HashSet<>();

private Set<String> reservedWords = new HashSet<>();
Expand Down Expand Up @@ -415,22 +406,4 @@ public String getDatabaseFullVersion() throws DatabaseException {

throw new DatabaseException("Connection set to Postgres type we don't support !");
}

/**
* Method to get Postgres DB type
* @return Db types
* */
public DbTypes getDbType() {
boolean enterpriseDb = false;
try {
enterpriseDb = getDatabaseFullVersion().toLowerCase().contains("enterprisedb");
} catch (DatabaseException e) {
if (getConnection() != null) {
Scope.getCurrentScope().getLog(getClass()).severe("Can't get full version of Postgres DB. Used EDB as default", e);
return DbTypes.EDB;
}
}
return enterpriseDb ? DbTypes.EDB : DbTypes.COMMUNITY;
}

}

0 comments on commit 2ff4e20

Please sign in to comment.