Skip to content

Commit

Permalink
Refactor to make it easier to add new DBMS types
Browse files Browse the repository at this point in the history
  • Loading branch information
minborg committed Nov 20, 2015
1 parent d5fda59 commit 41cedbe
Show file tree
Hide file tree
Showing 11 changed files with 351 additions and 283 deletions.
Expand Up @@ -20,7 +20,7 @@
import com.speedment.config.Dbms; import com.speedment.config.Dbms;
import com.speedment.config.parameters.DbmsType; import com.speedment.config.parameters.DbmsType;
import com.speedment.db.DbmsHandler; import com.speedment.db.DbmsHandler;
import java.util.Objects; import static java.util.Objects.requireNonNull;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.function.BiFunction; import java.util.function.BiFunction;
Expand Down Expand Up @@ -63,20 +63,20 @@ protected AbstractDbmsType(
String resultSetTableSchema, String resultSetTableSchema,
Function<Dbms,String> connectionUrlGenerator) { Function<Dbms,String> connectionUrlGenerator) {


this.name = Objects.requireNonNull(name); this.name = requireNonNull(name);
this.driverManagerName = Objects.requireNonNull(driverManagerName); this.driverManagerName = requireNonNull(driverManagerName);
this.defaultPort = defaultPort; this.defaultPort = defaultPort;
this.schemaTableDelimiter = Objects.requireNonNull(schemaTableDelimiter); this.schemaTableDelimiter = requireNonNull(schemaTableDelimiter);
this.dbmsNameMeaning = Objects.requireNonNull(dbmsNameMeaning); this.dbmsNameMeaning = requireNonNull(dbmsNameMeaning);
this.driverName = Objects.requireNonNull(driverName); this.driverName = requireNonNull(driverName);
this.defaultConnectorParameters = Objects.requireNonNull(defaultConnectorParameters); this.defaultConnectorParameters = defaultConnectorParameters; // Nullable
this.jdbcConnectorName = Objects.requireNonNull(jdbcConnectorName); this.jdbcConnectorName = requireNonNull(jdbcConnectorName);
this.fieldEncloserStart = Objects.requireNonNull(fieldEncloserStart); this.fieldEncloserStart = requireNonNull(fieldEncloserStart);
this.fieldEncloserEnd = Objects.requireNonNull(fieldEncloserEnd); this.fieldEncloserEnd = requireNonNull(fieldEncloserEnd);
this.schemaExcludeSet = Objects.requireNonNull(schemaExcludeSet); this.schemaExcludeSet = requireNonNull(schemaExcludeSet);
this.dbmsMapper = Objects.requireNonNull(dbmsMapper); this.dbmsMapper = requireNonNull(dbmsMapper);
this.resultSetTableSchema = Objects.requireNonNull(resultSetTableSchema); this.resultSetTableSchema = requireNonNull(resultSetTableSchema);
this.connectionUrlGenerator = connectionUrlGenerator; this.connectionUrlGenerator = requireNonNull(connectionUrlGenerator);
} }


@Override @Override
Expand Down Expand Up @@ -161,10 +161,12 @@ private String escapeIfQuote(String item, boolean isWithinQuotes) {
return item; return item;
} }


@Override
public String getResultSetTableSchema() { public String getResultSetTableSchema() {
return resultSetTableSchema; return resultSetTableSchema;
} }


@Override
public Function<Dbms, String> getConnectionUrlGenerator() { public Function<Dbms, String> getConnectionUrlGenerator() {
return connectionUrlGenerator; return connectionUrlGenerator;
} }
Expand Down
Expand Up @@ -22,6 +22,7 @@
import com.speedment.internal.core.db.MySqlDbmsHandler; import com.speedment.internal.core.db.MySqlDbmsHandler;
import com.speedment.internal.core.manager.sql.MySqlSpeedmentPredicateView; import com.speedment.internal.core.manager.sql.MySqlSpeedmentPredicateView;
import com.speedment.internal.core.manager.sql.SpeedmentPredicateView; import com.speedment.internal.core.manager.sql.SpeedmentPredicateView;
import static com.speedment.internal.core.stream.OptionalUtil.unwrap;


