JENA-1192: Support for the MariaDB JDBC driver.
Project: http://git-wip-us.apache.org/repos/asf/jena/repo Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/edba1313 Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/edba1313 Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/edba1313 Branch: refs/heads/master Commit: edba13136e2dd201e26e24a62e3f1b8a5c20e81e Parents: 9dd5ac3 Author: Andy Seaborne <[email protected]> Authored: Fri Jun 10 13:44:38 2016 +0100 Committer: Andy Seaborne <[email protected]> Committed: Fri Jun 10 13:44:58 2016 +0100 ---------------------------------------------------------------------- .../jena/sdb/layout2/LoaderTuplesNodes.java | 3 +- .../apache/jena/sdb/layout2/NodeLayout2.java | 2 +- .../main/java/org/apache/jena/sdb/sql/JDBC.java | 36 ++++++++++++++++---- .../org/apache/jena/sdb/store/DatabaseType.java | 7 ++-- .../org/apache/jena/sdb/store/StoreFactory.java | 21 +++++++++++- .../org/apache/jena/sdb/util/StoreUtils.java | 11 +++--- 6 files changed, 60 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jena/blob/edba1313/jena-sdb/src/main/java/org/apache/jena/sdb/layout2/LoaderTuplesNodes.java ---------------------------------------------------------------------- diff --git a/jena-sdb/src/main/java/org/apache/jena/sdb/layout2/LoaderTuplesNodes.java b/jena-sdb/src/main/java/org/apache/jena/sdb/layout2/LoaderTuplesNodes.java index 395a8ee..0fee236 100644 --- a/jena-sdb/src/main/java/org/apache/jena/sdb/layout2/LoaderTuplesNodes.java +++ b/jena-sdb/src/main/java/org/apache/jena/sdb/layout2/LoaderTuplesNodes.java @@ -285,8 +285,7 @@ public class LoaderTuplesNodes if (currentLoader == null) { // make a new loader try { currentLoader = - tupleLoaderClass.getConstructor(SDBConnection.class, TableDesc.class, - Integer.TYPE).newInstance(connection(), tuple.table, chunkSize); + tupleLoaderClass.getConstructor(SDBConnection.class, TableDesc.class, Integer.TYPE).newInstance(connection(), tuple.table, chunkSize); } catch (Exception e) { throw new SDBException("Problem making new tupleloader", e); } http://git-wip-us.apache.org/repos/asf/jena/blob/edba1313/jena-sdb/src/main/java/org/apache/jena/sdb/layout2/NodeLayout2.java ---------------------------------------------------------------------- diff --git a/jena-sdb/src/main/java/org/apache/jena/sdb/layout2/NodeLayout2.java b/jena-sdb/src/main/java/org/apache/jena/sdb/layout2/NodeLayout2.java index bbe174d..6fa56b6 100644 --- a/jena-sdb/src/main/java/org/apache/jena/sdb/layout2/NodeLayout2.java +++ b/jena-sdb/src/main/java/org/apache/jena/sdb/layout2/NodeLayout2.java @@ -33,7 +33,7 @@ import org.slf4j.LoggerFactory; public class NodeLayout2 { - // Turn into the lexcial form + // Turn into the lexical form public static String nodeToLex(Node node) { http://git-wip-us.apache.org/repos/asf/jena/blob/edba1313/jena-sdb/src/main/java/org/apache/jena/sdb/sql/JDBC.java ---------------------------------------------------------------------- diff --git a/jena-sdb/src/main/java/org/apache/jena/sdb/sql/JDBC.java b/jena-sdb/src/main/java/org/apache/jena/sdb/sql/JDBC.java index ca55fcd..f1da4bd 100644 --- a/jena-sdb/src/main/java/org/apache/jena/sdb/sql/JDBC.java +++ b/jena-sdb/src/main/java/org/apache/jena/sdb/sql/JDBC.java @@ -40,9 +40,13 @@ public class JDBC // The "well known" not a JDBC connection really scheme public static final String jdbcNone = "jdbc:none" ; + public static final String jdbcDriverClassMySQL ; + public static final String jdbcDriverClassMariaDB ; + private static Map<DatabaseType, String> driver = new HashMap<DatabaseType, String>() ; static { driver.put(DatabaseType.MySQL, "com.mysql.jdbc.Driver") ; + driver.put(DatabaseType.MariaDB, "org.mariadb.jdbc.Driver") ; driver.put(DatabaseType.PostgreSQL, "org.postgresql.Driver") ; driver.put(DatabaseType.H2, "org.h2.Driver") ; driver.put(DatabaseType.HSQLDB, "org.hsqldb.jdbcDriver") ; @@ -52,6 +56,9 @@ public class JDBC driver.put(DatabaseType.Oracle, "oracle.jdbc.driver.OracleDriver") ; driver.put(DatabaseType.DB2, "com.ibm.db2.jcc.DB2Driver") ; driver.put(DatabaseType.SAP, "com.sap.db.jdbc.Driver") ; + + jdbcDriverClassMySQL = driver.get(DatabaseType.MySQL) ; + jdbcDriverClassMariaDB = driver.get(DatabaseType.MariaDB) ; } static public String getDriver(DatabaseType dbType) { return driver.get(dbType) ; } @@ -62,6 +69,8 @@ public class JDBC static public void loadDriverH2() { loadDriver(driver.get(DatabaseType.H2)) ; } /** Explicitly load the MySQL driver */ static public void loadDriverMySQL() { loadDriver(driver.get(DatabaseType.MySQL)) ; } + /** Explicitly load the MariaDB driver */ + static public void loadDriverMariaDB() { loadDriver(driver.get(DatabaseType.MariaDB)) ; } /** Explicitly load the PostgreSQL driver */ static public void loadDriverPGSQL() { loadDriver(driver.get(DatabaseType.PostgreSQL)); } /** Explicitly load the Derby driver */ @@ -99,16 +108,28 @@ public class JDBC return DriverManager.getConnection(url, user, password) ; } -// static public void loadClass(String className) -// { Loader.loadClass(className) ; } - static private void loadClass(String className) { - try { Class.forName(className); } + try { Class.forName(className); return ; } catch (ClassNotFoundException ex) - { throw new SDBNotFoundException("Class.forName("+className+")", ex) ; } + { + // Ir MySQL or MariaDB, try the other one. + if ( className.equals(jdbcDriverClassMySQL) || className.equals(jdbcDriverClassMariaDB) ) { + String classNameAlt = null ; + if ( className.equals(jdbcDriverClassMySQL) ) + classNameAlt = jdbcDriverClassMariaDB ; + else if ( className.equals(jdbcDriverClassMariaDB) ) + classNameAlt = jdbcDriverClassMySQL ; + try { Class.forName(classNameAlt) ; return ; } + catch (ClassNotFoundException ex2) {} + } + throw new SDBNotFoundException("Class.forName("+className+")", ex) ; } } + static private void loadClass1(String className) { + + } + public static String makeURL(String type, String host, String dbName) { return makeURL(type, host, dbName, null, null) ; } @@ -125,8 +146,11 @@ public class JDBC if ( password == null ) password = Access.getPassword() ; - if ( type.equals("mysql") ) + if ( type.equals("mysql") || type.equals("mariadb") ) { + // MariaDB responds to jdbc:mysql:... + // but MySQL does not respond to jdbc:mariadb:... + type = "mysql" ; String s = String.format("jdbc:%s://%s/%s", type, host, dbName) ; return s ; } http://git-wip-us.apache.org/repos/asf/jena/blob/edba1313/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatabaseType.java ---------------------------------------------------------------------- diff --git a/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatabaseType.java b/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatabaseType.java index 5e3d83b..685b0ca 100644 --- a/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatabaseType.java +++ b/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatabaseType.java @@ -35,6 +35,8 @@ public class DatabaseType extends Symbol implements Named public static final DatabaseType H2 = new DatabaseType("H2") ; public static final DatabaseType HSQLDB = new DatabaseType("HSQLDB") ; public static final DatabaseType MySQL = new DatabaseType("MySQL") ; + // MariaDB is currently treated as MySQL - the only difference is that a different JDBC driver is loaded. + public static final DatabaseType MariaDB = new DatabaseType("MariaDB") ; public static final DatabaseType PostgreSQL = new DatabaseType("PostgreSQL") ; public static final DatabaseType SQLServer = new DatabaseType("SQLServer") ; public static final DatabaseType Oracle = new DatabaseType("Oracle") ; @@ -63,7 +65,6 @@ public class DatabaseType extends Symbol implements Named static void init() { - // Java databases register(Derby) ; registerName("JavaDB", Derby) ; @@ -78,14 +79,12 @@ public class DatabaseType extends Symbol implements Named registerName("h2:tcp", H2) ; registerName("h2", H2) ; - // Open source DBs register(MySQL) ; - // registerName("MySQL5", HSQLDB) ; // am I right in assuming that "HSQLDB" should actually be "MySQL" + register(MariaDB) ; registerName("MySQL5", MySQL) ; register(PostgreSQL) ; - // Commercial DBs register(SQLServer) ; registerName("MSSQLServer" , SQLServer) ; registerName("MSSQLServerExpress" , SQLServer) ; http://git-wip-us.apache.org/repos/asf/jena/blob/edba1313/jena-sdb/src/main/java/org/apache/jena/sdb/store/StoreFactory.java ---------------------------------------------------------------------- diff --git a/jena-sdb/src/main/java/org/apache/jena/sdb/store/StoreFactory.java b/jena-sdb/src/main/java/org/apache/jena/sdb/store/StoreFactory.java index a9cb925..58f6e46 100644 --- a/jena-sdb/src/main/java/org/apache/jena/sdb/store/StoreFactory.java +++ b/jena-sdb/src/main/java/org/apache/jena/sdb/store/StoreFactory.java @@ -173,6 +173,13 @@ public class StoreFactory @Override public Store create(SDBConnection conn, StoreDesc desc) { return new StoreTriplesNodesHashMySQL(conn, desc, desc.engineType) ; } }) ; + + // Treat as MySQL + register(MariaDB, LayoutTripleNodesHash, + new StoreMaker() { + @Override + public Store create(SDBConnection conn, StoreDesc desc) + { return new StoreTriplesNodesHashMySQL(conn, desc, desc.engineType) ; } }) ; register(PostgreSQL, LayoutTripleNodesHash, new StoreMaker() { @@ -232,6 +239,12 @@ public class StoreFactory public Store create(SDBConnection conn, StoreDesc desc) { return new StoreTriplesNodesIndexMySQL(conn, desc, desc.engineType) ; } }) ; + register(MariaDB, LayoutTripleNodesIndex, + new StoreMaker() { + @Override + public Store create(SDBConnection conn, StoreDesc desc) + { return new StoreTriplesNodesIndexMySQL(conn, desc, desc.engineType) ; } }) ; + register(PostgreSQL, LayoutTripleNodesIndex, new StoreMaker() { @Override @@ -290,6 +303,12 @@ public class StoreFactory public Store create(SDBConnection conn, StoreDesc desc) { return new StoreSimpleMySQL(conn, desc, desc.engineType) ; } }) ; + register(MariaDB, LayoutSimple, + new StoreMaker() { + @Override + public Store create(SDBConnection conn, StoreDesc desc) + { return new StoreSimpleMySQL(conn, desc, desc.engineType) ; } }) ; + register(PostgreSQL, LayoutSimple, new StoreMaker() { @Override @@ -323,7 +342,7 @@ public class StoreFactory static private void checkRegistry() { - DatabaseType[] dbTypes = {Derby, HSQLDB, H2, MySQL, PostgreSQL, SQLServer, Oracle, SAP} ; + DatabaseType[] dbTypes = {Derby, HSQLDB, H2, MySQL, MariaDB, PostgreSQL, SQLServer, Oracle, SAP} ; LayoutType[] layoutTypes = {LayoutTripleNodesHash, LayoutTripleNodesIndex, LayoutSimple} ; Set <StoreMaker> seen = new HashSet<StoreMaker>() ; http://git-wip-us.apache.org/repos/asf/jena/blob/edba1313/jena-sdb/src/main/java/org/apache/jena/sdb/util/StoreUtils.java ---------------------------------------------------------------------- diff --git a/jena-sdb/src/main/java/org/apache/jena/sdb/util/StoreUtils.java b/jena-sdb/src/main/java/org/apache/jena/sdb/util/StoreUtils.java index c259279..70248ab 100644 --- a/jena-sdb/src/main/java/org/apache/jena/sdb/util/StoreUtils.java +++ b/jena-sdb/src/main/java/org/apache/jena/sdb/util/StoreUtils.java @@ -18,13 +18,9 @@ package org.apache.jena.sdb.util; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Collection; -import java.util.HashSet; import java.sql.Connection; import java.sql.SQLException; +import java.util.* ; import org.apache.jena.graph.Node ; import org.apache.jena.query.Dataset ; @@ -67,7 +63,10 @@ public class StoreUtils public static boolean isMySQL(Store store) { - return store.getDatabaseType().equals(DatabaseType.MySQL) ; + DatabaseType type = store.getDatabaseType() ; + + return Objects.equals(type, DatabaseType.MySQL) || + Objects.equals(type, DatabaseType.MariaDB) ; } public static boolean isSQLServer(Store store)
