From 46eeee68c9ee476877ed0b9a73743fe0962b7b4c Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Wed, 11 Sep 2019 21:37:52 +1200 Subject: [PATCH] #1814 - Support older MySQL 5.5 --- pom.xml | 4 ++-- .../dbplatform/mysql/MySql55Platform.java | 14 ++++++++++++++ .../dbmigration/DefaultDbMigration.java | 3 +++ .../server/core/DatabasePlatformFactory.java | 18 +++++++++++++++--- .../server/core/InternalConfiguration.java | 6 +++++- .../server/core/PlatformDdlBuilder.java | 1 + .../platform/DbExpressionHandlerFactory.java | 1 + .../server/query/CQueryBuilder.java | 6 +++++- src/test/java/io/ebean/BaseTestCase.java | 2 +- .../dbmigration/DbMigrationGenerateTest.java | 1 + 10 files changed, 48 insertions(+), 8 deletions(-) create mode 100644 src/main/java/io/ebean/config/dbplatform/mysql/MySql55Platform.java diff --git a/pom.xml b/pom.xml index 2b1fc0bc7..b9ae3f3e7 100644 --- a/pom.xml +++ b/pom.xml @@ -118,7 +118,7 @@ io.ebean ebean-annotation - 4.12 + 4.13 @@ -330,7 +330,7 @@ io.ebean ebean-maven-plugin - 11.44.1 + 11.45.1 test diff --git a/src/main/java/io/ebean/config/dbplatform/mysql/MySql55Platform.java b/src/main/java/io/ebean/config/dbplatform/mysql/MySql55Platform.java new file mode 100644 index 000000000..f1d24b768 --- /dev/null +++ b/src/main/java/io/ebean/config/dbplatform/mysql/MySql55Platform.java @@ -0,0 +1,14 @@ +package io.ebean.config.dbplatform.mysql; + +import io.ebean.annotation.Platform; +import io.ebean.config.dbplatform.DbPlatformType; +import io.ebean.config.dbplatform.DbType; + +public class MySql55Platform extends MySqlPlatform { + + public MySql55Platform() { + super(); + this.platform = Platform.MYSQL55; + dbTypeMap.put(DbType.TIMESTAMP, new DbPlatformType("datetime")); + } +} diff --git a/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java b/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java index d886c7433..671e9f844 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java +++ b/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java @@ -14,6 +14,7 @@ import io.ebean.config.dbplatform.db2.DB2Platform; import io.ebean.config.dbplatform.h2.H2Platform; import io.ebean.config.dbplatform.hana.HanaPlatform; import io.ebean.config.dbplatform.hsqldb.HsqldbPlatform; +import io.ebean.config.dbplatform.mysql.MySql55Platform; import io.ebean.config.dbplatform.mysql.MySqlPlatform; import io.ebean.config.dbplatform.nuodb.NuoDbPlatform; import io.ebean.config.dbplatform.oracle.OraclePlatform; @@ -787,6 +788,8 @@ public class DefaultDbMigration implements DbMigration { return new HsqldbPlatform(); case POSTGRES: return new PostgresPlatform(); + case MYSQL55: + return new MySql55Platform(); case MYSQL: return new MySqlPlatform(); case ORACLE: diff --git a/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java b/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java index 0854ae4f3..88c172875 100644 --- a/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java +++ b/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java @@ -8,6 +8,7 @@ import io.ebean.config.dbplatform.db2.DB2Platform; import io.ebean.config.dbplatform.h2.H2Platform; import io.ebean.config.dbplatform.hana.HanaPlatform; import io.ebean.config.dbplatform.hsqldb.HsqldbPlatform; +import io.ebean.config.dbplatform.mysql.MySql55Platform; import io.ebean.config.dbplatform.mysql.MySqlPlatform; import io.ebean.config.dbplatform.nuodb.NuoDbPlatform; import io.ebean.config.dbplatform.oracle.OraclePlatform; @@ -82,6 +83,9 @@ public class DatabasePlatformFactory { if (dbName.equals("mysql")) { return new MySqlPlatform(); } + if (dbName.equals("mysql55")) { + return new MySql55Platform(); + } if (dbName.equals("postgres") || dbName.equals("postgres9")) { return new PostgresPlatform(); } @@ -147,15 +151,16 @@ public class DatabasePlatformFactory { */ private DatabasePlatform byDatabaseMeta(DatabaseMetaData metaData, Connection connection) throws SQLException { - String dbProductName = metaData.getDatabaseProductName(); - dbProductName = dbProductName.toLowerCase(); + String dbProductName = metaData.getDatabaseProductName().toLowerCase(); + final int majorVersion = metaData.getDatabaseMajorVersion(); + final int minorVersion = metaData.getDatabaseMinorVersion(); if (dbProductName.contains("oracle")) { return new OraclePlatform(); } else if (dbProductName.contains("microsoft")) { throw new IllegalArgumentException("For SqlServer please explicitly choose either sqlserver16 or sqlserver17 as the platform via ServerConfig.setDatabasePlatformName. Refer to issue #1340 for more details"); } else if (dbProductName.contains("mysql")) { - return new MySqlPlatform(); + return mysqlVersion(majorVersion, minorVersion); } else if (dbProductName.contains("h2")) { return new H2Platform(); } else if (dbProductName.contains("hsql database engine")) { @@ -180,6 +185,13 @@ public class DatabasePlatformFactory { return new DatabasePlatform(); } + private DatabasePlatform mysqlVersion(int majorVersion, int minorVersion) { + if (majorVersion <= 5 && minorVersion <= 5) { + return new MySql55Platform(); + } + return new MySqlPlatform(); + } + /** * Use a select version() query as it could be Postgres or CockroachDB. */ diff --git a/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java b/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java index b755e8c3d..b6b034f57 100644 --- a/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java +++ b/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java @@ -514,7 +514,7 @@ public class InternalConfiguration { String tz = serverConfig.getDataTimeZone(); if (tz == null) { - if (getPlatform() == Platform.MYSQL) { + if (isMySql(getPlatform())) { return new LocalDataTimeZone(); } return new NoDataTimeZone(); @@ -526,6 +526,10 @@ public class InternalConfiguration { } } + private boolean isMySql(Platform platform) { + return platform == Platform.MYSQL || platform == Platform.MYSQL55; + } + public DataTimeZone getDataTimeZone() { return dataTimeZone; } diff --git a/src/main/java/io/ebeaninternal/server/core/PlatformDdlBuilder.java b/src/main/java/io/ebeaninternal/server/core/PlatformDdlBuilder.java index bacee903e..f6aadfa83 100644 --- a/src/main/java/io/ebeaninternal/server/core/PlatformDdlBuilder.java +++ b/src/main/java/io/ebeaninternal/server/core/PlatformDdlBuilder.java @@ -30,6 +30,7 @@ public class PlatformDdlBuilder { return new H2Ddl(platform); case DB2: return new DB2Ddl(platform); + case MYSQL55: case MYSQL: return new MySqlDdl(platform); case HSQLDB: diff --git a/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandlerFactory.java b/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandlerFactory.java index 1bebb5e96..14bcb1e95 100644 --- a/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandlerFactory.java +++ b/src/main/java/io/ebeaninternal/server/expression/platform/DbExpressionHandlerFactory.java @@ -17,6 +17,7 @@ public class DbExpressionHandlerFactory { return new H2DbExpression(); case POSTGRES: return new PostgresDbExpression(); + case MYSQL55: case MYSQL: return new MySqlDbExpression(); case ORACLE: diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java b/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java index f6e3620a9..b83140706 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java +++ b/src/main/java/io/ebeaninternal/server/query/CQueryBuilder.java @@ -141,7 +141,7 @@ class CQueryBuilder { if (dbPlatform.isSupportsDeleteTableAlias()) { // delete from table ... return aliasReplace(buildSql("delete", request, predicates, sqlTree).getSql(), alias); - } else if (dbPlatform.getPlatform() == Platform.MYSQL) { + } else if (isMySql(dbPlatform.getPlatform())) { return aliasReplace(buildSql("delete " + alias, request, predicates, sqlTree).getSql(), alias); } else { // simple - delete from table ... @@ -155,6 +155,10 @@ class CQueryBuilder { return sql; } + private boolean isMySql(Platform platform) { + return platform == Platform.MYSQL || platform == Platform.MYSQL55; + } + private String alias(String rootTableAlias) { return (rootTableAlias == null) ? "t0" : rootTableAlias; } diff --git a/src/test/java/io/ebean/BaseTestCase.java b/src/test/java/io/ebean/BaseTestCase.java index c9fe57ba1..581dfa0aa 100644 --- a/src/test/java/io/ebean/BaseTestCase.java +++ b/src/test/java/io/ebean/BaseTestCase.java @@ -183,7 +183,7 @@ public abstract class BaseTestCase { } public boolean isMySql() { - return Platform.MYSQL == platform(); + return Platform.MYSQL == platform() || Platform.MYSQL55 == platform(); } public boolean isHana() { diff --git a/src/test/java/io/ebeaninternal/dbmigration/DbMigrationGenerateTest.java b/src/test/java/io/ebeaninternal/dbmigration/DbMigrationGenerateTest.java index 27fda6d25..8b655b2dc 100644 --- a/src/test/java/io/ebeaninternal/dbmigration/DbMigrationGenerateTest.java +++ b/src/test/java/io/ebeaninternal/dbmigration/DbMigrationGenerateTest.java @@ -49,6 +49,7 @@ public class DbMigrationGenerateTest { migration.addPlatform(Platform.H2, "h2"); migration.addPlatform(Platform.HSQLDB, "hsqldb"); migration.addPlatform(Platform.MYSQL, "mysql"); + migration.addPlatform(Platform.MYSQL55, "mysql55"); migration.addPlatform(Platform.POSTGRES, "postgres"); migration.addPlatform(Platform.ORACLE, "oracle"); migration.addPlatform(Platform.SQLITE, "sqlite");