Hello all,

we've been using Torque for a while to generate SQL based on our OJB
repository.  We've had to tweak a few things to get them to work though,
and we thought we should contribute them back.

1.  When generating DECIMAL columns, we needed to generate precision and
scale.

2.  When generating indexes, we needed (at least on Oracle) to be able to
specify the tablespace for the index.  It's a huge performance boost to
have the index located on a separate drive from the table.

3.  We use non-native auto incrementing heavily, and needed to be able to
turn it off.  Although Table has an Id Method, it wasn't being checked in
the velocity macros.  We needed to enable that.

4.  There were some weird end of file characters in some of the velocity
templates that caused SQL generation to die a horrible death under
Windows.

Attached is a patch that addresses all these issues.  Here's a short list
of the affected files:

src/generator/src/dtd/database.dtd
src/generator/src/java/org/apache/torque/engine/database/model/Column.java
src/generator/src/java/org/apache/torque/engine/database/model/Table.java
src/generator/src/templates/sql/base/mssql/columns.vm
src/generator/src/templates/sql/base/mssql/db.props
src/generator/src/templates/sql/base/oracle/columns.vm
src/generator/src/templates/sql/base/oracle/db.props
src/generator/src/templates/sql/base/oracle/index.vm
src/generator/src/templates/sql/base/oracle/primarykey.vm
src/generator/src/templates/sql/base/oracle/unique.vm
src/generator/src/templates/sql/base/postgresql/columns.vm
src/generator/src/templates/sql/base/postgresql/db.props
src/generator/src/templates/sql/base/postgresql/index.vm
src/generator/src/templates/sql/base/postgresql/table.vm

We've only modified Oracle, PostgreSQL, and MS SQL velocity macros because
those are the only databases we've been hitting.  As we add more, we'll be
glad to submit those changes back as well.

If you have any questions, I'd be glad to answer them.  We're eager to get
the changes into Torque so that we don't have to maintain a separate local
version.

Regards,

Chris Greenlee

Index: src/generator/src/dtd/database.dtd
===================================================================
RCS file: /home/cvspublic/db-torque/src/generator/src/dtd/database.dtd,v
retrieving revision 1.1
diff -u -r1.1 database.dtd
--- src/generator/src/dtd/database.dtd  10 Feb 2003 13:22:37 -0000      1.1
+++ src/generator/src/dtd/database.dtd  19 Mar 2003 02:26:07 -0000
@@ -66,6 +66,7 @@
   javaNamingMethod (nochange|underscore|javaname) #IMPLIED
   heavyIndexing (true|false) #IMPLIED
   description CDATA #IMPLIED
+  indexTablespace CDATA #IMPLIED
 >
 
 <!ELEMENT id-method-parameter EMPTY>
@@ -91,6 +92,8 @@
     ) "VARCHAR"
   javaType (object|primitive) #IMPLIED
   size CDATA #IMPLIED
+  precision CDATA #IMPLIED
+  scale CDATA #IMPLIED
   default CDATA #IMPLIED
   autoIncrement (true|false) "false"
   inheritance (single|false) "false"
Index: src/generator/src/java/org/apache/torque/engine/database/model/Column.java
===================================================================
RCS file: 
/home/cvspublic/db-torque/src/generator/src/java/org/apache/torque/engine/database/model/Column.java,v
retrieving revision 1.1
diff -u -r1.1 Column.java
--- src/generator/src/java/org/apache/torque/engine/database/model/Column.java  10 Feb 
2003 13:20:58 -0000      1.1
+++ src/generator/src/java/org/apache/torque/engine/database/model/Column.java  19 Mar 
2003 02:26:09 -0000
@@ -81,6 +81,9 @@
     private String javaNamingMethod;
     private boolean isNotNull = false;
     private String size;
+    private String precision;
+    private String scale;
+
     /** type as defined in schema.xml */
     private String torqueType;
     private String javaType;
@@ -198,6 +201,8 @@
         defaultValue = attrib.getValue("default");
 
         size = attrib.getValue("size");
+        precision = attrib.getValue("precision");
+        scale = attrib.getValue("scale");
 
         setType(attrib.getValue("type"));
 
