You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ddlutils-dev@db.apache.org by to...@apache.org on 2006/02/06 00:08:20 UTC
svn commit: r375128 - in /db/ddlutils/trunk/src:
java/org/apache/ddlutils/platform/db2/Db2Builder.java
java/org/apache/ddlutils/platform/db2/Db2ModelReader.java
java/org/apache/ddlutils/platform/db2/Db2Platform.java
test/jdbc.properties.db2
Author: tomdz
Date: Sun Feb 5 15:08:18 2006
New Revision: 375128
URL: http://svn.apache.org/viewcvs?rev=375128&view=rev
Log:
Fixed and enhanced Db2 platform
Added:
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2ModelReader.java
db/ddlutils/trunk/src/test/jdbc.properties.db2
Modified:
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2Builder.java
db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2Platform.java
Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2Builder.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2Builder.java?rev=375128&r1=375127&r2=375128&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2Builder.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2Builder.java Sun Feb 5 15:08:18 2006
@@ -17,11 +17,13 @@
*/
import java.io.IOException;
+import java.sql.Types;
import org.apache.ddlutils.PlatformInfo;
import org.apache.ddlutils.model.Column;
import org.apache.ddlutils.model.Table;
import org.apache.ddlutils.platform.SqlBuilder;
+import org.apache.ddlutils.util.Jdbc3Utils;
/**
* The SQL Builder for DB2.
@@ -41,7 +43,24 @@
{
super(info);
}
-
+
+
+ /**
+ * {@inheritDoc}
+ */
+ protected String getNativeDefaultValue(Column column)
+ {
+ if ((column.getTypeCode() == Types.BIT) ||
+ (Jdbc3Utils.supportsJava14JdbcTypes() && (column.getTypeCode() == Jdbc3Utils.determineBooleanTypeCode())))
+ {
+ return getDefaultValueHelper().convert(column.getDefaultValue(), column.getTypeCode(), Types.SMALLINT).toString();
+ }
+ else
+ {
+ return super.getNativeDefaultValue(column);
+ }
+ }
+
/**
* {@inheritDoc}
*/
Added: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2ModelReader.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2ModelReader.java?rev=375128&view=auto
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2ModelReader.java (added)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2ModelReader.java Sun Feb 5 15:08:18 2006
@@ -0,0 +1,184 @@
+package org.apache.ddlutils.platform.db2;
+
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Map;
+
+import org.apache.ddlutils.DdlUtilsException;
+import org.apache.ddlutils.PlatformInfo;
+import org.apache.ddlutils.model.Column;
+import org.apache.ddlutils.model.Index;
+import org.apache.ddlutils.model.Table;
+import org.apache.ddlutils.platform.DatabaseMetaDataWrapper;
+import org.apache.ddlutils.platform.JdbcModelReader;
+import org.apache.oro.text.regex.MalformedPatternException;
+import org.apache.oro.text.regex.Pattern;
+import org.apache.oro.text.regex.PatternCompiler;
+import org.apache.oro.text.regex.PatternMatcher;
+import org.apache.oro.text.regex.Perl5Compiler;
+import org.apache.oro.text.regex.Perl5Matcher;
+
+/**
+ * Reads a database model from a Db2 UDB database.
+ *
+ * @author Thomas Dudziak
+ * @version $Revision: $
+ */
+public class Db2ModelReader extends JdbcModelReader
+{
+ /** Known system tables that Db2 creates (e.g. automatic maintenance). */
+ private static final String[] KNOWN_SYSTEM_TABLES = { "STMG_DBSIZE_INFO", "HMON_ATM_INFO", "HMON_COLLECTION", "POLICY" };
+ /** The regular expression pattern for the time values that Db2 returns. */
+ private Pattern _db2TimePattern;
+ /** The regular expression pattern for the timestamp values that Db2 returns. */
+ private Pattern _db2TimestampPattern;
+
+ /**
+ * Creates a new model reader for Db2 databases.
+ *
+ * @param platformInfo The platform specific settings
+ */
+ public Db2ModelReader(PlatformInfo platformInfo)
+ {
+ super(platformInfo);
+ setDefaultCatalogPattern(null);
+ setDefaultSchemaPattern(null);
+
+ PatternCompiler compiler = new Perl5Compiler();
+
+ try
+ {
+ _db2TimePattern = compiler.compile("'(\\d{2}).(\\d{2}).(\\d{2})'");
+ _db2TimestampPattern = compiler.compile("'(\\d{4}\\-\\d{2}\\-\\d{2})\\-(\\d{2}).(\\d{2}).(\\d{2})(\\.\\d{1,8})?'");
+ }
+ catch (MalformedPatternException ex)
+ {
+ throw new DdlUtilsException(ex);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected Table readTable(DatabaseMetaDataWrapper metaData, Map values) throws SQLException
+ {
+ String tableName = (String)values.get("TABLE_NAME");
+
+ for (int idx = 0; idx < KNOWN_SYSTEM_TABLES.length; idx++)
+ {
+ if (KNOWN_SYSTEM_TABLES[idx].equals(tableName))
+ {
+ return null;
+ }
+ }
+
+ Table table = super.readTable(metaData, values);
+
+ // Db2 does not return the auto-increment status via the database metadata
+ determineAutoIncrementFromResultSetMetaData(table, table.getColumns());
+ return table;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected Column readColumn(DatabaseMetaDataWrapper metaData, Map values) throws SQLException
+ {
+ Column column = super.readColumn(metaData, values);
+
+ if (column.getDefaultValue() != null)
+ {
+ if (column.getTypeCode() == Types.TIME)
+ {
+ PatternMatcher matcher = new Perl5Matcher();
+
+ // Db2 returns "HH24.MI.SS"
+ if (matcher.matches(column.getDefaultValue(), _db2TimePattern))
+ {
+ StringBuffer newDefault = new StringBuffer();
+
+ newDefault.append("'");
+ // the hour
+ newDefault.append(matcher.getMatch().group(1));
+ newDefault.append(":");
+ // the minute
+ newDefault.append(matcher.getMatch().group(2));
+ newDefault.append(":");
+ // the second
+ newDefault.append(matcher.getMatch().group(3));
+ newDefault.append("'");
+
+ column.setDefaultValue(newDefault.toString());
+ }
+ }
+ else if (column.getTypeCode() == Types.TIMESTAMP)
+ {
+ PatternMatcher matcher = new Perl5Matcher();
+
+ // Db2 returns "YYYY-MM-DD-HH24.MI.SS.FF"
+ if (matcher.matches(column.getDefaultValue(), _db2TimestampPattern))
+ {
+ StringBuffer newDefault = new StringBuffer();
+
+ newDefault.append("'");
+ // group 1 is the date which has the correct format
+ newDefault.append(matcher.getMatch().group(1));
+ newDefault.append(" ");
+ // the hour
+ newDefault.append(matcher.getMatch().group(2));
+ newDefault.append(":");
+ // the minute
+ newDefault.append(matcher.getMatch().group(3));
+ newDefault.append(":");
+ // the second
+ newDefault.append(matcher.getMatch().group(4));
+ // optionally, the fraction
+ if ((matcher.getMatch().groups() > 4) && (matcher.getMatch().group(4) != null))
+ {
+ newDefault.append(matcher.getMatch().group(5));
+ }
+ newDefault.append("'");
+
+ column.setDefaultValue(newDefault.toString());
+ }
+ }
+ }
+ return column;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected boolean isInternalPrimaryKeyIndex(Table table, Index index)
+ {
+ if (index.getName().startsWith("SQL"))
+ {
+ // Db2 uses the form "SQL060205225246220"
+ try
+ {
+ Long.parseLong(index.getName().substring(3));
+ return true;
+ }
+ catch (NumberFormatException ex)
+ {}
+
+ }
+ return false;
+ }
+}
Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2Platform.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2Platform.java?rev=375128&r1=375127&r2=375128&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2Platform.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/db2/Db2Platform.java Sun Feb 5 15:08:18 2006
@@ -57,24 +57,28 @@
info.setForeignKeysEmbedded(false);
info.setIndicesEmbedded(false);
// the BINARY types are also handled by Db2Builder.getSqlType(Column)
- info.addNativeTypeMapping(Types.ARRAY, "BLOB");
+ info.addNativeTypeMapping(Types.ARRAY, "BLOB", Types.BLOB);
info.addNativeTypeMapping(Types.BINARY, "CHAR {0} FOR BIT DATA");
- info.addNativeTypeMapping(Types.BIT, "SMALLINT");
- info.addNativeTypeMapping(Types.FLOAT, "REAL");
- info.addNativeTypeMapping(Types.JAVA_OBJECT, "BLOB");
+ info.addNativeTypeMapping(Types.BIT, "SMALLINT", Types.SMALLINT);
+ info.addNativeTypeMapping(Types.FLOAT, "DOUBLE", Types.DOUBLE);
+ info.addNativeTypeMapping(Types.JAVA_OBJECT, "BLOB", Types.BLOB);
info.addNativeTypeMapping(Types.LONGVARBINARY, "LONG VARCHAR FOR BIT DATA");
info.addNativeTypeMapping(Types.LONGVARCHAR, "LONG VARCHAR");
info.addNativeTypeMapping(Types.NULL, "LONG VARCHAR FOR BIT DATA");
- info.addNativeTypeMapping(Types.OTHER, "BLOB");
- info.addNativeTypeMapping(Types.STRUCT, "BLOB");
- info.addNativeTypeMapping(Types.TINYINT, "SMALLINT");
+ info.addNativeTypeMapping(Types.NUMERIC, "DECIMAL", Types.DECIMAL);
+ info.addNativeTypeMapping(Types.OTHER, "BLOB", Types.BLOB);
+ info.addNativeTypeMapping(Types.STRUCT, "BLOB", Types.BLOB);
+ info.addNativeTypeMapping(Types.TINYINT, "SMALLINT", Types.SMALLINT);
info.addNativeTypeMapping(Types.VARBINARY, "VARCHAR {0} FOR BIT DATA");
- info.addNativeTypeMapping("BOOLEAN", "SMALLINT");
+ info.addNativeTypeMapping("BOOLEAN", "SMALLINT", "SMALLINT");
+ info.addDefaultSize(Types.CHAR, 254);
+ info.addDefaultSize(Types.VARCHAR, 254);
info.addDefaultSize(Types.BINARY, 254);
info.addDefaultSize(Types.VARBINARY, 254);
setSqlBuilder(new Db2Builder(info));
+ setModelReader(new Db2ModelReader(info));
}
/**
Added: db/ddlutils/trunk/src/test/jdbc.properties.db2
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/test/jdbc.properties.db2?rev=375128&view=auto
==============================================================================
--- db/ddlutils/trunk/src/test/jdbc.properties.db2 (added)
+++ db/ddlutils/trunk/src/test/jdbc.properties.db2 Sun Feb 5 15:08:18 2006
@@ -0,0 +1,14 @@
+# JDBC properties for Db2 UDB
+
+# Use this property if ddlutils does not recognize the platform from the settings
+#ddlutils.platform=Db2
+
+# Properties starting with "datasource." will be fed into the datasource instance of the
+# class configured via the datasource.class property
+
+datasource.class=org.apache.commons.dbcp.BasicDataSource
+
+datasource.driverClassName=COM.ibm.db2.jdbc.net.DB2Driver
+datasource.url=jdbc:db2://localhost:6789/ddlutils
+datasource.username=ddlutils
+datasource.password=ddlutils