Hi all,

This is about how to get the large object stuff working in turbine. 
there's a bunch of patches, and some of the stuff isn't all that clean,
but I'd need some suggestions because cleaning it up might require
changes to public interfaces...

First of all, to run turbine with pgsql, you have to get the newest
pgsql JDBC driver, and then apply a patch to it.  Find the patch here:
http://www.mail-archive.com/turbine%40list.working-dogs.com/msg02249.html

Note: if you use OID for something other than large object references
and you need it to look like an int in the JDBC metadata this patch will
break that.  If you have no idea what that means, you're probably safe
using it.

Next I have patches for turbine, because to read or write object data
from postgres, you must be within a transaction.  The following code
adds some stuff to the DB interface, and the BasePeer to check if the
database you're using requires this functionality, and then to create
the transaction if you do.

<Questions for turbine coders>
1) In the BasePeer.doUpdate, we can check whether the table(s) getting
updated contain an object column, and only execute the transaction then,
but in the executeQuery method we don't have access to the table names,
so we have to make the transaction every time if it's postgres, should
we try to fix that?  We'd have to get the connection from the pool in
the doSelect method, and then pass it to the executeQuery, but that
would change the interface...should we add another executeQuery method
that takes a Connection param?

2) To test whether a column is objectdata, we don't have the SQL type,
so I just check if it's not instanceof String, Date or Number then it's
objectdata...should we add the SQL type to the columnMap...it's not
easy, because of all the public helper methods have the same interface
as the new methods would have...because length is an int and
java.sql.Types.* are ints...
</Questions for turbine coders>

Thanks

        -Nissim

Patches:

