Author: arminw
Date: Thu Feb  2 03:28:56 2006
New Revision: 374363

URL: http://svn.apache.org/viewcvs?rev=374363&view=rev
Log:
fix issue, if OJB's batch statement mode is enabled and identity columns are 
used, OJB will always execute batch on insert
fix issue, if OJB's batch statement mode is enabled and optimistic locking is 
used, OJB will always execute batch on update and delete

Modified:
    
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java

Modified: 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java
URL: 
http://svn.apache.org/viewcvs/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java?rev=374363&r1=374362&r2=374363&view=diff
==============================================================================
--- 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java
 (original)
+++ 
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java
 Thu Feb  2 03:28:56 2006
@@ -99,6 +99,8 @@
         PreparedStatement stmt = null;
         try
         {
+            // workaround for issue with optimistic locking with enabled batch 
mode
+            boolean batchSetting = preHandleBatchProcess(cld);
             stmt = sm.getDeleteStatement(cld);
             if (stmt == null)
             {
@@ -107,8 +109,7 @@
             }
 
             sm.bindDelete(stmt, cld, obj);
-            if (logger.isDebugEnabled())
-                logger.debug("executeDelete: " + stmt);
+            if (logger.isDebugEnabled()) logger.debug("executeDelete: " + 
stmt);
 
             // @todo: clearify semantics
             // thma: the following check is not secure. The object could be 
deleted *or* changed.
@@ -116,8 +117,10 @@
             // does is make sense to throw an OL exception if the object was 
changed?
             if (stmt.executeUpdate() == 0 && cld.isLocking()) //BRJ
             {
+                postHandleBatchProcess(batchSetting);
                 throw new OptimisticLockException("Object has been modified or 
deleted by someone else", obj);
             }
+            postHandleBatchProcess(batchSetting);
 
             // Harvest any return values.
             harvestReturnValues(cld.getDeleteProcedure(), obj, stmt);
@@ -493,22 +496,24 @@
         oldLockingValues = cld.getCurrentLockingValues(obj);
         try
         {
+            // workaround for issue with optimistic locking with enabled batch 
mode
+            boolean batchSetting = preHandleBatchProcess(cld);
             stmt = sm.getUpdateStatement(cld);
             if (stmt == null)
             {
                 logger.error("getUpdateStatement returned a null statement");
                 throw new PersistenceBrokerException("getUpdateStatement 
returned a null statement");
             }
-
             sm.bindUpdate(stmt, cld, obj);
-            if (logger.isDebugEnabled())
-                logger.debug("executeUpdate: " + stmt);
+
+            if (logger.isDebugEnabled()) logger.debug("executeUpdate: " + 
stmt);
 
             if ((stmt.executeUpdate() == 0) && cld.isLocking()) //BRJ
             {
+                postHandleBatchProcess(batchSetting);
                 throw new OptimisticLockException("Object has been modified by 
someone else", obj);
             }
-
+            postHandleBatchProcess(batchSetting);
             // Harvest any return values.
             harvestReturnValues(cld.getUpdateProcedure(), obj, stmt);
         }
@@ -762,7 +767,7 @@
         return true;
     }
 
-    protected void preSequenceProcess(ClassDescriptor cld, Object target) 
throws SequenceManagerException
+    protected void preSequenceProcess(final ClassDescriptor cld, final Object 
target) throws SequenceManagerException
     {
         // TODO: refactor auto-increment handling, auto-increment should only 
be supported by PK fields?
         // FieldDescriptor[] fields = cld.getPkFields();
@@ -783,7 +788,7 @@
         }
     }
 
-    protected void postSequenceProcess(ClassDescriptor cld, Object target) 
throws SequenceManagerException
+    protected void postSequenceProcess(final ClassDescriptor cld, final Object 
target) throws SequenceManagerException
     {
         // if database Identity Columns are used, query the id from database
         // other SequenceManager implementations will ignore this call
@@ -793,6 +798,41 @@
             broker.serviceConnectionManager().executeBatch();
             // lookup identity column PK value from DB and set PK in 
persistent object
             broker.serviceSequenceManager().afterStore(this, cld, target);
+        }
+    }
+
+    /**
+     * Workaround workaround to avoid problems with locking fields in batch 
mode.
+     * Only use in combination with method [EMAIL PROTECTED] 
#postHandleBatchProcess(boolean)}.
+     * @return The 'old' state of the batch mode setting. This value have to 
be used
+     * in method [EMAIL PROTECTED] #postHandleBatchProcess(boolean)} to 
restore the old batch mode state.
+     */
+    protected boolean preHandleBatchProcess(final ClassDescriptor cld)
+    {
+        // TODO: this is a workaround to avoid problems with locking fields in 
batch mode
+        if(cld.isLocking())
+        {
+            ConnectionManagerIF cm = broker.serviceConnectionManager();
+            if(cm.isBatchMode())
+            {
+                cm.executeBatch();
+                cm.setBatchMode(false);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Workaround workaround to avoid problems with locking fields in batch 
mode.
+     * Only use in combination with method
+     * [EMAIL PROTECTED] 
#preHandleBatchProcess(org.apache.ojb.broker.metadata.ClassDescriptor)}.
+     */
+    protected void postHandleBatchProcess(final boolean batchModeSetting)
+    {
+        if(batchModeSetting)
+        {
+            broker.serviceConnectionManager().setBatchMode(true);
         }
     }
 }



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

Reply via email to