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/05/30 23:54:45 UTC

svn commit: r410387 - in /incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access: DataDomain.java ExternalTransaction.java OptimisticLockException.java

Author: aadamchik
Date: Tue May 30 14:54:44 2006
New Revision: 410387

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

Modified:
    incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataDomain.java
    incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ExternalTransaction.java
    incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/OptimisticLockException.java

Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataDomain.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataDomain.java?rev=410387&r1=410386&r2=410387&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataDomain.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataDomain.java Tue May 30 14:54:44 2006
@@ -789,8 +789,9 @@
         switch (syncType) {
             case DataChannel.ROLLBACK_CASCADE_SYNC:
                 return onSyncRollback(originatingContext);
-            // "cascade" and "no_cascade" are the same from the DataDomain perspective,
-            // including transaction handling logic
+                // "cascade" and "no_cascade" are the same from the DataDomain
+                // perspective,
+                // including transaction handling logic
             case DataChannel.FLUSH_NOCASCADE_SYNC:
             case DataChannel.FLUSH_CASCADE_SYNC:
                 return (GraphDiff) runInTransaction(new Transformer() {
@@ -873,6 +874,10 @@
                     transaction.rollback();
                 }
                 catch (Exception rollbackEx) {
+                    // although we don't expect an exception here, print the stack, as
+                    // there have been some Cayenne bugs already (CAY-557) that were
+                    // masked by this 'catch' clause.
+                    QueryLogger.logQueryError(rollbackEx);
                 }
             }
         }

Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ExternalTransaction.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ExternalTransaction.java?rev=410387&r1=410386&r2=410387&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ExternalTransaction.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ExternalTransaction.java Tue May 30 14:54:44 2006
@@ -153,9 +153,10 @@
                 return;
             }
 
-            if (status != Transaction.STATUS_ACTIVE) {
+            if (status != Transaction.STATUS_ACTIVE
+                    && status != Transaction.STATUS_MARKED_ROLLEDBACK) {
                 throw new IllegalStateException(
-                        "Transaction must have 'STATUS_ACTIVE' to be rolled back. "
+                        "Transaction must have 'STATUS_ACTIVE' or 'STATUS_MARKED_ROLLEDBACK' to be rolled back. "
                                 + "Current status: "
                                 + Transaction.decodeStatus(status));
             }

Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/OptimisticLockException.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/OptimisticLockException.java?rev=410387&r1=410386&r2=410387&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/OptimisticLockException.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/OptimisticLockException.java Tue May 30 14:54:44 2006
@@ -61,6 +61,7 @@
 import java.util.Map;
 
 import org.objectstyle.cayenne.CayenneRuntimeException;
+import org.objectstyle.cayenne.DataChannel;
 import org.objectstyle.cayenne.exp.Expression;
 import org.objectstyle.cayenne.exp.ExpressionFactory;
 import org.objectstyle.cayenne.map.DbAttribute;
@@ -74,20 +75,20 @@
  * @author Andrei Adamchik
  */
 public class OptimisticLockException extends CayenneRuntimeException {
+
     protected String querySQL;
     protected DbEntity rootEntity;
     protected Map qualifierSnapshot;
 
-    public OptimisticLockException(
-        DbEntity rootEntity,
-        String querySQL,
-        Map qualifierSnapshot) {
+    public OptimisticLockException(DbEntity rootEntity, String querySQL,
+            Map qualifierSnapshot) {
         super("Optimistic Lock Failure");
 
         this.rootEntity = rootEntity;
         this.querySQL = querySQL;
-        this.qualifierSnapshot =
-            (qualifierSnapshot != null) ? qualifierSnapshot : Collections.EMPTY_MAP;
+        this.qualifierSnapshot = (qualifierSnapshot != null)
+                ? qualifierSnapshot
+                : Collections.EMPTY_MAP;
     }
 
     public Map getQualifierSnapshot() {
@@ -99,24 +100,23 @@
     }
 
     /**
-     * Retrieves fresh snapshot for the failed row.
-     * Null row indicates that it was deleted.
+     * Retrieves fresh snapshot for the failed row. Null row indicates that it was
+     * deleted.
      */
+    // TODO: andrus, 5/30/2006 - use DataChannel instead of QE as a parameter after 1.2
     public Map getFreshSnapshot(QueryEngine engine) {
+
         // extract PK from the qualifierSnapshot and fetch a row
         // for PK, ignoring other locking attributes...
-        
+
         Expression qualifier = null;
         Iterator it = rootEntity.getPrimaryKey().iterator();
         while (it.hasNext()) {
             DbAttribute attribute = (DbAttribute) it.next();
-            Expression attributeQualifier =
-                ExpressionFactory.matchDbExp(
-                    attribute.getName(),
-                    qualifierSnapshot.get(attribute.getName()));
+            Expression attributeQualifier = ExpressionFactory.matchDbExp(attribute
+                    .getName(), qualifierSnapshot.get(attribute.getName()));
 
-            qualifier =
-                (qualifier != null)
+            qualifier = (qualifier != null)
                     ? qualifier.andExp(attributeQualifier)
                     : attributeQualifier;
         }