You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by wi...@apache.org on 2007/06/30 04:33:36 UTC
svn commit: r552078 - in
/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc:
meta/strats/ColumnVersionStrategy.java schema/Column.java
sql/DB2Dictionary.java sql/DBDictionary.java
Author: wisneskid
Date: Fri Jun 29 19:33:35 2007
New Revision: 552078
URL: http://svn.apache.org/viewvc?view=rev&rev=552078
Log:
OPENJPA-271, add DB2 JDBC driver 2 support
- datePrecision set to MICRO, (Timesptamp in micro-second in DB2)
- save version strategy in Column (needed for specialized TimestampVersionStrategy)
- set storeCharsAsNumbers to false (DB2 default - store chars as chars)
Modified:
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/Column.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java?view=diff&rev=552078&r1=552077&r2=552078
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java Fri Jun 29 19:33:35 2007
@@ -101,6 +101,7 @@
tmplate.setName("versn");
Column[] cols = info.getColumns(vers, new Column[]{ tmplate }, adapt);
+ cols[0].setVersionStrategy(this);
vers.setColumns(cols);
vers.setColumnIO(info.getColumnIO());
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/Column.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/Column.java?view=diff&rev=552078&r1=552077&r2=552078
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/Column.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/Column.java Fri Jun 29 19:33:35 2007
@@ -28,6 +28,7 @@
import org.apache.commons.lang.StringUtils;
import org.apache.openjpa.jdbc.meta.JavaSQLTypes;
+import org.apache.openjpa.jdbc.meta.VersionStrategy;
import org.apache.openjpa.meta.JavaTypes;
import serp.util.Numbers;
@@ -70,7 +71,8 @@
private int _index = 0;
private boolean _pk = false;
-
+ private VersionStrategy _versionStrategy = null;
+
/**
* Default constructor.
*/
@@ -714,5 +716,13 @@
*/
public boolean isXML() {
return _typeName != null && _typeName.startsWith("XML");
+ }
+
+ public VersionStrategy getVersionStrategy() {
+ return _versionStrategy;
+ }
+
+ public void setVersionStrategy(VersionStrategy strategy) {
+ this._versionStrategy = strategy;
}
}
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java?view=diff&rev=552078&r1=552077&r2=552078
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java Fri Jun 29 19:33:35 2007
@@ -26,22 +26,26 @@
import java.util.StringTokenizer;
import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
import org.apache.openjpa.jdbc.schema.Sequence;
+import org.apache.openjpa.lib.util.Localizer;
import org.apache.openjpa.util.OpenJPAException;
+import org.apache.openjpa.util.UnsupportedException;
/**
* Dictionary for IBM DB2 database.
*/
public class DB2Dictionary
extends AbstractDB2Dictionary {
+ private static final Localizer _loc = Localizer.forPackage
+ (DB2Dictionary.class);
public String optimizeClause = "optimize for";
public String rowClause = "row";
- private int db2ServerType = 0;
- private static final int db2ISeriesV5R3OrEarlier = 1;
- private static final int db2UDBV81OrEarlier = 2;
- private static final int db2ZOSV8xOrLater = 3;
- private static final int db2UDBV82OrLater = 4;
- private static final int db2ISeriesV5R4OrLater = 5;
+ protected int db2ServerType = 0;
+ protected static final int db2ISeriesV5R3OrEarlier = 1;
+ protected static final int db2UDBV81OrEarlier = 2;
+ protected static final int db2ZOSV8xOrLater = 3;
+ protected static final int db2UDBV82OrLater = 4;
+ protected static final int db2ISeriesV5R4OrLater = 5;
private static final String forUpdateOfClause = "FOR UPDATE OF";
private static final String withRSClause = "WITH RS";
private static final String withRRClause = "WITH RR";
@@ -50,6 +54,10 @@
private static final String useKeepExclusiveLockClause
= "USE AND KEEP EXCLUSIVE LOCKS";
private static final String forReadOnlyClause = "FOR READ ONLY";
+ protected String databaseProductName = null;
+ protected String databaseProductVersion = null;
+ protected int maj = 0;
+ protected int min = 0;
public DB2Dictionary() {
platform = "DB2";
@@ -70,6 +78,8 @@
varbinaryTypeName = "BLOB(1M)";
clobTypeName = "CLOB(1M)";
longVarcharTypeName = "LONG VARCHAR";
+ datePrecision = MICRO;
+ storeCharsAsNumbers = false;
fixedSizeTypeNameSet.addAll(Arrays.asList(new String[]{
"LONG VARCHAR FOR BIT DATA", "LONG VARCHAR", "LONG VARGRAPHIC",
@@ -186,48 +196,78 @@
super.connectedConfiguration(conn);
DatabaseMetaData metaData = conn.getMetaData();
- if (isJDBC3(metaData)) {
- int maj = metaData.getDatabaseMajorVersion();
- int min = metaData.getDatabaseMinorVersion();
-
- // Determine the type of DB2 database
- if (isDB2ISeriesV5R3OrEarlier(metaData))
- db2ServerType = db2ISeriesV5R3OrEarlier;
- else if (isDB2UDBV81OrEarlier(metaData,maj,min))
- db2ServerType = db2UDBV81OrEarlier;
- else if (isDB2ZOSV8xOrLater(metaData,maj))
- db2ServerType = db2ZOSV8xOrLater;
- else if (isDB2UDBV82OrLater(metaData,maj,min))
- db2ServerType = db2UDBV82OrLater;
- else if (isDB2ISeriesV5R4OrLater(metaData))
- db2ServerType = db2ISeriesV5R4OrLater;
-
- if (maj >= 9 || (maj == 8 && min >= 2)) {
- supportsLockingWithMultipleTables = true;
- supportsLockingWithInnerJoin = true;
- supportsLockingWithOuterJoin = true;
- forUpdateClause = "WITH RR USE AND KEEP UPDATE LOCKS";
- if (maj >=9)
- supportsXMLColumn = true;
- }
-
- if (metaData.getDatabaseProductVersion().indexOf("DSN") != -1) {
- // DB2 Z/OS
- characterColumnSize = 255;
- lastGeneratedKeyQuery = "SELECT IDENTITY_VAL_LOCAL() FROM "
- + "SYSIBM.SYSDUMMY1";
- nextSequenceQuery = "SELECT NEXTVAL FOR {0} FROM "
- + "SYSIBM.SYSDUMMY1";
- sequenceSQL = "SELECT SCHEMA AS SEQUENCE_SCHEMA, "
- + "NAME AS SEQUENCE_NAME FROM SYSIBM.SYSSEQUENCES";
- sequenceSchemaSQL = "SCHEMA = ?";
- sequenceNameSQL = "NAME = ?";
- if (maj == 8) {
- // DB2 Z/OS Version 8: no bigint support, hence map Java
- // long to decimal
- bigintTypeName = "DECIMAL(31,0)";
- }
- }
+ databaseProductName = metaData.getDatabaseProductName();
+ databaseProductVersion = metaData.getDatabaseProductVersion();
+
+ // Determine the type of DB2 database
+ // First check for AS/400
+ getProductVersionMajorMinorForISeries();
+
+ if (maj > 0) {
+ if (isDB2ISeriesV5R3OrEarlier())
+ db2ServerType = db2ISeriesV5R3OrEarlier;
+ else if (isDB2ISeriesV5R4OrLater())
+ db2ServerType = db2ISeriesV5R4OrLater;
+ }
+
+ if (db2ServerType == 0) {
+ if (isJDBC3(metaData)) {
+ maj = metaData.getDatabaseMajorVersion();
+ min = metaData.getDatabaseMinorVersion();
+ }
+ else
+ getProductVersionMajorMinor();
+
+ // Determine the type of DB2 database for ZOS & UDB
+ if (isDB2UDBV81OrEarlier())
+ db2ServerType = db2UDBV81OrEarlier;
+ else if (isDB2ZOSV8xOrLater())
+ db2ServerType = db2ZOSV8xOrLater;
+ else if (isDB2UDBV82OrLater())
+ db2ServerType = db2UDBV82OrLater;
+ }
+
+ // verify that databae product is supported
+ if (db2ServerType == 0 || maj == 0)
+ throw new UnsupportedException(_loc.get("db-not-supported",
+ new Object[] {databaseProductName, databaseProductVersion }));
+
+ if (maj >= 9 || (maj == 8 && min >= 2)) {
+ supportsLockingWithMultipleTables = true;
+ supportsLockingWithInnerJoin = true;
+ supportsLockingWithOuterJoin = true;
+ forUpdateClause = "WITH RR USE AND KEEP UPDATE LOCKS";
+ if (maj >=9)
+ supportsXMLColumn = true;
+ }
+
+ // platform specific settings
+ switch (db2ServerType) {
+ case db2ZOSV8xOrLater:
+ // DB2 Z/OS
+ characterColumnSize = 255;
+ lastGeneratedKeyQuery = "SELECT IDENTITY_VAL_LOCAL() FROM "
+ + "SYSIBM.SYSDUMMY1";
+ nextSequenceQuery = "SELECT NEXTVAL FOR {0} FROM "
+ + "SYSIBM.SYSDUMMY1";
+ sequenceSQL = "SELECT SCHEMA AS SEQUENCE_SCHEMA, "
+ + "NAME AS SEQUENCE_NAME FROM SYSIBM.SYSSEQUENCES";
+ sequenceSchemaSQL = "SCHEMA = ?";
+ sequenceNameSQL = "NAME = ?";
+ if (maj == 8)
+ // DB2 Z/OS Version 8: no bigint support, hence map Java
+ // long to decimal
+ bigintTypeName = "DECIMAL(31,0)";
+ break;
+ case db2ISeriesV5R3OrEarlier:
+ case db2ISeriesV5R4OrLater:
+ validationSQL = "SELECT DISTINCT(CURRENT TIMESTAMP) FROM "
+ + "QSYS2.SYSTABLES";
+ sequenceSQL = "SELECT SEQUENCE_SCHEMA, "
+ + "SEQUENCE_NAME FROM QSYS2.SYSSEQUENCES";
+ sequenceSchemaSQL = "SEQUENCE_SCHEMA = ?";
+ sequenceNameSQL = "SEQUENCE_NAME = ?";
+ break;
}
}
@@ -291,68 +331,101 @@
return forUpdateString.toString();
}
- public boolean isDB2UDBV82OrLater(DatabaseMetaData metadata, int maj,
- int min) throws SQLException {
+ public boolean isDB2UDBV82OrLater() throws SQLException {
boolean match = false;
- if (metadata.getDatabaseProductVersion().indexOf("SQL") != -1
+ if ((databaseProductVersion.indexOf("SQL") != -1
+ || databaseProductName.indexOf("DB2/") != -1)
&& ((maj == 8 && min >= 2) ||(maj >= 8)))
match = true;
return match;
}
- public boolean isDB2ZOSV8xOrLater(DatabaseMetaData metadata, int maj)
+ public boolean isDB2ZOSV8xOrLater()
throws SQLException {
boolean match = false;
- if (metadata.getDatabaseProductVersion().indexOf("DSN") != -1
+ if ((databaseProductVersion.indexOf("DSN") != -1
+ || databaseProductName.indexOf("DB2/") == -1)
&& maj >= 8)
match = true;
return match;
}
- public boolean isDB2ISeriesV5R3OrEarlier(DatabaseMetaData metadata)
+ public boolean isDB2ISeriesV5R3OrEarlier()
throws SQLException {
boolean match = false;
- if (metadata.getDatabaseProductVersion().indexOf("AS") != -1
- && generateVersionNumber(metadata.getDatabaseProductVersion())
- <= 530)
+ if (databaseProductName.indexOf("AS") != -1
+ && maj == 5 && min <=3)
match = true;
return match;
}
- public boolean isDB2ISeriesV5R4OrLater(DatabaseMetaData metadata)
+ public boolean isDB2ISeriesV5R4OrLater()
throws SQLException {
boolean match = false;
- if (metadata.getDatabaseProductVersion().indexOf("AS") != -1
- && generateVersionNumber(metadata.getDatabaseProductVersion())
- >= 540)
+ if (databaseProductName.indexOf("AS") != -1
+ && maj >= 5 && min >=4)
match = true;
return match;
}
- public boolean isDB2UDBV81OrEarlier(DatabaseMetaData metadata, int maj,
- int min) throws SQLException {
+ public boolean isDB2UDBV81OrEarlier() throws SQLException {
boolean match = false;
- if (metadata.getDatabaseProductVersion().indexOf("SQL") != -1 &&
+ if ((databaseProductVersion.indexOf("SQL") != -1
+ || databaseProductName.indexOf("DB2/") != -1) &&
((maj == 8 && min <= 1)|| maj < 8))
match = true;
return match;
}
- /** Get the version number for the ISeries
+ /** Get the version Major/Minor for the ISeries
*/
- protected int generateVersionNumber(String versionString) {
- String s = versionString.substring(versionString.indexOf('V'));
- s = s.toUpperCase();
- int i = -1;
- StringTokenizer stringtokenizer = new StringTokenizer(s, "VRM", false);
- if (stringtokenizer.countTokens() == 3)
- {
- String s1 = stringtokenizer.nextToken();
- s1 = s1 + stringtokenizer.nextToken();
- s1 = s1 + stringtokenizer.nextToken();
- i = Integer.parseInt(s1);
+ private void getProductVersionMajorMinorForISeries() {
+ // ISeries DBProdName DB2 UDB for AS/400
+ // (Toolbox)DBProdVersion 05.04.0000 V5R4m0
+ // ISeries DB2 UDB for AS/400
+ // (Native) V5R4M0
+ if (databaseProductName.indexOf("AS") != -1) {
+ String s = databaseProductVersion.substring(databaseProductVersion
+ .indexOf('V'));
+ s = s.toUpperCase();
+
+ StringTokenizer stringtokenizer = new StringTokenizer(s, "VRM"
+ , false);
+ if (stringtokenizer.countTokens() == 3) {
+ String s1 = stringtokenizer.nextToken();
+ maj = Integer.parseInt(s1);
+ String s2 = stringtokenizer.nextToken();
+ min = Integer.parseInt(s2);
+ }
+ }
+ }
+
+ private void getProductVersionMajorMinor() {
+ // Incase JDBC driver version is lower than 3
+ // use following info to determine Major and Minor
+ // CLI vs JCC
+ // ZDBV8 DBProdName DB2 DB2
+ // DBProdVersion 08.01.0005 DSN08015
+ // ZDBV9 DB2 DB2
+ // 09.01.0005 DSN09015
+ // WinV9 DB2/NT DB2/NT
+ // 09.01.0000 SQL09010
+ // SolarisV9 DB2/SUN64
+ // SQL0901
+ // Linux DB2/LINUX DB2/LINUX
+ // 09.01.0000 SQL0901
+ if (databaseProductVersion.indexOf("09") != -1) {
+ maj = 9;
+ if (databaseProductVersion.indexOf("01") != -1) {
+ min = 1;
+ }
+ } else if (databaseProductVersion.indexOf("08") != -1) {
+ maj = 8;
+ min = 2;
+ if (databaseProductVersion.indexOf("01") != -1) {
+ min = 1;
+ }
}
- return i;
}
public SQLBuffer toSelect(Select sel, boolean forUpdate,
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java?view=diff&rev=552078&r1=552077&r2=552078
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java Fri Jun 29 19:33:35 2007
@@ -889,6 +889,8 @@
setDate(stmnt, idx, new java.sql.Date(val.getTime()), null, col);
else if (col != null && col.getType() == Types.TIME)
setTime(stmnt, idx, new Time(val.getTime()), null, col);
+ else if (val instanceof Timestamp)
+ setTimestamp(stmnt, idx,(Timestamp)val, null, col);
else
setTimestamp(stmnt, idx, new Timestamp(val.getTime()), null, col);
}