org.apache.jena.sdb.sql.JDBC Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jena-sdb Show documentation
Show all versions of jena-sdb Show documentation
SDB is a persistence layer for use with Apache Jena that uses an SQL database to store triples/quads.
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.apache.jena.sdb.sql;
/* H2 contribution from Martin HEIN (m#)/March 2008 */
/* SAP contribution from Fergal Monaghan (m#)/May 2012 */
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Locale ;
import java.util.Map;
import org.apache.jena.sdb.SDBException ;
import org.apache.jena.sdb.shared.Access ;
import org.apache.jena.sdb.shared.SDBNotFoundException ;
import org.apache.jena.sdb.store.DatabaseType ;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class JDBC
{
private static Logger log = LoggerFactory.getLogger(JDBC.class) ;
// 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 driver = new HashMap() ;
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") ;
driver.put(DatabaseType.Derby, "org.apache.derby.jdbc.EmbeddedDriver") ;
//driver.put(DatabaseType.Derby, "org.apache.derby.jdbc.ClientDriver") ;
driver.put(DatabaseType.SQLServer, "com.microsoft.sqlserver.jdbc.SQLServerDriver") ;
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) ; }
/** Explicitly load the HSQLDB driver */
static public void loadDriverHSQL() { loadDriver(driver.get(DatabaseType.HSQLDB)) ; }
/** Explicitly load the H2 driver */
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 */
static public void loadDriverDerby() { loadDriver(driver.get(DatabaseType.Derby)); }
/** Explicitly load the SQLServer driver */
static public void loadDriverSQLServer() { loadDriver(driver.get(DatabaseType.SQLServer)); }
/** Explicitly load the Oracle driver */
static public void loadDriverOracle() { loadDriver(driver.get(DatabaseType.Oracle)); }
/** Explicitly load the DB2 driver */
static public void loadDriverDB2() { loadDriver(driver.get(DatabaseType.DB2)); }
/** Explicitly load the SAP driver */
static public void loadDriverSAP() { loadDriver(driver.get(DatabaseType.SAP)); }
static public void loadDriver(String className) { loadClass(className) ; }
static public String guessDriver(String type)
{
return getDriver(DatabaseType.fetch(type)) ;
}
// This is the only place a driver is created.
public static Connection createConnection(String url, String user, String password) throws SQLException
{
if ( log.isDebugEnabled() )
log.debug("Create JDBC connection: "+url);
if ( url.equals(jdbcNone) )
return null ;
if ( user == null )
user = Access.getUser() ;
if ( password == null )
password = Access.getPassword() ;
return DriverManager.getConnection(url, user, password) ;
}
static private void loadClass(String className)
{
try { Class.forName(className); return ; }
catch (ClassNotFoundException 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) ; }
}
public static String makeURL(String type, String host, String dbName)
{ return makeURL(type, host, dbName, null, null) ; }
// How to make URLs.
public static String makeURL(String type, String host, String dbName, String user, String password)
{
if ( log.isDebugEnabled() )
log.debug(String.format("Create JDBC URL: (type=%s, host=%s, dbName=%s)", type, host, dbName)) ;
type = type.toLowerCase(Locale.ENGLISH) ;
if ( user == null )
user = Access.getUser() ;
if ( password == null )
password = Access.getPassword() ;
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 ;
}
if ( type.startsWith("hsql"))
{
String s = String.format("jdbc:%s:%s:%s", type, host, dbName) ;
return s ;
}
if ( type.startsWith("h2"))
{
if ( type.startsWith("h2:tcp") || type.startsWith("h2:ssl"))
{
String s = String.format("jdbc:%s://%s/%s", type, host, dbName) ;
return s ;
}
// The rest including -- h2:file, h2:mem or h2
// Ignores host
String s = String.format("jdbc:%s:%s", type, dbName) ;
return s ;
}
if ( type.startsWith("pgsql") || type.equals("postgresql") )
{
String s = String.format("jdbc:%s://%s/%s", type, host, dbName) ;
return s ;
}
if ( type.equals("derby") )
{
//jdbc:derby:sdb2;create=true
String s = String.format("jdbc:%s:%s;create=true", type, dbName) ;
return s ;
}
if ( type.equals("mssqlserver") || type.equals("sqlserver") )
{
//jdbc:sqlserver://localhost;databaseName=sdb_layout1
String s = String.format("jdbc:%s://%s;databaseName=%s", "sqlserver", host, dbName) ;
return s ;
}
if ( type.equals("mssqlserverexpress") || type.equals("sqlserverexpress"))
{
//jdbc:sqlserver://${TESTHOST}\\SQLEXPRESS;databaseName=jenatest"
String s = String.format("jdbc:%s://%s\\SQLEXPRESS;databaseName=%s","sqlserver",host, dbName) ;
return s ;
}
if ( type.startsWith("oracle:") )
{
String s = String.format("jdbc:%s:@%s:%s", type, host, dbName) ;
return s;
}
if ( type.equals("oracle") )
{
// If not specified, use the thin driver.
String s = String.format("jdbc:%s:thin:@%s:%s", type, host, dbName) ;
return s;
}
if ( type.equals("db2") )
{
String s = String.format("jdbc:%s://%s/%s", type, host, dbName) ;
return s;
}
if ( type.equals("sap") )
{
String s = String.format("jdbc:%s://%s:3%s15", type, host, dbName) ;
return s ;
}
if ( type.equals("none") )
return jdbcNone ;
throw new SDBException("Don't know how to construct a JDBC URL for "+type) ;
}
}