@@ -638,6 +643,42 @@
     public void setSize(String newSize)
     {
         size = newSize;
+    }
+
+    /**
+     * Returns the precision for this column.
+     * @return The precision for this column.
+     */
+    public String getPrecision()
+    {
+        return precision;
+    }
+
+    /**
+     * Sets the precision for this column.
+     * @param precision The precision for this column.
+     */
+    public void setPrecision(String precision)
+    {
+        this.precision = precision;
+    }
+
+    /**
+     * Returns the scale for this column.
+     * @return The scale for this column.
+     */
+    public String getScale()
+    {
+        return scale;
+    }
+
+    /**
+     * Sets the scale for this column.
+     * @param scale The scale for this column.
+     */
+    public void setScale(String scale)
+    {
+        this.scale = scale;
     }
 
     /**
Index: src/generator/src/java/org/apache/torque/engine/database/model/Table.java
===================================================================
RCS file: 
/home/cvspublic/db-torque/src/generator/src/java/org/apache/torque/engine/database/model/Table.java,v
retrieving revision 1.1
diff -u -r1.1 Table.java
--- src/generator/src/java/org/apache/torque/engine/database/model/Table.java   10 Feb 
2003 13:20:58 -0000      1.1
+++ src/generator/src/java/org/apache/torque/engine/database/model/Table.java   19 Mar 
2003 02:26:11 -0000
@@ -89,6 +89,7 @@
     private String javaName;
     private String idMethod;
     private String javaNamingMethod;
+    private String indexTablespace;
     private Database tableParent;
     private List referrers;
     private List foreignTableNames;
@@ -144,6 +145,11 @@
         javaName = attrib.getValue("javaName");
         idMethod = attrib.getValue("idMethod");
 
+        String indexTablespace = attrib.getValue("indexTablespace");
+        if (indexTablespace != null && indexTablespace.trim().length() > 0) {
+            setIndexTablespace(indexTablespace.trim());
+        }
+
         // retrieves the method for converting from specified name to
         // a java name.
         javaNamingMethod = attrib.getValue("javaNamingMethod");
@@ -1029,6 +1035,22 @@
     public void setForReferenceOnly(boolean  v)
     {
         this.forReferenceOnly = v;
+    }
+
+    /**
+     * The name of the tablespace to create indexes on, if the database supports them.
+     * @return The name of the tablespace to create the index on.
+     */
+    public String getIndexTablespace() {
+        return indexTablespace;
+    }
+
+    /**
+     * Sets the name of the tablespace to create the index on.
+     * @param indexTablespace The name of the index tablespace.
+     */
+    public void setIndexTablespace(String indexTablespace) {
+        this.indexTablespace = indexTablespace;
     }
 
     /**
Index: src/generator/src/templates/sql/base/mssql/columns.vm
===================================================================
RCS file: 
/home/cvspublic/db-torque/src/generator/src/templates/sql/base/mssql/columns.vm,v
retrieving revision 1.1
diff -u -r1.1 columns.vm
--- src/generator/src/templates/sql/base/mssql/columns.vm       10 Feb 2003 13:18:49 
-0000      1.1
+++ src/generator/src/templates/sql/base/mssql/columns.vm       19 Mar 2003 02:26:11 
-0000
@@ -1,14 +1,23 @@
 #foreach ($col in $table.Columns)
     #set ( $type = $dbprops.get($col.Type) )
-    #if ($type == "INT" || $type == "TEXT")
+    #if ($type == "DECIMAL") 
+      #set ( $type = "$type ($col.precision,$col.scale)")
+    #end
+    #if ($type == "INT" || $type == "TEXT" || $type == "DECIMAL")
       #set ( $size = "" )
-    #else   
+    #else
       #set ( $size = $col.printSize() )
     #end
     #set ( $default = $col.DefaultSetting )
     #set ( $nullString = $strings.select($col.isNotNull(), 
$dbprops.get("NOTNULL"),$dbprops.get("NULL")) )
-    #set ( $autoIncrement = $strings.select($col.isAutoIncrement(), 
$dbprops.get("AUTOINCREMENT"),"") )
-    #set ( $entry = "$col.Name $type $size $default $nullString $autoIncrement," )
+    #if ($col.isAutoIncrement() && $table.IdMethod == "native")
+      #set ( $autoIncrement = $strings.select($col.isAutoIncrement(), 
$dbprops.get("AUTOINCREMENT"),"") )
+    #else
+      #set ( $autoIncrement = " " )
+    #end    
+    #set ( $entry = "$col.Name $type " )
+    #if ($type != "INT") #set ( $entry = "$entry $size" )#end
+    #set ( $entry = "$entry $default $nullString $autoIncrement," )
     $strings.sub($strings.collapseSpaces($entry)," ,",",")
 #end
 
Index: src/generator/src/templates/sql/base/mssql/db.props
===================================================================
RCS file: 
/home/cvspublic/db-torque/src/generator/src/templates/sql/base/mssql/db.props,v
retrieving revision 1.1
diff -u -r1.1 db.props
--- src/generator/src/templates/sql/base/mssql/db.props 10 Feb 2003 13:18:49 -0000     
 1.1
+++ src/generator/src/templates/sql/base/mssql/db.props 19 Mar 2003 02:26:11 -0000
@@ -2,19 +2,19 @@
 TINYINT = TINYINT
 SMALLINT = SMALLINT
 INTEGER = INT
-BIGINT = BIGINT
+BIGINT = INT
 FLOAT = FLOAT
 REAL = REAL
-DOUBLE = FLOAT
+DOUBLE = DECIMAL
 NUMERIC = NUMERIC
 DECIMAL = DECIMAL
-CHAR = CHAR
+CHAR = VARCHAR
 VARCHAR = VARCHAR
 LONGVARCHAR = TEXT
 DATE = DATETIME
 TIME = DATETIME
 TIMESTAMP = DATETIME
-BINARY = BINARY(7132)
+BINARY = BINARY
 VARBINARY = IMAGE
 LONGVARBINARY = IMAGE
 NULL = NULL
@@ -31,5 +31,5 @@
 NOTNULL = NOT NULL
 
 removeNotNullWithAutoIncrement = false
+
 suppressDefaults = false
-maxColumnNameLength = 30
Index: src/generator/src/templates/sql/base/oracle/columns.vm
===================================================================
RCS file: 
/home/cvspublic/db-torque/src/generator/src/templates/sql/base/oracle/columns.vm,v
retrieving revision 1.1
diff -u -r1.1 columns.vm
--- src/generator/src/templates/sql/base/oracle/columns.vm      10 Feb 2003 13:18:47 
-0000      1.1
+++ src/generator/src/templates/sql/base/oracle/columns.vm      19 Mar 2003 02:26:11 
-0000
@@ -1,5 +1,6 @@
 #foreach ($col in $table.Columns)
     #set ( $type = $dbprops.get($col.Type) )
+    #if ($type == "DECIMAL") #set ( $type = "$type ($col.precision,$col.scale)")#end
     #set ( $size = $col.printSize() )
     #set ( $default = $col.DefaultSetting )
     #set ( $nullString = $strings.select($col.isNotNull(), 
$dbprops.get("NOTNULL"),"") )
Index: src/generator/src/templates/sql/base/oracle/db.props
===================================================================
RCS file: 
/home/cvspublic/db-torque/src/generator/src/templates/sql/base/oracle/db.props,v
retrieving revision 1.2
diff -u -r1.2 db.props
--- src/generator/src/templates/sql/base/oracle/db.props        23 Feb 2003 20:09:26 
-0000      1.2
+++ src/generator/src/templates/sql/base/oracle/db.props        19 Mar 2003 02:26:11 
-0000
@@ -12,9 +12,9 @@
 BIGINT = NUMBER (20, 0)
 FLOAT = FLOAT
 REAL = NUMBER
-DOUBLE = FLOAT
+DOUBLE = DECIMAL
 NUMERIC = NUMBER
-DECIMAL = NUMBER
+DECIMAL = DECIMAL
 CHAR = CHAR
 VARCHAR = VARCHAR2
 LONGVARCHAR = VARCHAR2 (2000)
@@ -46,4 +46,4 @@
 
 maxColumnNameLength = 30
 
-idMethod = sequence
+idMethod=sequence
Index: src/generator/src/templates/sql/base/oracle/index.vm
===================================================================
RCS file: 
/home/cvspublic/db-torque/src/generator/src/templates/sql/base/oracle/index.vm,v
retrieving revision 1.1
diff -u -r1.1 index.vm
--- src/generator/src/templates/sql/base/oracle/index.vm        10 Feb 2003 13:18:47 
-0000      1.1
+++ src/generator/src/templates/sql/base/oracle/index.vm        19 Mar 2003 02:26:11 
-0000
@@ -1,3 +1,10 @@
+#if ($table.IndexTablespace == true)
+    #set($useIndexTablespace=true)
+#else
+    #set($useIndexTablespace=false)
+#end
+
+
 #foreach ($index in $table.Indices)
-CREATE#if ($index.Unique)UNIQUE#end INDEX $index.Name ON $table.Name 
($index.ColumnList);
+CREATE#if ($index.Unique)UNIQUE#end INDEX $index.Name ON $table.Name 
($index.ColumnList)#if ($useIndexTablespace) TABLESPACE $table.IndexTablespace#end;
 #end
Index: src/generator/src/templates/sql/base/oracle/primarykey.vm
===================================================================
RCS file: 
/home/cvspublic/db-torque/src/generator/src/templates/sql/base/oracle/primarykey.vm,v
retrieving revision 1.1
diff -u -r1.1 primarykey.vm
--- src/generator/src/templates/sql/base/oracle/primarykey.vm   10 Feb 2003 13:18:47 
-0000      1.1
+++ src/generator/src/templates/sql/base/oracle/primarykey.vm   19 Mar 2003 02:26:11 
-0000
@@ -3,5 +3,5 @@
 #if ($table.hasPrimaryKey())
 ALTER TABLE $table.Name
     ADD CONSTRAINT ${table.Name.substring(0,$length)}_PK
-PRIMARY KEY ($table.printPrimaryKey());
+PRIMARY KEY ($table.printPrimaryKey()) #if ($table.IndexTablespace) USING INDEX 
TABLESPACE $table.IndexTablespace#else -- YAY!#end;
 #end
Index: src/generator/src/templates/sql/base/oracle/unique.vm
===================================================================
RCS file: 
/home/cvspublic/db-torque/src/generator/src/templates/sql/base/oracle/unique.vm,v
retrieving revision 1.1
diff -u -r1.1 unique.vm
--- src/generator/src/templates/sql/base/oracle/unique.vm       10 Feb 2003 13:18:47 
-0000      1.1
+++ src/generator/src/templates/sql/base/oracle/unique.vm       19 Mar 2003 02:26:11 
-0000
@@ -1,3 +1,10 @@
-#foreach ($unique in $table.Unices)
-    CONSTRAINT $unique.Name UNIQUE ($unique.ColumnList),
+#if ($table.IndexTablespace == true)
+    #set($useIndexTablespace=true)
+#else
+    #set($useIndexTablespace=false)
 #end
+
+
+#foreach ($unique in $table.Unices)
+    CONSTRAINT $unique.Name UNIQUE ($unique.ColumnList)#if ($useIndexTablespace) 
USING INDEX TABLESPACE $table.IndexTablespace#end,
+#end
\ No newline at end of file
Index: src/generator/src/templates/sql/base/postgresql/columns.vm
===================================================================
RCS file: 
/home/cvspublic/db-torque/src/generator/src/templates/sql/base/postgresql/columns.vm,v
retrieving revision 1.1
diff -u -r1.1 columns.vm
--- src/generator/src/templates/sql/base/postgresql/columns.vm  10 Feb 2003 13:18:47 
-0000      1.1
+++ src/generator/src/templates/sql/base/postgresql/columns.vm  19 Mar 2003 02:26:11 
-0000
@@ -9,35 +9,35 @@
     #else
         #set ( $size = "" )
     #end
-    #if (($table.IdMethod == "native") && ($col.isPrimaryKey()))
-      #set ( $default = "DEFAULT nextval('$table.SequenceName')" )
-    #else
-      #set ( $default = $col.DefaultSetting )
-    #end
+    #set ( $default = $col.DefaultSetting )
     #set ( $nullString = $strings.select($col.isNotNull(), 
$dbprops.get("NOTNULL"),"") )
     #set ( $entry = "$col.Name $type $size $default $nullString" )
-    #set ( $autoIncrement = $dbprops.get("AUTOINCREMENT") )
+    #if ($col.isAutoIncrement() && $table.IdMethod == "native")
+    #set ( $autoIncrement = $strings.select($col.isAutoIncrement(), 
$dbprops.get("AUTOINCREMENT"),"") )
+    #else
+    #set ( $autoIncrement = " int" )
+    #end
     #set ( $entry = $strings.select($col.isAutoIncrement(), "$col.Name 
$autoIncrement", $entry) )
 ##
 ## the following works if you want to inline your foreign keys
 ## if you turn it on, be sure to comment out foreignkey.vm
 #if (false)
-  #if ($col.isForeignKey())
-    #set ($fk = $col.ForeignKey)
-    #set ($entry = "$entry REFERENCES $fk.ForeignTableName ($fk.ForeignColumnNames)")
-    #if ($fk.hasOnUpdate())
-      #set ($entry = "$entry ON UPDATE $fk.OnUpdate ")
-    #end
-    #if ($fk.hasOnDelete())
-      #set ($entry = "$entry ON DELETE $fk.OnDelete ")
-    #end
-  #end
+#if ($col.isForeignKey())
+#set ($fk = $col.ForeignKey)
+#set ($entry = "$entry REFERENCES $fk.ForeignTableName ($fk.ForeignColumnNames)")
+#if ($fk.hasOnUpdate())
+#set ($entry = "$entry ON UPDATE $fk.OnUpdate ")
 #end
+#if ($fk.hasOnDelete())
+#set ($entry = "$entry ON DELETE $fk.OnDelete ")
+#end
+#end
+#end
+#set ( $entry = $strings.collapseSpaces("$entry,") )
+    $strings.sub($entry," ,",",")
 ## add a nice comment
 #if ($col.isForeignKey())
-  #set ($fk = $col.ForeignKey)
+#set ($fk = $col.ForeignKey)
       -- REFERENCES $fk.ForeignTableName ($fk.ForeignColumnNames)
 #end
-#set ( $entry = $strings.collapseSpaces("$entry,") )
-    $strings.sub($entry," ,",",")
 #end
Index: src/generator/src/templates/sql/base/postgresql/db.props
===================================================================
RCS file: 
/home/cvspublic/db-torque/src/generator/src/templates/sql/base/postgresql/db.props,v
retrieving revision 1.1
diff -u -r1.1 db.props
--- src/generator/src/templates/sql/base/postgresql/db.props    10 Feb 2003 13:18:47 
-0000      1.1
+++ src/generator/src/templates/sql/base/postgresql/db.props    19 Mar 2003 02:26:11 
-0000
@@ -1,27 +1,23 @@
 # Taken from java.sql.Types in the IBM 1.3 JDK
 # JDBC to PostgreSQL mappings.
-#
-# See http://www.postgresql.org/idocs/index.php?datatype.html for more
-# information on PostgreSQL data types.
 
-BIT = boolean
+BIT =
 TINYINT = int2
 SMALLINT = int2
 INTEGER = integer
 BIGINT = int8
 FLOAT = float
 REAL = float
-BOOLEANCHAR = char
+BOOLEANCHAR = boolean
 BOOLEANINT = int2
 
-DOUBLE = double
-# numeric(precision, scale) / decimal(precision, scale)
-NUMERIC = numeric
-DECIMAL = decimal
-CHAR = char
+DOUBLE = double precision 
+NUMERIC =
+DECIMAL =
+CHAR = varchar
 VARCHAR = varchar
 LONGVARCHAR = bytea
-DATE = date
+DATE = date 
 TIME = time
 TIMESTAMP = timestamp
 BINARY = bytea
@@ -47,4 +43,3 @@
 
 suppressDefaults = false
 idMethod=sequence
-
Index: src/generator/src/templates/sql/base/postgresql/index.vm
===================================================================
RCS file: 
/home/cvspublic/db-torque/src/generator/src/templates/sql/base/postgresql/index.vm,v
retrieving revision 1.1
diff -u -r1.1 index.vm
--- src/generator/src/templates/sql/base/postgresql/index.vm    10 Feb 2003 13:18:47 
-0000      1.1
+++ src/generator/src/templates/sql/base/postgresql/index.vm    19 Mar 2003 02:26:11 
-0000
@@ -1,4 +1,3 @@
 #foreach ($index in $table.Indices)
 CREATE#if($index.Unique) UNIQUE#end INDEX $index.Name ON $table.Name 
($index.ColumnList);
 #end
-
Index: src/generator/src/templates/sql/base/postgresql/table.vm
===================================================================
RCS file: 
/home/cvspublic/db-torque/src/generator/src/templates/sql/base/postgresql/table.vm,v
retrieving revision 1.1
diff -u -r1.1 table.vm
--- src/generator/src/templates/sql/base/postgresql/table.vm    10 Feb 2003 13:18:47 
-0000      1.1
+++ src/generator/src/templates/sql/base/postgresql/table.vm    19 Mar 2003 02:26:12 
-0000
@@ -18,4 +18,3 @@
 
 );
 #if($index.length() > 0)$strings.chop($index,1)#end
-


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to