[infinispan-commits] Infinispan SVN: r2543 - trunk/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc and 1 other directory.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Thu Oct 21 08:42:20 EDT 2010


Author: trustin
Date: 2010-10-21 08:42:20 -0400 (Thu, 21 Oct 2010)
New Revision: 2543

Modified:
   branches/4.2.x/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/DataManipulationHelper.java
   branches/4.2.x/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/DatabaseType.java
   branches/4.2.x/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/TableManipulation.java
   trunk/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/DataManipulationHelper.java
   trunk/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/DatabaseType.java
   trunk/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/TableManipulation.java
Log:
Resolved issue: ISPN-698 (DB2 - SQL Parameterization issue on FETCH FIRST ? clause)
* Added DatabaseType.DB2_390
* Added TableManipulation.isVariableLimitSupported()
* DataManipulationHelper refrains from parameterized FETCH FIRST ? clause if TableManipulation.isVariableLimitSupported() returns false.

Modified: branches/4.2.x/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/DataManipulationHelper.java
===================================================================
--- branches/4.2.x/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/DataManipulationHelper.java	2010-10-21 12:41:37 UTC (rev 2542)
+++ branches/4.2.x/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/DataManipulationHelper.java	2010-10-21 12:42:20 UTC (rev 2543)
@@ -21,13 +21,6 @@
  */
 package org.infinispan.loaders.jdbc;
 
-import org.infinispan.container.entries.InternalCacheEntry;
-import org.infinispan.loaders.CacheLoaderException;
-import org.infinispan.loaders.jdbc.connectionfactory.ConnectionFactory;
-import org.infinispan.marshall.StreamingMarshaller;
-import org.infinispan.util.logging.Log;
-import org.infinispan.util.logging.LogFactory;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.ObjectInput;
@@ -39,6 +32,13 @@
 import java.util.HashSet;
 import java.util.Set;
 
