[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