Update of /var/cvs/src/org/mmbase/storage/implementation/database
In directory james.mmbase.org:/tmp/cvs-serv11038

Modified Files:
        DatabaseStorageManager.java 
Log Message:
MMB-1680


See also: 
http://cvs.mmbase.org/viewcvs/src/org/mmbase/storage/implementation/database
See also: http://www.mmbase.org/jira/browse/MMB-1680


Index: DatabaseStorageManager.java
===================================================================
RCS file: 
/var/cvs/src/org/mmbase/storage/implementation/database/DatabaseStorageManager.java,v
retrieving revision 1.193
retrieving revision 1.194
diff -u -b -r1.193 -r1.194
--- DatabaseStorageManager.java 6 May 2008 15:27:40 -0000       1.193
+++ DatabaseStorageManager.java 22 Jul 2008 05:29:19 -0000      1.194
@@ -32,7 +32,7 @@
  *
  * @author Pierre van Rooden
  * @since MMBase-1.7
- * @version $Id: DatabaseStorageManager.java,v 1.193 2008/05/06 15:27:40 
pierre Exp $
+ * @version $Id: DatabaseStorageManager.java,v 1.194 2008/07/22 05:29:19 
michiel Exp $
  */
 public class DatabaseStorageManager implements StorageManager {
 
@@ -990,9 +990,9 @@
      * @throws SQLException If something wrong with the query, or the database 
is down or could not be contacted.
      * @since MMBase-1.7.1
      */
-    protected void executeUpdateCheckConnection(String query, MMObjectNode 
node,  List<CoreField> fields) throws SQLException {
+    protected int executeUpdateCheckConnection(String query, MMObjectNode 
node,  List<CoreField> fields) throws SQLException {
         try {
-            executeUpdate(query, node, fields);
+            return executeUpdate(query, node, fields);
         } catch (SQLException sqe) {
             while (true) {
                 Statement s = null;
@@ -1020,7 +1020,7 @@
                  }
                 break;
             }
-            executeUpdate(query, node, fields);
+            return executeUpdate(query, node, fields);
         }
     }
 
@@ -1032,10 +1032,12 @@
      * @param node updated node
      * @param fields updated fields
      * @throws SQLException if database connections failures occurs 
+     * @return The result of [EMAIL PROTECTED] 
PreparedStatement#executeUpdate}. That would normally be
+     * <code>1</code>, but <code>0</code> when upating a not that does not 
exists any more.
      *
      * @since MMBase-1.7.1
      */
-    protected void executeUpdate(String query, MMObjectNode node, 
List<CoreField> fields) throws SQLException {
+    protected int executeUpdate(String query, MMObjectNode node, 
List<CoreField> fields) throws SQLException {
         PreparedStatement ps = activeConnection.prepareStatement(query);
         for (int fieldNumber = 0; fieldNumber < fields.size(); fieldNumber++) {
             CoreField field = fields.get(fieldNumber);
@@ -1048,9 +1050,10 @@
             }
         }
         long startTime = getLogStartTime();
-        ps.executeUpdate();
+        int result = ps.executeUpdate();
         ps.close();
         logQuery(query, startTime);
+        return result;
 
     }
 
@@ -1071,7 +1074,11 @@
         // precommit call, needed to convert or add things before a save
         // Should be done in MMObjectBuilder
         builder.preCommit(node);
-        change(node, builder);
+        if (change(node, builder) == 0) {
+            log.debug("Changed node " + node + " does not exists any more, but 
since we had to change it, we'll have to recrate it.");
+            log.service("Recreating node " + node.getNumber());
+            create(node, builder);
+        }
         commitChange(node, "c");
         unloadShortedFields(node, builder);
         // the node instance can be wrapped by other objects 
(org.mmbase.bridge.implementation.BasicNode) or otherwise still in use.
@@ -1089,7 +1096,7 @@
      * @param builder the builder to store the node
      * @throws StorageException if an error occurred during change
      */
-    protected void change(MMObjectNode node, MMObjectBuilder builder) throws 
StorageException {
+    protected int change(MMObjectNode node, MMObjectBuilder builder) throws 
StorageException {
         List<CoreField> changeFields = new ArrayList<CoreField>();
         // obtain the node's changed fields
         Collection<String> fieldNames = node.getChanged();
@@ -1102,10 +1109,10 @@
             }
         }
         String tablename = (String) factory.getStorageIdentifier(builder);
-        change(node, builder, tablename, changeFields);
+        return change(node, builder, tablename, changeFields);
     }
 
-    protected void change(MMObjectNode node, MMObjectBuilder builder, String 
tableName, Collection<CoreField> changeFields) {
+    protected int change(MMObjectNode node, MMObjectBuilder builder, String 
tableName, Collection<CoreField> changeFields) {
         // Create a String that represents the fields to be used in the commit
         StringBuilder setFields = null;
         List<CoreField> fields = new ArrayList<CoreField>();
@@ -1137,12 +1144,15 @@
             try {
                 String query = scheme.format(this, tableName , 
setFields.toString(), builder.getField("number"), node);
                 getActiveConnection();
-                executeUpdateCheckConnection(query, node, fields);
+                return executeUpdateCheckConnection(query, node, fields);
             } catch (SQLException se) {
                 throw new StorageException(se.getMessage() + " for node " + 
node, se);
             } finally {
                 releaseActiveConnection();
             }
+        } else {
+            log.debug("Nothing changed, doing nothing");
+            return 1; // should we return 0 if the node does not exist any 
more?
         }
     }
 
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to