You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2006/07/07 00:42:57 UTC

svn commit: r419728 - /incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/dba/sybase/SybasePkGenerator.java

Author: aadamchik
Date: Thu Jul  6 15:42:57 2006
New Revision: 419728

URL: http://svn.apache.org/viewvc?rev=419728&view=rev
Log:
CAY-588

Modified:
    incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/dba/sybase/SybasePkGenerator.java

Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/dba/sybase/SybasePkGenerator.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/dba/sybase/SybasePkGenerator.java?rev=419728&r1=419727&r2=419728&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/dba/sybase/SybasePkGenerator.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/dba/sybase/SybasePkGenerator.java Thu Jul  6 15:42:57 2006
@@ -64,6 +64,7 @@
 
 import org.objectstyle.cayenne.CayenneRuntimeException;
 import org.objectstyle.cayenne.access.DataNode;
+import org.objectstyle.cayenne.access.Transaction;
 import org.objectstyle.cayenne.dba.JdbcPkGenerator;
 import org.objectstyle.cayenne.map.DbEntity;
 
@@ -166,45 +167,64 @@
 	}
 
     protected int pkFromDatabase(DataNode node, DbEntity ent) throws Exception {
-        Connection connection = node.getDataSource().getConnection();
+        // handle CAY-588 - get connection that is separate from the connection in the
+        // current transaction. 
+        
+        // TODO (andrus, 7/6/2006) Note that this will still work in a pool with a single
+        // connection, as PK generator is invoked early in the transaction, before the
+        // connection is grabbed for commit... So maybe promote this to other adapters in
+        // 3.0?
+
+        Transaction transaction = Transaction.getThreadTransaction();
+        Transaction.bindThreadTransaction(null);
+
         try {
-            CallableStatement statement = connection
-                    .prepareCall("{call auto_pk_for_table(?, ?)}");
-            try {
-                statement.setString(1, ent.getName());
-                statement.setInt(2, super.getPkCacheSize());
 
-                // can't use "executeQuery"
-                // per http://jtds.sourceforge.net/faq.html#expectingResultSet
-                statement.execute();
-                if (statement.getMoreResults()) {
-                    ResultSet rs = statement.getResultSet();
-
-                    try {
-                        if (rs.next()) {
-                            return rs.getInt(1);
+            Connection connection = node.getDataSource().getConnection();
+            try {
+                CallableStatement statement = connection
+                        .prepareCall("{call auto_pk_for_table(?, ?)}");
+                try {
+                    statement.setString(1, ent.getName());
+                    statement.setInt(2, super.getPkCacheSize());
+
+                    // can't use "executeQuery"
+                    // per http://jtds.sourceforge.net/faq.html#expectingResultSet
+                    statement.execute();
+                    if (statement.getMoreResults()) {
+                        ResultSet rs = statement.getResultSet();
+
+                        try {
+                            if (rs.next()) {
+                                return rs.getInt(1);
+                            }
+                            else {
+                                throw new CayenneRuntimeException(
+                                        "Error generating pk for DbEntity "
+                                                + ent.getName());
+                            }
                         }
-                        else {
-                            throw new CayenneRuntimeException(
-                                    "Error generating pk for DbEntity " + ent.getName());
+                        finally {
+                            rs.close();
                         }
                     }
-                    finally {
-                        rs.close();
+                    else {
+                        throw new CayenneRuntimeException(
+                                "Error generating pk for DbEntity "
+                                        + ent.getName()
+                                        + ", no result set from stored procedure.");
                     }
                 }
-                else {
-                    throw new CayenneRuntimeException("Error generating pk for DbEntity "
-                            + ent.getName()
-                            + ", no result set from stored procedure.");
+                finally {
+                    statement.close();
                 }
             }
             finally {
-                statement.close();
+                connection.close();
             }
         }
         finally {
-            connection.close();
+            Transaction.bindThreadTransaction(transaction);
         }
     }