Skip to content

Commit

Permalink
MGR-135
Browse files Browse the repository at this point in the history
  • Loading branch information
madness-inc committed Feb 3, 2022
1 parent b2542ac commit 8a324fd
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 12 deletions.
18 changes: 18 additions & 0 deletions pom.xml
Expand Up @@ -363,6 +363,24 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>2.7.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>10.2.0.jre8</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.appng</groupId>
<artifactId>appng-testsupport</artifactId>
Expand Down
Expand Up @@ -16,6 +16,7 @@
package org.appng.application.manager.business;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
Expand All @@ -38,9 +39,7 @@
import org.flywaydb.core.api.configuration.Configuration;
import org.flywaydb.core.api.configuration.FluentConfiguration;
import org.flywaydb.core.internal.database.hsqldb.HSQLDBParser;
import org.flywaydb.core.internal.database.mysql.MySQLParser;
import org.flywaydb.core.internal.database.postgresql.PostgreSQLParser;
import org.flywaydb.core.internal.database.sqlserver.SQLServerParser;
import org.flywaydb.core.internal.parser.Parser;
import org.flywaydb.core.internal.parser.ParsingContext;
import org.flywaydb.core.internal.resource.StringResource;
Expand All @@ -54,13 +53,16 @@
import org.springframework.jdbc.support.rowset.SqlRowSet;
import org.springframework.jdbc.support.rowset.SqlRowSetMetaData;
import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;

import com.google.common.collect.Streams;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Component
public class SqlExecutor extends ServiceAware implements DataProvider, ActionProvider<SqlStatement> {

Expand Down Expand Up @@ -161,24 +163,41 @@ public static class SqlStatement {
public List<String> getQueries(String sql, DatabaseConnection conn) {
Configuration configuration = new FluentConfiguration().dataSource(conn.getJdbcUrl(), conn.getUserName(),
conn.getPasswordPlain());
Parser parser = getParser(conn.getType(), configuration);
SqlScript sqlScript = new ParserSqlScript(parser, new StringResource(sql), null, false);
return Streams.stream(sqlScript.getSqlStatements())
.map(org.flywaydb.core.internal.sqlscript.SqlStatement::getSql).collect(Collectors.toList());
try {
Parser parser = getParser(conn.getType(), configuration);
SqlScript sqlScript = new ParserSqlScript(parser, new StringResource(sql), null, false);
return Streams.stream(sqlScript.getSqlStatements())
.map(org.flywaydb.core.internal.sqlscript.SqlStatement::getSql).collect(Collectors.toList());
} catch (ReflectiveOperationException e) {
log.error("failed creating parser", e);
}
return new ArrayList<>();
}

protected Parser getParser(DatabaseType type, Configuration configuration) {
ParsingContext parsingContext = new ParsingContext();
protected Parser getParser(DatabaseType type, Configuration configuration) throws ReflectiveOperationException {
switch (type) {
case MYSQL:
return new MySQLParser(configuration, parsingContext);
if (configuration.getUrl().contains(":mariadb:")) {
return createParser("mysql.mariadb.MariaDBDatabaseType", configuration);
} else {
return createParser("mysql.MySQLDatabaseType", configuration);
}
case MSSQL:
return new SQLServerParser(configuration, parsingContext);
return createParser("sqlserver.SQLServerDatabaseType", configuration);
case POSTGRESQL:
return new PostgreSQLParser(configuration, parsingContext);
return new PostgreSQLParser(configuration, new ParsingContext());
default:
return new HSQLDBParser(configuration, parsingContext);
return new HSQLDBParser(configuration, new ParsingContext());
}
}

private Parser createParser(String className, Configuration configuration) throws ReflectiveOperationException {
String packagePrefix = "org.flywaydb.database.";
if (!ClassUtils.isPresent(packagePrefix + className, getClass().getClassLoader())) {
packagePrefix = "org.flywaydb.core.internal.database.";
}
return ((org.flywaydb.core.internal.database.DatabaseType) Class.forName(packagePrefix + className)
.newInstance()).createParser(configuration, null, new ParsingContext());
}

}
Expand Up @@ -16,6 +16,10 @@
package org.appng.application.manager.business;

import org.appng.api.support.CallableAction;
import org.appng.core.domain.DatabaseConnection.DatabaseType;
import org.flywaydb.core.api.configuration.ClassicConfiguration;
import org.flywaydb.core.internal.parser.Parser;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.test.context.ContextConfiguration;

Expand All @@ -34,4 +38,21 @@ public void testExecute() throws Exception {
validate(callableAction.getAction());
}

@Test
public void testParser() throws ReflectiveOperationException {
assertType("MySQLParser", "jdbc:mysql://localhost", DatabaseType.MYSQL);
assertType("MariaDBParser", "jdbc:mariadb://localhost", DatabaseType.MYSQL);
assertType("SQLServerParser", "jdbc:sqlserver://localhost", DatabaseType.MSSQL);
assertType("PostgreSQLParser", "jdbc:postgresql://localhost", DatabaseType.POSTGRESQL);
assertType("HSQLDBParser", "jdbc:hsqldb:hsql://localhost", DatabaseType.HSQL);
}

private void assertType(String className, String url, DatabaseType type) throws ReflectiveOperationException {
ClassicConfiguration cfg = new ClassicConfiguration();
cfg.setDataSource(url, null, null);
Parser parser = new SqlExecutor().getParser(type, cfg);
Assert.assertNotNull(parser);
Assert.assertEquals(className, parser.getClass().getSimpleName());
}

}

0 comments on commit 8a324fd

Please sign in to comment.