Index: docs/schemas/Postgres_users_roles_permissions.sql
===================================================================
RCS file:
/products/cvs/turbine/turbine/docs/schemas/Postgres_users_roles_permissions.sql,v
retrieving revision 1.1
diff -r1.1 Postgres_users_roles_permissions.sql
83c83
<     OBJECTDATA                varchar (255),                          -- oder doch 
bytea???
---
>     OBJECTDATA                oid,
Index: src/java/org/apache/turbine/om/peer/BasePeer.java
===================================================================
RCS file:
/products/cvs/turbine/turbine/src/java/org/apache/turbine/om/peer/BasePeer.java,v
retrieving revision 1.25
diff -r1.25 BasePeer.java
867a868,879
> 
>             Statement stmt = null;
>             boolean doTransaction = DBBroker.getInstance()
>                                             .getDB( dbName )
>                                             .objectDataNeedsTrans();
>             if (doTransaction)
>             {
>                 stmt = connection.createStatement();
>                 stmt.executeUpdate("BEGIN TRANSACTION");
>                 stmt.close();
>             }
>             
870a883,890
> 
>             if (doTransaction)
>             {
>                 stmt = connection.createStatement();
>                 stmt.executeUpdate("COMMIT TRANSACTION");
>                 stmt.close();
>             }
> 
1062a1083,1100
>             
>             Statement stmt = null;
>             boolean doTransaction = false;
>             if ( db.objectDataNeedsTrans() )
>             {
>                 for (int i = 0; i<tables.size(); i++)
>                 {
>                     doTransaction = doTransaction || 
>                                     containsObjectColumn(dbMap, tables.get(i));
>                 }
>             }
> 
>             if ( doTransaction )
>             {
>                 stmt = dbCon.createStatement();
>                 stmt.executeUpdate("BEGIN TRANSACTION");
>                 stmt.close();
>             }
1122a1161,1168
> 
>             if ( doTransaction )
>             {
>                 stmt = dbCon.createStatement();
>                 stmt.executeUpdate("COMMIT TRANSACTION");
>                 stmt.close();
>             }
> 
1230a1277,1289
>     }
> 
>     /**
>      * Determines whether any of the columns in the table are object
>      * (binary) data.  
>      *
>      * @return true if the table contains a column which will be a SQL 
>      *    large object.
>      */
>     public static boolean containsObjectColumn(DatabaseMap dbMap, String tableName) 
>throws Exception
>     {
>         TableMap tmap = dbMap.getTable(tableName);
>         return tmap.containsObjectColumn();
Index: src/java/org/apache/turbine/util/db/map/TableMap.java
===================================================================
RCS file:
/products/cvs/turbine/turbine/src/java/org/apache/turbine/util/db/map/TableMap.java,v
retrieving revision 1.6
diff -r1.6 TableMap.java
181a182,199
>      * Returns true if this tableMap contains a column with object data.
>      */
>     public boolean containsObjectColumn()
>     {
>         Enumeration e = columns.elements();
>         while (e.hasMoreElements())
>         {
>             Object theType = ((ColumnMap)e.nextElement()).getType();
>             if (! ( theType instanceof String || 
>                     theType instanceof Number ||
>                     theType instanceof java.util.Date ) )
>             {
>                 return true;
>             }
>         }
>         return false;
>     }
>     /**
Index: src/java/org/apache/turbine/util/db/pool/DB.java
===================================================================
RCS file:
/products/cvs/turbine/turbine/src/java/org/apache/turbine/util/db/pool/DB.java,v
retrieving revision 1.8
diff -r1.8 DB.java
123a124,126
>     /** The method is used to chek whether 
>         writing large objects to the DB requires a transaction. */
>     public abstract boolean objectDataNeedsTrans();
Index: src/java/org/apache/turbine/util/db/pool/DBDB2App.java
===================================================================
RCS file:
/products/cvs/turbine/turbine/src/java/org/apache/turbine/util/db/pool/DBDB2App.java,v
retrieving revision 1.4
diff -r1.4 DBDB2App.java
145a146,153
> 
>     /**
>      * Returns false because transactions are only necessary in postgres.
>      */
>     public boolean objectDataNeedsTrans()
>     {
>         return false;
>     }
Index: src/java/org/apache/turbine/util/db/pool/DBHypersonicSQL.java
===================================================================
RCS file:
/products/cvs/turbine/turbine/src/java/org/apache/turbine/util/db/pool/DBHypersonicSQL.java,v
retrieving revision 1.3
diff -r1.3 DBHypersonicSQL.java
131a132,139
> 
>     /**
>      * Returns false because transactions are only necessary in postgres.
>      */
>     public boolean objectDataNeedsTrans()
>     {
>         return false;
>     }
Index: src/java/org/apache/turbine/util/db/pool/DBInstantDB.java
===================================================================
RCS file:
/products/cvs/turbine/turbine/src/java/org/apache/turbine/util/db/pool/DBInstantDB.java,v
retrieving revision 1.5
diff -r1.5 DBInstantDB.java
128a129,135
>     /**
>      * Returns false because transactions are only necessary in postgres.
>      */
>     public boolean objectDataNeedsTrans()
>     {
>         return false;
>     }
Index: src/java/org/apache/turbine/util/db/pool/DBInterbase.java
===================================================================
RCS file:
/products/cvs/turbine/turbine/src/java/org/apache/turbine/util/db/pool/DBInterbase.java,v
retrieving revision 1.1
diff -r1.1 DBInterbase.java
136a137,143
>     /**
>      * Returns false because transactions are only necessary in postgres.
>      */
>     public boolean objectDataNeedsTrans()
>     {
>         return false;
>     }
Index: src/java/org/apache/turbine/util/db/pool/DBMM.java
===================================================================
RCS file:
/products/cvs/turbine/turbine/src/java/org/apache/turbine/util/db/pool/DBMM.java,v
retrieving revision 1.5
diff -r1.5 DBMM.java
134a135,142
> 
>     /**
>      * Returns false because transactions are only necessary in postgres.
>      */
>     public boolean objectDataNeedsTrans()
>     {
>         return false;
>     }
Index: src/java/org/apache/turbine/util/db/pool/DBOracle.java
===================================================================
RCS file:
/products/cvs/turbine/turbine/src/java/org/apache/turbine/util/db/pool/DBOracle.java,v
retrieving revision 1.5
diff -r1.5 DBOracle.java
133a134,141
> 
>     /**
>      * Returns false because transactions are only necessary in postgres.
>      */
>     public boolean objectDataNeedsTrans()
>     {
>         return false;
>     }
Index: src/java/org/apache/turbine/util/db/pool/DBPostgres.java
===================================================================
RCS file:
/products/cvs/turbine/turbine/src/java/org/apache/turbine/util/db/pool/DBPostgres.java,v
retrieving revision 1.4
diff -r1.4 DBPostgres.java
146a147,153
>     /**
>      * Returns true because transactions are necessary in postgres.
>      */
>     public boolean objectDataNeedsTrans()
>     {
>         return true;
>     }
Index: src/java/org/apache/turbine/util/db/pool/DBSybase.java
===================================================================
RCS file:
/products/cvs/turbine/turbine/src/java/org/apache/turbine/util/db/pool/DBSybase.java,v
retrieving revision 1.3
diff -r1.3 DBSybase.java
132a133,140
> 
>     /**
>      * Returns false because transactions are only necessary in postgres.
>      */
>     public boolean objectDataNeedsTrans()
>     {
>         return false;
>     }
Index: src/java/org/apache/turbine/util/db/pool/DBWeblogic.java
===================================================================
RCS file:
/products/cvs/turbine/turbine/src/java/org/apache/turbine/util/db/pool/DBWeblogic.java,v
retrieving revision 1.4
diff -r1.4 DBWeblogic.java
126a127,133
>     /**
>      * Returns false because transactions are only necessary in postgres.
>      */
>     public boolean objectDataNeedsTrans()
>     {
>         return false;
>     }


------------------------------------------------------------
To subscribe:        [EMAIL PROTECTED]
To unsubscribe:      [EMAIL PROTECTED]
Search: <http://www.mail-archive.com/turbine%40list.working-dogs.com/>
Problems?:           [EMAIL PROTECTED]

Reply via email to