import java.util.Collections; import java.util.Collections;
import java.util.Optional; import java.util.Optional;
Expand All @@ -38,11 +39,12 @@
*/ */
public final class MariaDbDbmsType extends AbstractDbmsType { public final class MariaDbDbmsType extends AbstractDbmsType {


private static final String QUOTE = "`";
private static final BiFunction<Speedment, Dbms, DbmsHandler> DBMS_MAPPER = MySqlDbmsHandler::new; // JAVA8 bug: Cannot use method ref in this() or super() private static final BiFunction<Speedment, Dbms, DbmsHandler> DBMS_MAPPER = MySqlDbmsHandler::new; // JAVA8 bug: Cannot use method ref in this() or super()
private static final String RESULTSET_TABLE_SCHEMA = "TABLE_SCHEMA"; private static final String RESULTSET_TABLE_SCHEMA = "TABLE_SCHEMA";
private static final String JDBC_CONNECTOR_NAME = "mariadb"; private static final String JDBC_CONNECTOR_NAME = "mariadb";
private static final Optional<String> DEFAULT_CONNECTOR_PARAMS = Optional.of("useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=true&useCursorFetch=true&zeroDateTimeBehavior=convertToNull"); private static final Optional<String> DEFAULT_CONNECTOR_PARAMS = Optional.of("useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=true&useCursorFetch=true&zeroDateTimeBehavior=convertToNull");
private static final Function<Dbms,String> CONNECTION_URL_GENERATOR = dbms -> { private static final Function<Dbms, String> CONNECTION_URL_GENERATOR = dbms -> {
final StringBuilder result = new StringBuilder(); final StringBuilder result = new StringBuilder();
result.append("jdbc:").append(JDBC_CONNECTOR_NAME).append("://"); result.append("jdbc:").append(JDBC_CONNECTOR_NAME).append("://");
dbms.getIpAddress().ifPresent(ip -> result.append(ip)); dbms.getIpAddress().ifPresent(ip -> result.append(ip));
Expand All @@ -55,25 +57,26 @@ public final class MariaDbDbmsType extends AbstractDbmsType {
public MariaDbDbmsType() { public MariaDbDbmsType() {


super( super(
"MariaDB", "MariaDB",
"MariaDB JDBC Driver", "MariaDB JDBC Driver",
3305, 3305,
".", ".",
"Just a name", "Just a name",
"com.mysql.jdbc.Driver", "com.mysql.jdbc.Driver",
DEFAULT_CONNECTOR_PARAMS.get(), unwrap(DEFAULT_CONNECTOR_PARAMS),
JDBC_CONNECTOR_NAME, JDBC_CONNECTOR_NAME,
"`", QUOTE,
"`", QUOTE,
Stream.of("MySQL", "information_schema").collect(collectingAndThen(toSet(), Collections::unmodifiableSet)), Stream.of("MySQL", "information_schema").collect(collectingAndThen(toSet(), Collections::unmodifiableSet)),
DBMS_MAPPER, DBMS_MAPPER,
RESULTSET_TABLE_SCHEMA, RESULTSET_TABLE_SCHEMA,
CONNECTION_URL_GENERATOR CONNECTION_URL_GENERATOR
); );
} }
private static final MySqlSpeedmentPredicateView VIEW = new MySqlSpeedmentPredicateView(QUOTE, QUOTE);


@Override @Override
public SpeedmentPredicateView getSpeedmentPredicateView() { public MySqlSpeedmentPredicateView getSpeedmentPredicateView() {
return new MySqlSpeedmentPredicateView(); return VIEW;
} }
} }
Expand Up @@ -23,11 +23,12 @@
import com.speedment.internal.core.manager.sql.MySqlSpeedmentPredicateView; import com.speedment.internal.core.manager.sql.MySqlSpeedmentPredicateView;
import com.speedment.internal.core.manager.sql.SpeedmentPredicateView; import com.speedment.internal.core.manager.sql.SpeedmentPredicateView;


import static com.speedment.internal.core.stream.OptionalUtil.unwrap;
import java.util.Collections; import java.util.Collections;
import java.util.Optional; import java.util.Optional;
import java.util.function.BiFunction; import java.util.function.BiFunction;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toSet; import static java.util.stream.Collectors.toSet;
import java.util.stream.Stream; import java.util.stream.Stream;


Expand All @@ -37,11 +38,12 @@
*/ */
public final class MySqlDbmsType extends AbstractDbmsType { public final class MySqlDbmsType extends AbstractDbmsType {


private static final String QUOTE = "`";
private static final BiFunction<Speedment, Dbms, DbmsHandler> DBMS_MAPPER = MySqlDbmsHandler::new; // JAVA8 bug: Cannot use method ref in this() or super() private static final BiFunction<Speedment, Dbms, DbmsHandler> DBMS_MAPPER = MySqlDbmsHandler::new; // JAVA8 bug: Cannot use method ref in this() or super()
private static final String RESULTSET_TABLE_SCHEMA = "TABLE_SCHEMA"; private static final String RESULTSET_TABLE_SCHEMA = "TABLE_SCHEMA";
private static final String JDBC_CONNECTOR_NAME = "mysql"; private static final String JDBC_CONNECTOR_NAME = "mysql";
private static final Optional<String> DEFAULT_CONNECTOR_PARAMS = Optional.of("useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=true&useCursorFetch=true&zeroDateTimeBehavior=convertToNull"); private static final Optional<String> DEFAULT_CONNECTOR_PARAMS = Optional.of("useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=true&useCursorFetch=true&zeroDateTimeBehavior=convertToNull");
private static final Function<Dbms,String> CONNECTION_URL_GENERATOR = dbms -> { private static final Function<Dbms, String> CONNECTION_URL_GENERATOR = dbms -> {
final StringBuilder result = new StringBuilder(); final StringBuilder result = new StringBuilder();
result.append("jdbc:").append(JDBC_CONNECTOR_NAME).append("://"); result.append("jdbc:").append(JDBC_CONNECTOR_NAME).append("://");
dbms.getIpAddress().ifPresent(ip -> result.append(ip)); dbms.getIpAddress().ifPresent(ip -> result.append(ip));
Expand All @@ -54,25 +56,27 @@ public final class MySqlDbmsType extends AbstractDbmsType {
public MySqlDbmsType() { public MySqlDbmsType() {


super( super(
"MySQL", "MySQL",
"MySQL-AB JDBC Driver", "MySQL-AB JDBC Driver",
3306, 3306,
".", ".",
"Just a name", "Just a name",
"com.mysql.jdbc.Driver", "com.mysql.jdbc.Driver",
DEFAULT_CONNECTOR_PARAMS.get(), unwrap(DEFAULT_CONNECTOR_PARAMS),
JDBC_CONNECTOR_NAME, JDBC_CONNECTOR_NAME,
"`", QUOTE,
"`", QUOTE,
Stream.of("MySQL", "information_schema").collect(Collectors.collectingAndThen(toSet(), Collections::unmodifiableSet)), Stream.of("MySQL", "information_schema").collect(collectingAndThen(toSet(), Collections::unmodifiableSet)),
DBMS_MAPPER, DBMS_MAPPER,
RESULTSET_TABLE_SCHEMA, RESULTSET_TABLE_SCHEMA,
CONNECTION_URL_GENERATOR CONNECTION_URL_GENERATOR
); );
} }


private static final MySqlSpeedmentPredicateView VIEW = new MySqlSpeedmentPredicateView(QUOTE, QUOTE);

@Override @Override
public SpeedmentPredicateView getSpeedmentPredicateView() { public SpeedmentPredicateView getSpeedmentPredicateView() {
return new MySqlSpeedmentPredicateView(); return VIEW;
} }
} }
Expand Up @@ -19,29 +19,31 @@
import com.speedment.Speedment; import com.speedment.Speedment;
import com.speedment.config.Dbms; import com.speedment.config.Dbms;
import com.speedment.db.DbmsHandler; import com.speedment.db.DbmsHandler;
import com.speedment.internal.core.db.MySqlDbmsHandler; import com.speedment.internal.core.db.PostgresDbmsHandler;
import com.speedment.internal.core.db.PostgreDbmsHandler;
import com.speedment.internal.core.manager.sql.PostgresSpeedmentPredicateView; import com.speedment.internal.core.manager.sql.PostgresSpeedmentPredicateView;
import com.speedment.internal.core.manager.sql.SpeedmentPredicateView; import com.speedment.internal.core.manager.sql.SpeedmentPredicateView;

import static com.speedment.internal.core.stream.OptionalUtil.unwrap;
import java.util.Collections; import java.util.Collections;

import java.util.Optional; import java.util.Optional;
import java.util.function.BiFunction; import java.util.function.BiFunction;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import static java.util.stream.Collectors.collectingAndThen;
import java.util.stream.Stream;

import static java.util.stream.Collectors.toSet; import static java.util.stream.Collectors.toSet;
import java.util.stream.Stream;
import static com.speedment.internal.core.stream.OptionalUtil.unwrap;


/** /**
* Created by fdirlikl on 11/13/2015. * Created by fdirlikl on 11/13/2015.
*/ */
public final class PostgreDbmsType extends AbstractDbmsType { public final class PostgresDbmsType extends AbstractDbmsType {
private static final BiFunction<Speedment, Dbms, DbmsHandler> DBMS_MAPPER = PostgreDbmsHandler::new; // JAVA8 bug: Cannot use method ref in this() or super()
private static final String QUOTE = "\"";
private static final BiFunction<Speedment, Dbms, DbmsHandler> DBMS_MAPPER = PostgresDbmsHandler::new; // JAVA8 bug: Cannot use method ref in this() or super()
private static final String RESULTSET_TABLE_SCHEMA = "TABLE_SCHEM"; private static final String RESULTSET_TABLE_SCHEMA = "TABLE_SCHEM";
private static final String JDBC_CONNECTOR_NAME = "postgresql"; private static final String JDBC_CONNECTOR_NAME = "postgresql";
private static final Optional<String> DEFAULT_CONNECTOR_PARAMS = Optional.of("useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=true&useCursorFetch=true&zeroDateTimeBehavior=convertToNull"); private static final Optional<String> DEFAULT_CONNECTOR_PARAMS = Optional.empty();
private static final Function<Dbms,String> CONNECTION_URL_GENERATOR = dbms -> { private static final Function<Dbms, String> CONNECTION_URL_GENERATOR = dbms -> {
final StringBuilder result = new StringBuilder(); final StringBuilder result = new StringBuilder();
result.append("jdbc:").append(JDBC_CONNECTOR_NAME).append("://"); result.append("jdbc:").append(JDBC_CONNECTOR_NAME).append("://");
dbms.getIpAddress().ifPresent(ip -> result.append(ip)); dbms.getIpAddress().ifPresent(ip -> result.append(ip));
Expand All @@ -51,29 +53,30 @@ public final class PostgreDbmsType extends AbstractDbmsType {
return result.toString(); return result.toString();
}; };


public PostgreDbmsType() { public PostgresDbmsType() {


super( super(
"Postgres", "Postgres",
"Postgres-AB JDBC Driver", "Postgres-AB JDBC Driver",
5432, 5432,
".", ".",
"Just a name", "Database name",
"org.postgresql.Driver", "org.postgresql.Driver",
"useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=true&useCursorFetch=true&zeroDateTimeBehavior=convertToNull", unwrap(DEFAULT_CONNECTOR_PARAMS),
"postgresql", "postgresql",
"\"", QUOTE,
"\"", QUOTE,
Stream.of("pg_catalog", "information_schema").collect(Collectors.collectingAndThen(toSet(), Collections::unmodifiableSet)), Stream.of("pg_catalog", "information_schema").collect(collectingAndThen(toSet(), Collections::unmodifiableSet)),
DBMS_MAPPER, DBMS_MAPPER,
RESULTSET_TABLE_SCHEMA, RESULTSET_TABLE_SCHEMA,
CONNECTION_URL_GENERATOR CONNECTION_URL_GENERATOR
); );
} }


private final static PostgresSpeedmentPredicateView VIEW = new PostgresSpeedmentPredicateView(QUOTE, QUOTE);


@Override @Override
public SpeedmentPredicateView getSpeedmentPredicateView() { public SpeedmentPredicateView getSpeedmentPredicateView() {
return new PostgresSpeedmentPredicateView(); return VIEW;
} }
} }
Expand Up @@ -28,11 +28,12 @@
public final class StandardDbmsType { public final class StandardDbmsType {


private static final MySqlDbmsType MYSQL_DBMS_TYPE = new MySqlDbmsType(); private static final MySqlDbmsType MYSQL_DBMS_TYPE = new MySqlDbmsType();
private static final PostgreDbmsType POSTGRE_DBMS_TYPE = new PostgreDbmsType(); private static final MariaDbDbmsType MARIADB_DBMS_TYPE = new MariaDbDbmsType();
private static final PostgresDbmsType POSTGRE_DBMS_TYPE = new PostgresDbmsType();


private final static List<DbmsType> STANDARD_TYPES = Stream.of( private final static List<DbmsType> STANDARD_TYPES = Stream.of(
MYSQL_DBMS_TYPE, MYSQL_DBMS_TYPE,
new MariaDbDbmsType(), MARIADB_DBMS_TYPE,
POSTGRE_DBMS_TYPE POSTGRE_DBMS_TYPE
).collect(Collectors.toList()); ).collect(Collectors.toList());


Expand All @@ -41,6 +42,6 @@ public static Stream<DbmsType> stream() {
} }


public static DbmsType defaultType() { public static DbmsType defaultType() {
return MYSQL_DBMS_TYPE; // Kunde inte hålla fingrarna borta Emil... return MYSQL_DBMS_TYPE;
} }
} }
Expand Up @@ -28,7 +28,6 @@
import com.speedment.config.PrimaryKeyColumn; import com.speedment.config.PrimaryKeyColumn;
import com.speedment.config.Schema; import com.speedment.config.Schema;
import com.speedment.config.Table; import com.speedment.config.Table;
import com.speedment.config.parameters.DbmsType;
import com.speedment.config.parameters.OrderType; import com.speedment.config.parameters.OrderType;
import com.speedment.internal.core.manager.sql.SqlStatement; import com.speedment.internal.core.manager.sql.SqlStatement;
import com.speedment.internal.core.manager.sql.SqlUpdateStatement; import com.speedment.internal.core.manager.sql.SqlUpdateStatement;
Expand All @@ -55,8 +54,6 @@
import java.util.stream.Stream; import java.util.stream.Stream;
import static com.speedment.internal.core.stream.OptionalUtil.unwrap; import static com.speedment.internal.core.stream.OptionalUtil.unwrap;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
import static com.speedment.internal.core.stream.OptionalUtil.unwrap;
import static java.util.Objects.requireNonNull;


/** /**
* *
Expand Down Expand Up @@ -113,17 +110,6 @@ public Connection getConnection() {


public String getUrl() { public String getUrl() {
return getDbms().getType().getConnectionUrlGenerator().apply(getDbms()); return getDbms().getType().getConnectionUrlGenerator().apply(getDbms());
/*final StringBuilder result = new StringBuilder();
result.append("jdbc:");
result.append(dbmsType.getJdbcConnectorName());
result.append("://");
getDbms().getIpAddress().ifPresent(ip -> result.append(ip));
getDbms().getPort().ifPresent(p -> result.append(":").append(p));
result.append("/test");
dbmsType.getDefaultConnectorParameters().ifPresent(d -> result.append("?").append(d));
return result.toString();*/
} }


protected Map<String, Class<?>> readTypeMapFromDB(Connection connection) throws SQLException { protected Map<String, Class<?>> readTypeMapFromDB(Connection connection) throws SQLException {
Expand Down
Expand Up @@ -23,10 +23,10 @@
/** /**
* Created by fdirlikl on 11/15/2015. * Created by fdirlikl on 11/15/2015.
*/ */
public class PostgreDbmsHandler extends AbstractRelationalDbmsHandler { public class PostgresDbmsHandler extends AbstractRelationalDbmsHandler {
private static final String RESULTSET_TABLE_SCHEMA = "TABLE_SCHEM"; private static final String RESULTSET_TABLE_SCHEMA = "TABLE_SCHEM";


public PostgreDbmsHandler(Speedment speedment, final Dbms dbms) { public PostgresDbmsHandler(Speedment speedment, final Dbms dbms) {
super(speedment, dbms); super(speedment, dbms);
} }
} }

0 comments on commit 41cedbe

Please sign in to comment.