diff --git a/symmetric-assemble/src/docbook/databases.xml b/symmetric-assemble/src/docbook/databases.xml index 230314a2f9..6c1e161a9f 100644 --- a/symmetric-assemble/src/docbook/databases.xml +++ b/symmetric-assemble/src/docbook/databases.xml @@ -56,6 +56,16 @@ Y Y + + MariaDB + 5.1 and above + Y + Y + Y + Y + Y + Y + PostgreSQL 8.2.5 and above @@ -295,6 +305,12 @@ CREATE UNIQUE INDEX IDX_D_CHANNEL_ID ON SYM_DATA (DATA_ID, CHANNEL_ID) LOCAL to true. +
+ MariaDB + + See MySQL notes. + +
PostgreSQL diff --git a/symmetric-assemble/src/docbook/introduction.xml b/symmetric-assemble/src/docbook/introduction.xml index f72a4dbb2c..b62ae652f4 100644 --- a/symmetric-assemble/src/docbook/introduction.xml +++ b/symmetric-assemble/src/docbook/introduction.xml @@ -32,6 +32,10 @@ MySQL version 5.0.2 and above + + MariaDB version 5.1 and above + + Oracle version 10g and above diff --git a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/JdbcSymmetricDialectFactory.java b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/JdbcSymmetricDialectFactory.java index 38cd748e0f..ee7a45670c 100644 --- a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/JdbcSymmetricDialectFactory.java +++ b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/JdbcSymmetricDialectFactory.java @@ -31,6 +31,7 @@ import org.jumpmind.db.platform.hsqldb2.HsqlDb2DatabasePlatform; import org.jumpmind.db.platform.informix.InformixDatabasePlatform; import org.jumpmind.db.platform.interbase.InterbaseDatabasePlatform; +import org.jumpmind.db.platform.mariadb.MariaDBDatabasePlatform; import org.jumpmind.db.platform.mssql.MsSqlDatabasePlatform; import org.jumpmind.db.platform.mysql.MySqlDatabasePlatform; import org.jumpmind.db.platform.oracle.OracleDatabasePlatform; @@ -46,6 +47,7 @@ import org.jumpmind.symmetric.db.hsqldb2.HsqlDb2SymmetricDialect; import org.jumpmind.symmetric.db.informix.InformixSymmetricDialect; import org.jumpmind.symmetric.db.interbase.InterbaseSymmetricDialect; +import org.jumpmind.symmetric.db.mariadb.MariaDBSymmetricDialect; import org.jumpmind.symmetric.db.mssql.MsSqlSymmetricDialect; import org.jumpmind.symmetric.db.mysql.MySqlSymmetricDialect; import org.jumpmind.symmetric.db.oracle.OracleSymmetricDialect; @@ -78,8 +80,10 @@ public ISymmetricDialect create() { AbstractSymmetricDialect dialect = null; - if (platform instanceof MySqlDatabasePlatform) { - dialect = new MySqlSymmetricDialect(parameterService, platform); + if (platform instanceof MariaDBDatabasePlatform) { + dialect = new MariaDBSymmetricDialect(parameterService, platform); + } else if (platform instanceof MySqlDatabasePlatform) { + dialect = new MySqlSymmetricDialect(parameterService, platform); } else if (platform instanceof OracleDatabasePlatform) { dialect = new OracleSymmetricDialect(parameterService, platform); } else if (platform instanceof MsSqlDatabasePlatform) { diff --git a/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mariadb/MariaDBSymmetricDialect.java b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mariadb/MariaDBSymmetricDialect.java new file mode 100644 index 0000000000..5c50cad47f --- /dev/null +++ b/symmetric-client/src/main/java/org/jumpmind/symmetric/db/mariadb/MariaDBSymmetricDialect.java @@ -0,0 +1,14 @@ +package org.jumpmind.symmetric.db.mariadb; + +import org.jumpmind.db.platform.IDatabasePlatform; +import org.jumpmind.symmetric.db.mysql.MySqlSymmetricDialect; +import org.jumpmind.symmetric.service.IParameterService; + +public class MariaDBSymmetricDialect extends MySqlSymmetricDialect { + + public MariaDBSymmetricDialect(IParameterService parameterService, + IDatabasePlatform platform) { + super(parameterService, platform); + } + +} diff --git a/symmetric-db/src/main/java/org/jumpmind/db/platform/DatabaseNamesConstants.java b/symmetric-db/src/main/java/org/jumpmind/db/platform/DatabaseNamesConstants.java index a2f7f41cdf..dd1ce532c1 100644 --- a/symmetric-db/src/main/java/org/jumpmind/db/platform/DatabaseNamesConstants.java +++ b/symmetric-db/src/main/java/org/jumpmind/db/platform/DatabaseNamesConstants.java @@ -20,6 +20,6 @@ private DatabaseNamesConstants() { public final static String DB2 = "db2"; public final static String POSTGRESQL = "postgres"; public final static String SYBASE = "sybase"; - + public final static String MARIADB = "mariadb"; } diff --git a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/DbExport.java b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/DbExport.java index d59dc4af57..f5c0f71678 100644 --- a/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/DbExport.java +++ b/symmetric-io/src/main/java/org/jumpmind/symmetric/io/data/DbExport.java @@ -64,7 +64,7 @@ public enum Format { }; public enum Compatible { - DB2, DERBY, FIREBIRD, GREENPLUM, H2, HSQLDB, HSQLDB2, INFORMIX, INTERBASE, MSSQL, MYSQL, ORACLE, POSTGRES, SYBASE, SQLITE + DB2, DERBY, FIREBIRD, GREENPLUM, H2, HSQLDB, HSQLDB2, INFORMIX, INTERBASE, MSSQL, MYSQL, ORACLE, POSTGRES, SYBASE, SQLITE, MARIADB }; private Format format = Format.SQL; diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/JdbcDatabasePlatformFactory.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/JdbcDatabasePlatformFactory.java index 5d05aa1f0e..8753840ccb 100644 --- a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/JdbcDatabasePlatformFactory.java +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/JdbcDatabasePlatformFactory.java @@ -40,6 +40,7 @@ import org.jumpmind.db.platform.hsqldb2.HsqlDb2DatabasePlatform; import org.jumpmind.db.platform.informix.InformixDatabasePlatform; import org.jumpmind.db.platform.interbase.InterbaseDatabasePlatform; +import org.jumpmind.db.platform.mariadb.MariaDBDatabasePlatform; import org.jumpmind.db.platform.mssql.MsSqlDatabasePlatform; import org.jumpmind.db.platform.mysql.MySqlDatabasePlatform; import org.jumpmind.db.platform.oracle.OracleDatabasePlatform; @@ -76,6 +77,7 @@ public class JdbcDatabasePlatformFactory { addPlatform(platforms, "HsqlDb", HsqlDbDatabasePlatform.class); addPlatform(platforms, "HSQL Database Engine2", HsqlDb2DatabasePlatform.class); addPlatform(platforms, "Interbase", InterbaseDatabasePlatform.class); + addPlatform(platforms, "MariaDB", MariaDBDatabasePlatform.class); addPlatform(platforms, "MsSQL", MsSqlDatabasePlatform.class); addPlatform(platforms, "microsoft sql server11", MsSqlDatabasePlatform.class); addPlatform(platforms, "microsoft sql server", MsSqlDatabasePlatform.class); @@ -189,6 +191,16 @@ protected static String[] determineDatabaseNameVersionSubprotocol(DataSource dat nameVersion[1] = Integer.toString(getGreenplumVersion(connection)); } } + + /* + * if the productName is MySQL, it could be either MysSQL or MariaDB + * query the metadata to determine which one it is + */ + if (nameVersion[0].equalsIgnoreCase(DatabaseNamesConstants.MYSQL)) { + if (isMariaDBDatabase(connection)) { + nameVersion[0] = DatabaseNamesConstants.MARIADB; + } + } return nameVersion; } catch (SQLException ex) { @@ -237,6 +249,37 @@ private static boolean isGreenplumDatabase(Connection connection) { return isGreenplum; } + private static boolean isMariaDBDatabase(Connection connection) { + Statement stmt = null; + ResultSet rs = null; + String productName = null; + boolean isMariaDB = false; + try { + stmt = connection.createStatement(); + rs = stmt.executeQuery(MariaDBDatabasePlatform.SQL_GET_MARIADB_NAME); + while (rs.next()) { + productName = rs.getString(1); + } + if (productName != null && StringUtils.containsIgnoreCase(productName, DatabaseNamesConstants.MARIADB)) { + isMariaDB = true; + } + } catch (SQLException ex) { + // ignore the exception, if it is caught, then this is most likely + // not a mariadb database + } finally { + try { + if (rs != null) { + rs.close(); + } + if (stmt != null) { + stmt.close(); + } + } catch (SQLException ex) { + } + } + return isMariaDB; + } + private static int getGreenplumVersion(Connection connection) { Statement stmt = null; ResultSet rs = null; diff --git a/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/mariadb/MariaDBDatabasePlatform.java b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/mariadb/MariaDBDatabasePlatform.java new file mode 100644 index 0000000000..616733996b --- /dev/null +++ b/symmetric-jdbc/src/main/java/org/jumpmind/db/platform/mariadb/MariaDBDatabasePlatform.java @@ -0,0 +1,37 @@ +/* + * Licensed to JumpMind Inc under one or more contributor + * license agreements. See the NOTICE file distributed + * with this work for additional information regarding + * copyright ownership. JumpMind Inc licenses this file + * to you under the GNU Lesser General Public License (the + * "License"); you may not use this file except in compliance + * with the License. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see + * . + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.jumpmind.db.platform.mariadb; + +import javax.sql.DataSource; + +import org.jumpmind.db.platform.mysql.MySqlDatabasePlatform; +import org.jumpmind.db.sql.SqlTemplateSettings; + +public class MariaDBDatabasePlatform extends MySqlDatabasePlatform { + + public static final String SQL_GET_MARIADB_NAME = "select variable_value from information_schema.global_variables where variable_name='VERSION'"; + + public MariaDBDatabasePlatform(DataSource dataSource, + SqlTemplateSettings settings) { + super(dataSource, settings); + } + +} diff --git a/symmetric-jdbc/src/test/resources/db-test.properties b/symmetric-jdbc/src/test/resources/db-test.properties index 385c7d7a92..7cbe4a6b07 100644 --- a/symmetric-jdbc/src/test/resources/db-test.properties +++ b/symmetric-jdbc/src/test/resources/db-test.properties @@ -7,6 +7,12 @@ mysql.db.password=admin mysql.client.db.url=jdbc:mysql://localhost/SymmetricClient?tinyInt1isBit=false mysql.root.db.url=jdbc:mysql://localhost/SymmetricRoot?tinyInt1isBit=false +mariadb.db.driver=com.mysql.jdbc.Driver +mariadb.db.user=root +mariadb.db.password=admin +mariadb.client.db.url=jdbc:mysql://localhost/SymmetricClient?tinyInt1isBit=false +mariadb.root.db.url=jdbc:mysql://localhost/SymmetricRoot?tinyInt1isBit=false + oracle.db.driver=oracle.jdbc.driver.OracleDriver oracle.root.db.user=SymmetricRoot oracle.root.db.password=admin