You are viewing a plain text version of this content. The canonical link for it is here.
Posted to torque-dev@db.apache.org by tv...@apache.org on 2011/08/31 16:28:36 UTC
svn commit: r1163638 - in
/db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque:
TorqueInstance.java adapter/DB.java adapter/DBFactory.java
Author: tv
Date: Wed Aug 31 14:28:36 2011
New Revision: 1163638
URL: http://svn.apache.org/viewvc?rev=1163638&view=rev
Log:
Add auto-detection of the database adapter. Use xxx.adapter=auto in Torque.properties.
Modified:
db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/TorqueInstance.java
db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/adapter/DB.java
db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/adapter/DBFactory.java
Modified: db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/TorqueInstance.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/TorqueInstance.java?rev=1163638&r1=1163637&r2=1163638&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/TorqueInstance.java (original)
+++ db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/TorqueInstance.java Wed Aug 31 14:28:36 2011
@@ -29,6 +29,7 @@ import java.util.Map;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.torque.adapter.DB;
@@ -99,7 +100,7 @@ public class TorqueInstance
* are serialized then unserialized prior to Torque being reinitialized.
* This condition exists in a normal catalina restart.
*/
- private Map<String, MapBuilder> mapBuilderCache
+ private Map<String, MapBuilder> mapBuilderCache
= Collections.synchronizedMap(new HashMap<String, MapBuilder>());
;
@@ -143,8 +144,8 @@ public class TorqueInstance
// look for properties that are in the "torque" namespace.
initDefaultDbName(conf);
- initAdapters(conf);
initDataSourceFactories(conf);
+ initAdapters(conf);
// setup manager mappings
initManagerMappings(conf);
@@ -252,9 +253,30 @@ public class TorqueInstance
String adapter = c.getString(key);
String handle = key.substring(0, key.indexOf('.'));
- DB db;
+ Database database = getOrCreateDatabase(handle);
+ DB db = null;
- db = DBFactory.create(adapter);
+ if (StringUtils.equals(DB.AUTODETECT_ADAPTER, adapter))
+ {
+ Connection con = null;
+ try
+ {
+ con = database.getDataSourceFactory().getDataSource().getConnection();
+ db = DBFactory.autoDetectAdapter(con);
+ }
+ catch (SQLException e)
+ {
+ log.error("Could not get product information from JDBC", e);
+ }
+ finally
+ {
+ closeConnection(con);
+ }
+ }
+ else
+ {
+ db = DBFactory.create(adapter);
+ }
// Not supported, try manually defined adapter class
if (db == null)
@@ -263,8 +285,6 @@ public class TorqueInstance
db = DBFactory.create(adapter, adapterClassName);
}
- Database database = getOrCreateDatabase(handle);
-
// register the adapter for this name
database.setAdapter(db);
log.debug("Adding " + adapter + " -> "
Modified: db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/adapter/DB.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/adapter/DB.java?rev=1163638&r1=1163637&r2=1163638&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/adapter/DB.java (original)
+++ db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/adapter/DB.java Wed Aug 31 14:28:36 2011
@@ -26,7 +26,10 @@ import java.util.Date;
import org.apache.torque.TorqueException;
import org.apache.torque.sql.Query;
+import org.apache.torque.util.functions.AbstractFunction;
+import org.apache.torque.util.functions.Aggregate;
import org.apache.torque.util.functions.FunctionEnum;
+import org.apache.torque.util.functions.SQLFunction;
/**
* <code>DB</code> defines the interface for a Torque database
@@ -109,6 +112,11 @@ public interface DB extends Serializable
String DRIVER_KEY = "driver";
/**
+ * Special adapter for auto-detection.
+ */
+ String AUTODETECT_ADAPTER = "auto";
+
+ /**
* This method is used to ignore case.
*
* @param in The string to transform to upper case.
Modified: db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/adapter/DBFactory.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/adapter/DBFactory.java?rev=1163638&r1=1163637&r2=1163638&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/adapter/DBFactory.java (original)
+++ db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/adapter/DBFactory.java Wed Aug 31 14:28:36 2011
@@ -19,9 +19,15 @@ package org.apache.torque.adapter;
* under the License.
*/
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
/**
* This class creates different {@link org.apache.torque.adapter.DB}
* objects based on specified JDBC driver name.
@@ -36,7 +42,10 @@ import java.util.Map;
*/
public final class DBFactory
{
- /**
+ /** Local logger */
+ private static final Log log = LogFactory.getLog(DBFactory.class);
+
+ /**
* JDBC driver to Torque Adapter map.
*/
private static Map<String, Class<? extends DB>> adapters
@@ -94,9 +103,26 @@ public final class DBFactory
adapters.put("informix", DBInformix.class);
adapters.put("odbc", DBOdbc.class);
adapters.put("msaccess", DBOdbc.class);
-
adapters.put("derby", DBDerby.class);
+ // add database product names to be used for auto-detection
+ adapters.put("DB2/NT", DBDB2App.class);
+ adapters.put("DB2/LINUX", DBDB2App.class);
+ adapters.put("DB2/6000", DBDB2App.class);
+ adapters.put("DB2/HPUX", DBDB2App.class);
+ adapters.put("DB2/SUN", DBDB2App.class);
+ adapters.put("DB2/LINUX390", DBDB2App.class);
+ adapters.put("DB2/AIX64", DBDB2App.class);
+ adapters.put("HSQL Database Engine", DBHypersonicSQL.class);
+ adapters.put("Microsoft SQL Server Database", DBMSSQL.class);
+ adapters.put("Microsoft SQL Server", DBMSSQL.class);
+ adapters.put("MySQL", DBMM.class);
+ adapters.put("Oracle", DBOracle.class);
+ adapters.put("PostgreSQL", DBPostgres.class);
+ adapters.put("Sybase SQL Server", DBSybase.class);
+ adapters.put("Informix Dynamic Server", DBInformix.class);
+ adapters.put("Apache Derby", DBDerby.class);
+
adapters.put("", DBNone.class);
}
@@ -110,6 +136,46 @@ public final class DBFactory
}
/**
+ * Creates a new instance of the Torque database adapter based on
+ * the JDBC meta-data
+ *
+ * @param con a database connection
+ * @return An instance of a Torque database adapter, or null if
+ * no adapter could be detected.
+ * @throws InstantiationException if the adapter could not be
+ * instantiated
+ * @throws SQLException if there are problems getting the JDBC meta data
+ */
+ public static DB autoDetectAdapter(Connection con)
+ throws InstantiationException, SQLException
+ {
+ DatabaseMetaData dmd = con.getMetaData();
+ String dbmsName = dmd.getDatabaseProductName();
+
+ Class<? extends DB> adapterClass = adapters.get(dbmsName);
+
+ if (adapterClass == null)
+ {
+ throw new InstantiationException("Could not detect adapter for database: " + dbmsName);
+ }
+
+ log.info("Mapped database product " + dbmsName + " to adapter " + adapterClass.getSimpleName());
+
+ try
+ {
+ DB adapter = adapterClass.newInstance();
+ return adapter;
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new InstantiationException(
+ "Could not instantiate adapter for database: "
+ + dbmsName
+ + ": Assure that adapter classes are in your classpath");
+ }
+ }
+
+ /**
* Creates a new instance of the Torque database adapter associated
* with the specified JDBC driver or adapter key.
*
@@ -132,7 +198,7 @@ public final class DBFactory
try
{
- DB adapter = (DB) adapterClass.newInstance();
+ DB adapter = adapterClass.newInstance();
// adapter.setJDBCDriver(driver);
return adapter;
}
@@ -164,7 +230,7 @@ public final class DBFactory
try
{
- adapterClass = (Class<?>) Class.forName(className);
+ adapterClass = Class.forName(className);
}
catch (ClassNotFoundException e)
{
---------------------------------------------------------------------
To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org
For additional commands, e-mail: torque-dev-help@db.apache.org