[exo-jcr-commits] exo-jcr SVN: r1589 - in jcr/trunk/exo.jcr.component.core/src: test/resources/conf/standalone and 1 other directory.
do-not-reply at jboss.org
do-not-reply at jboss.org
Wed Jan 27 07:58:07 EST 2010
Author: pnedonosko
Date: 2010-01-27 07:58:07 -0500 (Wed, 27 Jan 2010)
New Revision: 1589
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/DBConstants.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainer.java
jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config-sjdbc.xml
jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config.xml
Log:
EXOJCR-310 database dialect detection for JDBC data container (but not for VCAS and conf persister yet)
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/DBConstants.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/DBConstants.java 2010-01-27 12:31:50 UTC (rev 1588)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/DBConstants.java 2010-01-27 12:58:07 UTC (rev 1589)
@@ -286,7 +286,7 @@
* DB_DIALECT_HSQLDB.
*/
public final static String DB_DIALECT_HSQLDB = "HSQLDB".intern();
-
+
/**
* DB_DIALECT_DB2.
*/
@@ -316,6 +316,12 @@
* DB_DIALECT_INGRES.
*/
public final static String DB_DIALECT_INGRES = "Ingres".intern();
+
+ /**
+ * DB_DIALECT_H2.
+ */
+ public final static String DB_DIALECT_H2 = "H2".intern();
+
/**
* DB_DIALECTS.
@@ -323,6 +329,6 @@
public final static String[] DB_DIALECTS =
{DB_DIALECT_GENERIC, DB_DIALECT_ORACLE, DB_DIALECT_ORACLEOCI, DB_DIALECT_PGSQL, DB_DIALECT_MYSQL,
DB_DIALECT_HSQLDB, DB_DIALECT_DB2, DB_DIALECT_DB2V8, DB_DIALECT_MSSQL, DB_DIALECT_SYBASE, DB_DIALECT_DERBY,
- DB_DIALECT_MYSQL_UTF8, DB_DIALECT_INGRES};
+ DB_DIALECT_MYSQL_UTF8, DB_DIALECT_INGRES, DB_DIALECT_H2};
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainer.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainer.java 2010-01-27 12:31:50 UTC (rev 1588)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainer.java 2010-01-27 12:58:07 UTC (rev 1589)
@@ -45,6 +45,9 @@
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.DriverManager;
+import java.sql.SQLException;
import javax.jcr.RepositoryException;
import javax.naming.InitialContext;
@@ -190,7 +193,7 @@
String pDbDialect = null;
try
{
- pDbDialect = detectDialect(wsConfig.getContainer().getParameterValue(DB_DIALECT));
+ pDbDialect = validateDialect(wsConfig.getContainer().getParameterValue(DB_DIALECT));
LOG.info("Using a dialect '" + pDbDialect + "'");
}
catch (RepositoryConfigurationException e)
@@ -198,7 +201,6 @@
LOG.info("Using a default dialect '" + DBConstants.DB_DIALECT_GENERIC + "'");
pDbDialect = DBConstants.DB_DIALECT_GENERIC;
}
- this.dbDialect = pDbDialect;
String pDbDriver = null;
String pDbUrl = null;
@@ -233,6 +235,42 @@
this.dbPassword = pDbPassword;
this.dbSourceName = null;
LOG.info("Connect to JCR database as user '" + this.dbUserName + "'");
+
+ if (pDbDialect == DBConstants.DB_DIALECT_GENERIC)
+ {
+ // try to detect via JDBC metadata
+ Connection jdbcConn = null;
+ try
+ {
+ jdbcConn =
+ dbUserName != null ? DriverManager.getConnection(dbUrl, dbUserName, dbPassword) : DriverManager
+ .getConnection(dbUrl);
+
+ this.dbDialect = detectDialect(jdbcConn.getMetaData());
+ }
+ catch (SQLException e)
+ {
+ throw new RepositoryException(e);
+ }
+ finally
+ {
+ if (jdbcConn != null)
+ {
+ try
+ {
+ jdbcConn.close();
+ }
+ catch (SQLException e)
+ {
+ throw new RepositoryException(e);
+ }
+ }
+ }
+ }
+ else
+ {
+ this.dbDialect = pDbDialect;
+ }
}
else
{
@@ -252,6 +290,47 @@
// remove in rel.2.0
}
this.dbSourceName = sn;
+
+ if (pDbDialect == DBConstants.DB_DIALECT_GENERIC)
+ {
+ // try to detect via JDBC metadata
+ DataSource ds = (DataSource)new InitialContext().lookup(dbSourceName);
+ if (ds != null)
+ {
+ Connection jdbcConn = null;
+ try
+ {
+ jdbcConn = ds.getConnection();
+ this.dbDialect = detectDialect(jdbcConn.getMetaData());
+ }
+ catch (SQLException e)
+ {
+ throw new RepositoryException(e);
+ }
+ finally
+ {
+ if (jdbcConn != null)
+ {
+ try
+ {
+ jdbcConn.close();
+ }
+ catch (SQLException e)
+ {
+ throw new RepositoryException(e);
+ }
+ }
+ }
+ }
+ else
+ {
+ throw new RepositoryException("Datasource '" + dbSourceName + "' is not bound in this context.");
+ }
+ }
+ else
+ {
+ this.dbDialect = pDbDialect;
+ }
}
// ------------- Values swap config ------------------
@@ -301,6 +380,100 @@
}
/**
+ * Detect databse dialect using JDBC metadata. Based on code of
+ * http://svn.jboss.org/repos/hibernate/core/trunk/core/src/main/java/org/hibernate/dialect/resolver/StandardDialectResolver.java
+ *
+ * @param jdbcConn Connection
+ * @return String
+ * @throws SQLException if error occurs
+ */
+ protected String detectDialect(DatabaseMetaData metaData) throws SQLException
+ {
+ String databaseName = metaData.getDatabaseProductName();
+
+ if ("HSQL Database Engine".equals(databaseName))
+ {
+ return DBConstants.DB_DIALECT_HSQLDB;
+ }
+
+ if ("H2".equals(databaseName))
+ {
+ return DBConstants.DB_DIALECT_H2;
+ }
+
+ if ("MySQL".equals(databaseName))
+ {
+ // TODO doesn't detect MySQL_UTF8
+ return DBConstants.DB_DIALECT_MYSQL;
+ }
+
+ if ("PostgreSQL".equals(databaseName))
+ {
+ return DBConstants.DB_DIALECT_PGSQL;
+ }
+
+ if ("Apache Derby".equals(databaseName))
+ {
+ return DBConstants.DB_DIALECT_DERBY;
+ }
+
+ if ("ingres".equalsIgnoreCase(databaseName))
+ {
+ return DBConstants.DB_DIALECT_INGRES;
+ }
+
+ if (databaseName.startsWith("Microsoft SQL Server"))
+ {
+ return DBConstants.DB_DIALECT_MSSQL;
+ }
+
+ if ("Sybase SQL Server".equals(databaseName) || "Adaptive Server Enterprise".equals(databaseName))
+ {
+ return DBConstants.DB_DIALECT_SYBASE;
+ }
+
+ if (databaseName.startsWith("Adaptive Server Anywhere"))
+ {
+ // TODO not implemented anything special for
+ return DBConstants.DB_DIALECT_SYBASE;
+ }
+
+ // TODO Informix not supported now
+ //if ( "Informix Dynamic Server".equals( databaseName ) ) {
+ // return new InformixDialect();
+ //}
+
+ if (databaseName.startsWith("DB2/"))
+ {
+ // TODO doesn't detect DB2 v8
+ return DBConstants.DB_DIALECT_DB2;
+ }
+
+ if ("Oracle".equals(databaseName))
+ {
+ // TODO doesn't detect Oracle OCI (experimental support still)
+ return DBConstants.DB_DIALECT_ORACLE;
+
+ // int databaseMajorVersion = metaData.getDatabaseMajorVersion();
+ // switch ( databaseMajorVersion ) {
+ // case 11:
+ // log.warn( "Oracle 11g is not yet fully supported; using 10g dialect" );
+ // return new Oracle10gDialect();
+ // case 10:
+ // return new Oracle10gDialect();
+ // case 9:
+ // return new Oracle9iDialect();
+ // case 8:
+ // return new Oracle8iDialect();
+ // default:
+ // log.warn( "unknown Oracle major version [" + databaseMajorVersion + "]" );
+ // }
+ }
+
+ return DBConstants.DB_DIALECT_GENERIC;
+ }
+
+ /**
* Prepare sefault connection factory.
*
* @return GenericConnectionFactory
@@ -618,12 +791,14 @@
return connFactory;
}
- protected String detectDialect(String confParam)
+ protected String validateDialect(String confParam)
{
for (String dbType : DBConstants.DB_DIALECTS)
{
if (dbType.equalsIgnoreCase(confParam))
+ {
return dbType;
+ }
}
return DBConstants.DB_DIALECT_GENERIC; // by default
Modified: jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config-sjdbc.xml
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config-sjdbc.xml 2010-01-27 12:31:50 UTC (rev 1588)
+++ jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config-sjdbc.xml 2010-01-27 12:58:07 UTC (rev 1589)
@@ -32,7 +32,6 @@
<container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
<properties>
<property name="source-name" value="jdbcjcr" />
- <property name="dialect" value="hsqldb" />
<property name="multi-db" value="false" />
<property name="update-storage" value="false" />
<property name="max-buffer-size" value="200k" />
@@ -79,7 +78,6 @@
<container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
<properties>
<property name="source-name" value="jdbcjcr" />
- <property name="dialect" value="hsqldb" />
<property name="multi-db" value="false" />
<property name="update-storage" value="false" />
<property name="max-buffer-size" value="200k" />
@@ -124,7 +122,6 @@
<container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
<properties>
<property name="source-name" value="jdbcjcr" />
- <property name="dialect" value="hsqldb" />
<property name="multi-db" value="false" />
<property name="update-storage" value="false" />
<property name="max-buffer-size" value="200k" />
@@ -170,7 +167,6 @@
<container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
<properties>
<property name="source-name" value="jdbcjcr" />
- <property name="dialect" value="hsqldb" />
<property name="multi-db" value="false" />
<property name="update-storage" value="false" />
<property name="max-buffer-size" value="200k" />
@@ -240,7 +236,6 @@
<container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
<properties>
<property name="source-name" value="jdbcjcrtck" />
- <property name="dialect" value="hsqldb" />
<property name="multi-db" value="false" />
<property name="update-storage" value="false" />
<property name="max-buffer-size" value="200k" />
@@ -296,7 +291,6 @@
<container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
<properties>
<property name="source-name" value="jdbcjcrtck" />
- <property name="dialect" value="hsqldb" />
<property name="multi-db" value="false" />
<property name="update-storage" value="false" />
<property name="max-buffer-size" value="200k" />
@@ -343,7 +337,6 @@
<container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
<properties>
<property name="source-name" value="jdbcjcrtck" />
- <property name="dialect" value="hsqldb" />
<property name="multi-db" value="false" />
<property name="update-storage" value="false" />
<property name="max-buffer-size" value="200k" />
Modified: jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config.xml
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config.xml 2010-01-27 12:31:50 UTC (rev 1588)
+++ jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config.xml 2010-01-27 12:58:07 UTC (rev 1589)
@@ -33,7 +33,6 @@
<container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
<properties>
<property name="source-name" value="jdbcjcr" />
- <property name="dialect" value="hsqldb" />
<property name="multi-db" value="true" />
<property name="update-storage" value="false" />
<property name="max-buffer-size" value="200k" />
@@ -90,7 +89,6 @@
<container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
<properties>
<property name="source-name" value="jdbcjcr1" />
- <property name="dialect" value="hsqldb" />
<property name="multi-db" value="true" />
<property name="update-storage" value="false" />
<property name="max-buffer-size" value="200k" />
@@ -134,7 +132,6 @@
<container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
<properties>
<property name="source-name" value="jdbcjcr2" />
- <property name="dialect" value="hsqldb" />
<property name="multi-db" value="true" />
<property name="update-storage" value="false" />
<property name="max-buffer-size" value="200k" />
@@ -180,7 +177,6 @@
class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
<properties>
<property name="source-name" value="jdbcjcr3" />
- <property name="dialect" value="hsqldb" />
<property name="multi-db" value="true" />
<property name="update-storage" value="false" />
<property name="max-buffer-size" value="200k" />
@@ -264,7 +260,6 @@
<container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
<properties>
<property name="source-name" value="jdbcjcrtck" />
- <property name="dialect" value="hsqldb" />
<property name="multi-db" value="true" />
<property name="update-storage" value="false" />
<property name="max-buffer-size" value="200k" />
@@ -315,7 +310,6 @@
<container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
<properties>
<property name="source-name" value="jdbcjcr1tck" />
- <property name="dialect" value="hsqldb" />
<property name="multi-db" value="true" />
<property name="update-storage" value="false" />
<property name="max-buffer-size" value="200k" />
@@ -365,7 +359,6 @@
<container class="org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer">
<properties>
<property name="source-name" value="jdbcjcr2tck" />
- <property name="dialect" value="hsqldb" />
<property name="multi-db" value="true" />
<property name="update-storage" value="false" />
<property name="max-buffer-size" value="200k" />
More information about the exo-jcr-commits
mailing list