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/08 00:47:34 UTC

svn commit: r375781 - in /db/ddlutils/trunk/src: java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java test/jdbc.properties.sqlserver2000

Author: tomdz
Date: Tue Feb  7 15:47:34 2006
New Revision: 375781

URL: http://svn.apache.org/viewcvs?rev=375781&view=rev
Log:
Fixed/enhanced support for Sql Server
Added support for the new Sql Server 2005 jdbc driver

Added:
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java
    db/ddlutils/trunk/src/test/jdbc.properties.sqlserver2000

Added: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java?rev=375781&view=auto
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java (added)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlModelReader.java Tue Feb  7 15:47:34 2006
@@ -0,0 +1,153 @@
+package org.apache.ddlutils.platform.mssql;
+
+/*
+ * 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.Date;
+import java.sql.SQLException;
+import java.sql.Time;
+import java.sql.Timestamp;
+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 Microsoft Sql Server database.
+ *
+ * @author Thomas Dudziak
+ * @version $Revision: $
+ */
+public class MSSqlModelReader extends JdbcModelReader
+{
+	/** The regular expression pattern for the ISO dates. */
+	private Pattern _isoDatePattern;
+	/** The regular expression pattern for the ISO times. */
+	private Pattern _isoTimePattern;
+
+	/**
+     * Creates a new model reader for Microsoft Sql Server databases.
+     * 
+     * @param platformInfo The platform specific settings
+     */
+    public MSSqlModelReader(PlatformInfo platformInfo)
+    {
+        super(platformInfo);
+        setDefaultCatalogPattern(null);
+        setDefaultSchemaPattern(null);
+        setDefaultTablePattern("%");
+
+        PatternCompiler compiler = new Perl5Compiler();
+
+    	try
+    	{
+            _isoDatePattern = compiler.compile("'(\\d{4}\\-\\d{2}\\-\\d{2})'");
+            _isoTimePattern = compiler.compile("'(\\d{2}:\\d{2}:\\d{2})'");
+        }
+    	catch (MalformedPatternException ex)
+        {
+        	throw new DdlUtilsException(ex);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+	protected boolean isInternalPrimaryKeyIndex(Table table, Index index)
+	{
+		// Sql Server generates an index "[pk name in uppercase]__[table name]__[hex number]"
+		// TODO: test with multiple pks
+		StringBuilder pkIndexName = new StringBuilder();
+		Column[]      pks         = table.getPrimaryKeyColumns();
+
+		if (pks.length > 0)
+		{
+			for (int idx = 0; idx < pks.length; idx++)
+			{
+				pkIndexName.append(pks[idx].getName());
+			}
+			pkIndexName.append("__");
+			pkIndexName.append(table.getName());
+			pkIndexName.append("__");
+
+			return index.getName().toUpperCase().startsWith(pkIndexName.toString().toUpperCase());
+		}
+		else
+		{
+			return false;
+		}
+	}
+
+    /**
+     * {@inheritDoc}
+     */
+	protected Column readColumn(DatabaseMetaDataWrapper metaData, Map values) throws SQLException
+	{
+		Column column       = super.readColumn(metaData, values);
+		String defaultValue = column.getDefaultValue();
+
+		// Sql Server tends to surround the returned default value with one or two sets of parentheses
+		if (defaultValue != null)
+		{
+			while (defaultValue.startsWith("(") && defaultValue.endsWith(")"))
+			{
+				defaultValue = defaultValue.substring(1, defaultValue.length() - 1);
+			}
+
+			if (column.getTypeCode() == Types.TIMESTAMP)
+			{
+				// Sql Server maintains the default values for DATE/TIME jdbc types, so we have to
+				// migrate the default value to TIMESTAMP
+				PatternMatcher matcher   = new Perl5Matcher();
+				Timestamp      timestamp = null;
+	
+				if (matcher.matches(defaultValue, _isoDatePattern))
+				{
+					timestamp = new Timestamp(Date.valueOf(matcher.getMatch().group(1)).getTime());
+				}
+				else if (matcher.matches(defaultValue, _isoTimePattern))
+				{
+					timestamp = new Timestamp(Time.valueOf(matcher.getMatch().group(1)).getTime());
+				}
+				if (timestamp != null)
+				{
+					defaultValue = timestamp.toString();
+				}
+			}
+			column.setDefaultValue(defaultValue);
+		}
+		if ((column.getTypeCode() == Types.DECIMAL) && (column.getSizeAsInt() == 19) && (column.getScale() == 0))
+		{
+			column.setTypeCode(Types.BIGINT);
+		}
+
+		return column;
+	}
+
+
+}

Added: db/ddlutils/trunk/src/test/jdbc.properties.sqlserver2000
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/test/jdbc.properties.sqlserver2000?rev=375781&view=auto
==============================================================================
--- db/ddlutils/trunk/src/test/jdbc.properties.sqlserver2000 (added)
+++ db/ddlutils/trunk/src/test/jdbc.properties.sqlserver2000 Tue Feb  7 15:47:34 2006
@@ -0,0 +1,25 @@
+# JDBC properties for Microsoft Sql Server 2000
+
+# Use this property if ddlutils does not recognize the platform from the settings
+#ddlutils.platform=MsSql
+
+# 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
+
+# This is the Sql Server 2005 driver which is recommended for Sql Server 2000 too
+# Note that this new driver supports the new shorter subprotocol
+datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
+datasource.url=jdbc:sqlserver://localhost;databaseName=ddlutils;selectMethod=cursor
+
+# This is the older Sql Server 2000 driver
+#datasource.driverClassName=com.microsoft.jdbc.sqlserver.SQLServerDriver
+#datasource.url=jdbc:microsoft:sqlserver://localhost;databaseName=ddlutils;selectMethod=cursor
+
+datasource.username=ddlutils
+datasource.password=ddlutils
+
+# Sql Server supports both catalogs and schemas, so we should define them both
+ddlutils.catalog=ddlutils
+ddlutils.schema=ddlutils