+import org.infinispan.container.entries.InternalCacheEntry;
+import org.infinispan.loaders.CacheLoaderException;
+import org.infinispan.loaders.jdbc.connectionfactory.ConnectionFactory;
+import org.infinispan.marshall.StreamingMarshaller;
+import org.infinispan.util.logging.Log;
+import org.infinispan.util.logging.LogFactory;
+
 /**
  * The purpose of this class is to factorize the repeating code between {@link org.infinispan.loaders.jdbc.stringbased.JdbcStringBasedCacheStore}
  * and {@link org.infinispan.loaders.jdbc.binary.JdbcBinaryCacheStore}. This class implements GOF's template method pattern.
@@ -49,8 +49,8 @@
 
    private static final Log log = LogFactory.getLog(DataManipulationHelper.class);
 
-   private ConnectionFactory connectionFactory;
-   private TableManipulation tableManipulation;
+   private final ConnectionFactory connectionFactory;
+   private final TableManipulation tableManipulation;
    protected StreamingMarshaller marshaller;
 
 
@@ -68,8 +68,9 @@
          conn = connectionFactory.getConnection();
          ps = conn.prepareStatement(sql);
          int result = ps.executeUpdate();
-         if (log.isTraceEnabled())
+         if (log.isTraceEnabled()) {
             log.trace("Successfully removed " + result + " rows.");
+         }
       } catch (SQLException ex) {
          logAndThrow(ex, "Failed clearing JdbcBinaryCacheStore");
       } finally {
@@ -96,15 +97,18 @@
             readCount++;
             if (readCount % batchSize == 0) {
                ps.executeBatch();
-               if (log.isTraceEnabled())
-                  log.trace("Executing batch " + (readCount / batchSize) + ", batch size is " + batchSize);
+               if (log.isTraceEnabled()) {
+                  log.trace("Executing batch " + readCount / batchSize + ", batch size is " + batchSize);
+               }
             }
             objFromStream = marshaller.objectFromObjectStream(objectInput);
          }
-         if (readCount % batchSize != 0)
+         if (readCount % batchSize != 0) {
             ps.executeBatch();//flush the batch
-         if (log.isTraceEnabled())
+         }
+         if (log.isTraceEnabled()) {
             log.trace("Successfully inserted " + readCount + " buckets into the database, batch size is " + batchSize);
+         }
       } catch (IOException ex) {
          logAndThrow(ex, "I/O failure while integrating state into store");
       } catch (SQLException e) {
@@ -125,10 +129,14 @@
       ResultSet rs = null;
       try {
          String sql = filterExpired ? tableManipulation.getLoadNonExpiredAllRowsSql() : tableManipulation.getLoadAllRowsSql();
-         if (log.isTraceEnabled()) log.trace("Running sql '" + sql);
+         if (log.isTraceEnabled()) {
+            log.trace("Running sql '" + sql);
+         }
          connection = connectionFactory.getConnection();
          ps = connection.prepareStatement(sql);
-         if (filterExpired) ps.setLong(1, System.currentTimeMillis());
+         if (filterExpired) {
+            ps.setLong(1, System.currentTimeMillis());
+         }
          rs = ps.executeQuery();
          rs.setFetchSize(tableManipulation.getFetchSize());
          while (rs.next()) {
@@ -154,10 +162,14 @@
       ResultSet rs = null;
       try {
          String sql = filterExpired ? tableManipulation.getLoadNonExpiredAllRowsSql() : tableManipulation.getLoadAllRowsSql();
-         if (log.isTraceEnabled()) log.trace("Running sql '" + sql);
+         if (log.isTraceEnabled()) {
+            log.trace("Running sql '" + sql);
+         }
          conn = connectionFactory.getConnection();
          ps = conn.prepareStatement(sql);
-         if (filterExpired) ps.setLong(1, System.currentTimeMillis());
+         if (filterExpired) {
+            ps.setLong(1, System.currentTimeMillis());
+         }
          rs = ps.executeQuery();
          rs.setFetchSize(tableManipulation.getFetchSize());
          Set<InternalCacheEntry> result = new HashSet<InternalCacheEntry>(tableManipulation.getFetchSize());
@@ -183,13 +195,17 @@
       try {
 
          String sql = getLoadAllKeysSql();
-         if (log.isTraceEnabled()) log.trace("Running sql '" + sql);
+         if (log.isTraceEnabled()) {
+            log.trace("Running sql '" + sql);
+         }
          conn = connectionFactory.getConnection();
          ps = conn.prepareStatement(sql);
          rs = ps.executeQuery();
          rs.setFetchSize(tableManipulation.getFetchSize());
          Set<Object> result = new HashSet<Object>(tableManipulation.getFetchSize());
-         while (rs.next()) loadAllKeysProcess(rs, result, keysToExclude);
+         while (rs.next()) {
+            loadAllKeysProcess(rs, result, keysToExclude);
+         }
          return result;
       } catch (SQLException e) {
          String message = "SQL error while fetching all StoredEntries";
@@ -208,10 +224,16 @@
       ResultSet rs = null;
       try {
          String sql = tableManipulation.getLoadSomeRowsSql();
-         if (log.isTraceEnabled()) log.trace("Running sql '" + sql);
+         if (log.isTraceEnabled()) {
+            log.trace("Running sql '" + sql);
+         }
          conn = connectionFactory.getConnection();
-         ps = conn.prepareStatement(sql);
-         ps.setInt(1, maxEntries);
+         if (tableManipulation.isVariableLimitSupported()) {
+            ps = conn.prepareStatement(sql);
+            ps.setInt(1, maxEntries);
+         } else {
+            ps = conn.prepareStatement(sql.replace("?", String.valueOf(maxEntries)));
+         }
          rs = ps.executeQuery();
          rs.setFetchSize(tableManipulation.getFetchSize());
          Set<InternalCacheEntry> result = new HashSet<InternalCacheEntry>(maxEntries);

Modified: branches/4.2.x/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/DatabaseType.java
===================================================================
--- branches/4.2.x/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/DatabaseType.java	2010-10-21 12:41:37 UTC (rev 2542)
+++ branches/4.2.x/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/DatabaseType.java	2010-10-21 12:42:20 UTC (rev 2543)
@@ -8,7 +8,7 @@
  */
 public enum DatabaseType {
    MYSQL, POSTGRES, DERBY, HSQL, H2, SQLITE,
-   DB2,
+   DB2, DB2_390,
    INFORMIX, INTERBASE, FIREBIRD,
    SQL_SERVER, ACCESS,
    ORACLE;

Modified: branches/4.2.x/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/TableManipulation.java
===================================================================
--- branches/4.2.x/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/TableManipulation.java	2010-10-21 12:41:37 UTC (rev 2542)
+++ branches/4.2.x/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/TableManipulation.java	2010-10-21 12:42:20 UTC (rev 2543)
@@ -21,12 +21,6 @@
  */
 package org.infinispan.loaders.jdbc;
 
-import org.infinispan.config.ConfigurationException;
-import org.infinispan.loaders.CacheLoaderException;
-import org.infinispan.loaders.jdbc.connectionfactory.ConnectionFactory;
-import org.infinispan.util.logging.Log;
-import org.infinispan.util.logging.LogFactory;
-
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
@@ -35,6 +29,12 @@
 import java.util.Arrays;
 import java.util.Locale;
 
+import org.infinispan.config.ConfigurationException;
+import org.infinispan.loaders.CacheLoaderException;
+import org.infinispan.loaders.jdbc.connectionfactory.ConnectionFactory;
+import org.infinispan.util.logging.Log;
+import org.infinispan.util.logging.LogFactory;
+
 /**
  * Contains all the logic of manipulating the table, including creating it if needed and access operations like
  * inserting, selecting etc. Used by JDBC based cache loaders.
@@ -153,8 +153,9 @@
             + " NOT NULL, " + dataColumnName + " " + dataColumnType + ", "
             + timestampColumnName + " " + timestampColumnType +
             ", PRIMARY KEY (" + idColumnName + "))";
-      if (log.isTraceEnabled())
+      if (log.isTraceEnabled()) {
          log.trace("Creating table with following DDL: '" + createTableDdl + "'.");
+      }
       executeUpdateSql(conn, createTableDdl);
    }
 
@@ -170,7 +171,9 @@
    }
 
    private void assertNotNull(String keyColumnType, String message) throws CacheLoaderException {
-      if (keyColumnType == null || keyColumnType.trim().length() == 0) throw new CacheLoaderException(message);
+      if (keyColumnType == null || keyColumnType.trim().length() == 0) {
+         throw new CacheLoaderException(message);
+      }
    }
 
    private void executeUpdateSql(Connection conn, String sql) throws CacheLoaderException {
@@ -190,13 +193,14 @@
       String dropTableDdl = "DROP TABLE " + getTableName();
       String clearTable = "DELETE FROM " + getTableName();
       executeUpdateSql(conn, clearTable);
-      if (log.isTraceEnabled())
+      if (log.isTraceEnabled()) {
          log.trace("Dropping table with following DDL '" + dropTableDdl + "\'");
+      }
       executeUpdateSql(conn, dropTableDdl);
    }
 
    private static String toLowerCase(String s) {
-      return s.toLowerCase((Locale.ENGLISH));
+      return s.toLowerCase(Locale.ENGLISH);
    }
 
    private static String toUpperCase(String s) {
@@ -421,9 +425,14 @@
 
    public void setCacheName(String cacheName) {
       this.cacheName = cacheName;
-      this.tableName = null;
+      tableName = null;
    }
 
+   public boolean isVariableLimitSupported() {
+      DatabaseType type = getDatabaseType();
+      return type != DatabaseType.DB2_390;
+   }
+
    public String getLoadSomeRowsSql() {
       if (loadSomeRowsSql == null) {
          // this stuff is going to be database specific!!
@@ -434,6 +443,7 @@
                loadSomeRowsSql = String.format("SELECT %s, %s FROM (SELECT %s, %s FROM %s) WHERE ROWNUM <= ?", dataColumnName, idColumnName, dataColumnName, idColumnName, getTableName());
                break;
             case DB2:
+            case DB2_390:
                loadSomeRowsSql = String.format("SELECT %s, %s FROM %s FETCH FIRST ? ROWS ONLY", dataColumnName, idColumnName, getTableName());
                break;
             case INFORMIX:
@@ -456,12 +466,16 @@
    }
 
    public String getLoadAllKeysBinarySql() {
-      if (loadAllKeysBinarySql == null) loadAllKeysBinarySql = String.format("SELECT %s FROM %s", dataColumnName, getTableName());
+      if (loadAllKeysBinarySql == null) {
+         loadAllKeysBinarySql = String.format("SELECT %s FROM %s", dataColumnName, getTableName());
+      }
       return loadAllKeysBinarySql;
    }
 
    public String getLoadAllKeysStringSql() {
-      if (loadAllKeysStringSql == null) loadAllKeysStringSql = String.format("SELECT %s FROM %s", idColumnName, getTableName());
+      if (loadAllKeysStringSql == null) {
+         loadAllKeysStringSql = String.format("SELECT %s FROM %s", idColumnName, getTableName());
+      }
       return loadAllKeysStringSql;
    }
 
@@ -474,7 +488,9 @@
          } catch (Exception e) {
             log.debug("Unable to guess database type from JDBC metadata.", e);
          }
-         if (databaseType == null) log.info("Unable to detect database type using connection metadata.  Attempting to guess on driver name.");
+         if (databaseType == null) {
+            log.info("Unable to detect database type using connection metadata.  Attempting to guess on driver name.");
+         }
          try {
             String dbProduct = connectionFactory.getConnection().getMetaData().getDriverName();
             databaseType = guessDatabaseType(dbProduct);
@@ -482,10 +498,11 @@
             log.debug("Unable to guess database type from JDBC driver name.", e);
          }
 
-         if (databaseType == null)
+         if (databaseType == null) {
             throw new ConfigurationException("Unable to detect database type from JDBC driver name or connection metadata.  Please provide this manually using the 'databaseType' property in your configuration.  Supported database type strings are " + Arrays.toString(DatabaseType.values()));
-         else
+         } else {
             log.info("Guessing database type as '" + databaseType + "'.  If this is incorrect, please specify the correct type using the 'databaseType' property in your configuration.  Supported database type strings are " + Arrays.toString(DatabaseType.values()));
+         }
       }
       return databaseType;
    }
@@ -493,32 +510,33 @@
    private DatabaseType guessDatabaseType(String name) {
       DatabaseType type = null;
       if (name != null) {
-         if (name.toLowerCase().contains("mysql"))
+         if (name.toLowerCase().contains("mysql")) {
             type = DatabaseType.MYSQL;
-         else if (name.toLowerCase().contains("postgres"))
+         } else if (name.toLowerCase().contains("postgres")) {
             type = DatabaseType.POSTGRES;
-         else if (name.toLowerCase().contains("derby"))
+         } else if (name.toLowerCase().contains("derby")) {
             type = DatabaseType.DERBY;
-         else if (name.toLowerCase().contains("hsql") || name.toLowerCase().contains("hypersonic"))
+         } else if (name.toLowerCase().contains("hsql") || name.toLowerCase().contains("hypersonic")) {
             type = DatabaseType.HSQL;
-         else if (name.toLowerCase().contains("h2"))
+         } else if (name.toLowerCase().contains("h2")) {
             type = DatabaseType.H2;
-         else if (name.toLowerCase().contains("sqlite"))
+         } else if (name.toLowerCase().contains("sqlite")) {
             type = DatabaseType.SQLITE;
-         else if (name.toLowerCase().contains("db2"))
+         } else if (name.toLowerCase().contains("db2")) {
             type = DatabaseType.DB2;
-         else if (name.toLowerCase().contains("informix"))
+         } else if (name.toLowerCase().contains("informix")) {
             type = DatabaseType.INFORMIX;
-         else if (name.toLowerCase().contains("interbase"))
+         } else if (name.toLowerCase().contains("interbase")) {
             type = DatabaseType.INTERBASE;
-         else if (name.toLowerCase().contains("firebird"))
+         } else if (name.toLowerCase().contains("firebird")) {
             type = DatabaseType.FIREBIRD;
-         else if (name.toLowerCase().contains("sqlserver") || name.toLowerCase().contains("microsoft"))
+         } else if (name.toLowerCase().contains("sqlserver") || name.toLowerCase().contains("microsoft")) {
             type = DatabaseType.SQL_SERVER;
-         else if (name.toLowerCase().contains("access"))
+         } else if (name.toLowerCase().contains("access")) {
             type = DatabaseType.ACCESS;
-         else if (name.toLowerCase().contains("oracle"))
+         } else if (name.toLowerCase().contains("oracle")) {
             type = DatabaseType.ORACLE;
+         }
       }
       return type;
    }

Modified: trunk/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/DataManipulationHelper.java
===================================================================
--- trunk/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/DataManipulationHelper.java	2010-10-21 12:41:37 UTC (rev 2542)
+++ trunk/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/DataManipulationHelper.java	2010-10-21 12:42:20 UTC (rev 2543)
@@ -21,13 +21,6 @@
  */
 package org.infinispan.loaders.jdbc;
 
-import org.infinispan.container.entries.InternalCacheEntry;
-import org.infinispan.loaders.CacheLoaderException;
-import org.infinispan.loaders.jdbc.connectionfactory.ConnectionFactory;
-import org.infinispan.marshall.StreamingMarshaller;
-import org.infinispan.util.logging.Log;
-import org.infinispan.util.logging.LogFactory;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.ObjectInput;
@@ -39,6 +32,13 @@
 import java.util.HashSet;
 import java.util.Set;
 
+import org.infinispan.container.entries.InternalCacheEntry;
+import org.infinispan.loaders.CacheLoaderException;
+import org.infinispan.loaders.jdbc.connectionfactory.ConnectionFactory;
+import org.infinispan.marshall.StreamingMarshaller;
+import org.infinispan.util.logging.Log;
+import org.infinispan.util.logging.LogFactory;
+
 /**
  * The purpose of this class is to factorize the repeating code between {@link org.infinispan.loaders.jdbc.stringbased.JdbcStringBasedCacheStore}
  * and {@link org.infinispan.loaders.jdbc.binary.JdbcBinaryCacheStore}. This class implements GOF's template method pattern.
@@ -49,8 +49,8 @@
 
    private static final Log log = LogFactory.getLog(DataManipulationHelper.class);
 
-   private ConnectionFactory connectionFactory;
-   private TableManipulation tableManipulation;
+   private final ConnectionFactory connectionFactory;
+   private final TableManipulation tableManipulation;
    protected StreamingMarshaller marshaller;
 
 
@@ -68,8 +68,9 @@
          conn = connectionFactory.getConnection();
          ps = conn.prepareStatement(sql);
          int result = ps.executeUpdate();
-         if (log.isTraceEnabled())
+         if (log.isTraceEnabled()) {
             log.trace("Successfully removed " + result + " rows.");
+         }
       } catch (SQLException ex) {
          logAndThrow(ex, "Failed clearing JdbcBinaryCacheStore");
       } finally {
@@ -96,15 +97,18 @@
             readCount++;
             if (readCount % batchSize == 0) {
                ps.executeBatch();
-               if (log.isTraceEnabled())
-                  log.trace("Executing batch " + (readCount / batchSize) + ", batch size is " + batchSize);
+               if (log.isTraceEnabled()) {
+                  log.trace("Executing batch " + readCount / batchSize + ", batch size is " + batchSize);
+               }
             }
             objFromStream = marshaller.objectFromObjectStream(objectInput);
          }
-         if (readCount % batchSize != 0)
+         if (readCount % batchSize != 0) {
             ps.executeBatch();//flush the batch
-         if (log.isTraceEnabled())
+         }
+         if (log.isTraceEnabled()) {
             log.trace("Successfully inserted " + readCount + " buckets into the database, batch size is " + batchSize);
+         }
       } catch (IOException ex) {
          logAndThrow(ex, "I/O failure while integrating state into store");
       } catch (SQLException e) {
@@ -125,10 +129,14 @@
       ResultSet rs = null;
       try {
          String sql = filterExpired ? tableManipulation.getLoadNonExpiredAllRowsSql() : tableManipulation.getLoadAllRowsSql();
-         if (log.isTraceEnabled()) log.trace("Running sql '" + sql);
+         if (log.isTraceEnabled()) {
+            log.trace("Running sql '" + sql);
+         }
          connection = connectionFactory.getConnection();
          ps = connection.prepareStatement(sql);
-         if (filterExpired) ps.setLong(1, System.currentTimeMillis());
+         if (filterExpired) {
+            ps.setLong(1, System.currentTimeMillis());
+         }
          rs = ps.executeQuery();
          rs.setFetchSize(tableManipulation.getFetchSize());
          while (rs.next()) {
@@ -154,10 +162,14 @@
       ResultSet rs = null;
       try {
          String sql = filterExpired ? tableManipulation.getLoadNonExpiredAllRowsSql() : tableManipulation.getLoadAllRowsSql();
-         if (log.isTraceEnabled()) log.trace("Running sql '" + sql);
+         if (log.isTraceEnabled()) {
+            log.trace("Running sql '" + sql);
+         }
          conn = connectionFactory.getConnection();
          ps = conn.prepareStatement(sql);
-         if (filterExpired) ps.setLong(1, System.currentTimeMillis());
+         if (filterExpired) {
+            ps.setLong(1, System.currentTimeMillis());
+         }
          rs = ps.executeQuery();
          rs.setFetchSize(tableManipulation.getFetchSize());
          Set<InternalCacheEntry> result = new HashSet<InternalCacheEntry>(tableManipulation.getFetchSize());
@@ -183,13 +195,17 @@
       try {
 
          String sql = getLoadAllKeysSql();
-         if (log.isTraceEnabled()) log.trace("Running sql '" + sql);
+         if (log.isTraceEnabled()) {
+            log.trace("Running sql '" + sql);
+         }
          conn = connectionFactory.getConnection();
          ps = conn.prepareStatement(sql);
          rs = ps.executeQuery();
          rs.setFetchSize(tableManipulation.getFetchSize());
          Set<Object> result = new HashSet<Object>(tableManipulation.getFetchSize());
-         while (rs.next()) loadAllKeysProcess(rs, result, keysToExclude);
+         while (rs.next()) {
+            loadAllKeysProcess(rs, result, keysToExclude);
+         }
          return result;
       } catch (SQLException e) {
          String message = "SQL error while fetching all StoredEntries";
@@ -208,10 +224,16 @@
       ResultSet rs = null;
       try {
          String sql = tableManipulation.getLoadSomeRowsSql();
-         if (log.isTraceEnabled()) log.trace("Running sql '" + sql);
+         if (log.isTraceEnabled()) {
+            log.trace("Running sql '" + sql);
+         }
          conn = connectionFactory.getConnection();
-         ps = conn.prepareStatement(sql);
-         ps.setInt(1, maxEntries);
+         if (tableManipulation.isVariableLimitSupported()) {
+            ps = conn.prepareStatement(sql);
+            ps.setInt(1, maxEntries);
+         } else {
+            ps = conn.prepareStatement(sql.replace("?", String.valueOf(maxEntries)));
+         }
          rs = ps.executeQuery();
          rs.setFetchSize(tableManipulation.getFetchSize());
          Set<InternalCacheEntry> result = new HashSet<InternalCacheEntry>(maxEntries);

Modified: trunk/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/DatabaseType.java
===================================================================
--- trunk/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/DatabaseType.java	2010-10-21 12:41:37 UTC (rev 2542)
+++ trunk/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/DatabaseType.java	2010-10-21 12:42:20 UTC (rev 2543)
@@ -8,7 +8,7 @@
  */
 public enum DatabaseType {
    MYSQL, POSTGRES, DERBY, HSQL, H2, SQLITE,
-   DB2,
+   DB2, DB2_390,
    INFORMIX, INTERBASE, FIREBIRD,
    SQL_SERVER, ACCESS,
    ORACLE;

Modified: trunk/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/TableManipulation.java
===================================================================
--- trunk/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/TableManipulation.java	2010-10-21 12:41:37 UTC (rev 2542)
+++ trunk/cachestore/jdbc/src/main/java/org/infinispan/loaders/jdbc/TableManipulation.java	2010-10-21 12:42:20 UTC (rev 2543)
@@ -21,12 +21,6 @@
  */
 package org.infinispan.loaders.jdbc;
 
-import org.infinispan.config.ConfigurationException;
-import org.infinispan.loaders.CacheLoaderException;
-import org.infinispan.loaders.jdbc.connectionfactory.ConnectionFactory;
-import org.infinispan.util.logging.Log;
-import org.infinispan.util.logging.LogFactory;
-
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
@@ -35,6 +29,12 @@
 import java.util.Arrays;
 import java.util.Locale;
 
+import org.infinispan.config.ConfigurationException;
+import org.infinispan.loaders.CacheLoaderException;
+import org.infinispan.loaders.jdbc.connectionfactory.ConnectionFactory;
+import org.infinispan.util.logging.Log;
+import org.infinispan.util.logging.LogFactory;
+
 /**
  * Contains all the logic of manipulating the table, including creating it if needed and access operations like
  * inserting, selecting etc. Used by JDBC based cache loaders.
@@ -153,8 +153,9 @@
             + " NOT NULL, " + dataColumnName + " " + dataColumnType + ", "
             + timestampColumnName + " " + timestampColumnType +
             ", PRIMARY KEY (" + idColumnName + "))";
-      if (log.isTraceEnabled())
+      if (log.isTraceEnabled()) {
          log.trace("Creating table with following DDL: '" + createTableDdl + "'.");
+      }
       executeUpdateSql(conn, createTableDdl);
    }
 
@@ -170,7 +171,9 @@
    }
 
    private void assertNotNull(String keyColumnType, String message) throws CacheLoaderException {
-      if (keyColumnType == null || keyColumnType.trim().length() == 0) throw new CacheLoaderException(message);
+      if (keyColumnType == null || keyColumnType.trim().length() == 0) {
+         throw new CacheLoaderException(message);
+      }
    }
 
    private void executeUpdateSql(Connection conn, String sql) throws CacheLoaderException {
@@ -190,13 +193,14 @@
       String dropTableDdl = "DROP TABLE " + getTableName();
       String clearTable = "DELETE FROM " + getTableName();
       executeUpdateSql(conn, clearTable);
-      if (log.isTraceEnabled())
+      if (log.isTraceEnabled()) {
          log.trace("Dropping table with following DDL '" + dropTableDdl + "\'");
+      }
       executeUpdateSql(conn, dropTableDdl);
    }
 
    private static String toLowerCase(String s) {
-      return s.toLowerCase((Locale.ENGLISH));
+      return s.toLowerCase(Locale.ENGLISH);
    }
 
    private static String toUpperCase(String s) {
@@ -421,9 +425,14 @@
 
    public void setCacheName(String cacheName) {
       this.cacheName = cacheName;
-      this.tableName = null;
+      tableName = null;
    }
 
+   public boolean isVariableLimitSupported() {
+      DatabaseType type = getDatabaseType();
+      return type != DatabaseType.DB2_390;
+   }
+
    public String getLoadSomeRowsSql() {
       if (loadSomeRowsSql == null) {
          // this stuff is going to be database specific!!
@@ -434,6 +443,7 @@
                loadSomeRowsSql = String.format("SELECT %s, %s FROM (SELECT %s, %s FROM %s) WHERE ROWNUM <= ?", dataColumnName, idColumnName, dataColumnName, idColumnName, getTableName());
                break;
             case DB2:
+            case DB2_390:
                loadSomeRowsSql = String.format("SELECT %s, %s FROM %s FETCH FIRST ? ROWS ONLY", dataColumnName, idColumnName, getTableName());
                break;
             case INFORMIX:
@@ -456,12 +466,16 @@
    }
 
    public String getLoadAllKeysBinarySql() {
-      if (loadAllKeysBinarySql == null) loadAllKeysBinarySql = String.format("SELECT %s FROM %s", dataColumnName, getTableName());
+      if (loadAllKeysBinarySql == null) {
+         loadAllKeysBinarySql = String.format("SELECT %s FROM %s", dataColumnName, getTableName());
+      }
       return loadAllKeysBinarySql;
    }
 
    public String getLoadAllKeysStringSql() {
-      if (loadAllKeysStringSql == null) loadAllKeysStringSql = String.format("SELECT %s FROM %s", idColumnName, getTableName());
+      if (loadAllKeysStringSql == null) {
+         loadAllKeysStringSql = String.format("SELECT %s FROM %s", idColumnName, getTableName());
+      }
       return loadAllKeysStringSql;
    }
 
@@ -474,7 +488,9 @@
          } catch (Exception e) {
             log.debug("Unable to guess database type from JDBC metadata.", e);
          }
-         if (databaseType == null) log.info("Unable to detect database type using connection metadata.  Attempting to guess on driver name.");
+         if (databaseType == null) {
+            log.info("Unable to detect database type using connection metadata.  Attempting to guess on driver name.");
+         }
          try {
             String dbProduct = connectionFactory.getConnection().getMetaData().getDriverName();
             databaseType = guessDatabaseType(dbProduct);
@@ -482,10 +498,11 @@
             log.debug("Unable to guess database type from JDBC driver name.", e);
          }
 
-         if (databaseType == null)
+         if (databaseType == null) {
             throw new ConfigurationException("Unable to detect database type from JDBC driver name or connection metadata.  Please provide this manually using the 'databaseType' property in your configuration.  Supported database type strings are " + Arrays.toString(DatabaseType.values()));
-         else
+         } else {
             log.info("Guessing database type as '" + databaseType + "'.  If this is incorrect, please specify the correct type using the 'databaseType' property in your configuration.  Supported database type strings are " + Arrays.toString(DatabaseType.values()));
+         }
       }
       return databaseType;
    }
@@ -493,32 +510,33 @@
    private DatabaseType guessDatabaseType(String name) {
       DatabaseType type = null;
       if (name != null) {
-         if (name.toLowerCase().contains("mysql"))
+         if (name.toLowerCase().contains("mysql")) {
             type = DatabaseType.MYSQL;
-         else if (name.toLowerCase().contains("postgres"))
+         } else if (name.toLowerCase().contains("postgres")) {
             type = DatabaseType.POSTGRES;
-         else if (name.toLowerCase().contains("derby"))
+         } else if (name.toLowerCase().contains("derby")) {
             type = DatabaseType.DERBY;
-         else if (name.toLowerCase().contains("hsql") || name.toLowerCase().contains("hypersonic"))
+         } else if (name.toLowerCase().contains("hsql") || name.toLowerCase().contains("hypersonic")) {
             type = DatabaseType.HSQL;
-         else if (name.toLowerCase().contains("h2"))
+         } else if (name.toLowerCase().contains("h2")) {
             type = DatabaseType.H2;
-         else if (name.toLowerCase().contains("sqlite"))
+         } else if (name.toLowerCase().contains("sqlite")) {
             type = DatabaseType.SQLITE;
-         else if (name.toLowerCase().contains("db2"))
+         } else if (name.toLowerCase().contains("db2")) {
             type = DatabaseType.DB2;
-         else if (name.toLowerCase().contains("informix"))
+         } else if (name.toLowerCase().contains("informix")) {
             type = DatabaseType.INFORMIX;
-         else if (name.toLowerCase().contains("interbase"))
+         } else if (name.toLowerCase().contains("interbase")) {
             type = DatabaseType.INTERBASE;
-         else if (name.toLowerCase().contains("firebird"))
+         } else if (name.toLowerCase().contains("firebird")) {
             type = DatabaseType.FIREBIRD;
-         else if (name.toLowerCase().contains("sqlserver") || name.toLowerCase().contains("microsoft"))
+         } else if (name.toLowerCase().contains("sqlserver") || name.toLowerCase().contains("microsoft")) {
             type = DatabaseType.SQL_SERVER;
-         else if (name.toLowerCase().contains("access"))
+         } else if (name.toLowerCase().contains("access")) {
             type = DatabaseType.ACCESS;
-         else if (name.toLowerCase().contains("oracle"))
+         } else if (name.toLowerCase().contains("oracle")) {
             type = DatabaseType.ORACLE;
+         }
       }
       return type;
    }



More information about the infinispan-commits mailing list