s3:registry: wrap the whole db upgrade in one transaction
authorMichael Adam <obnox@samba.org>
Mon, 4 Jul 2011 14:15:11 +0000 (16:15 +0200)
committerMichael Adam <obnox@samba.org>
Mon, 4 Jul 2011 18:02:09 +0000 (20:02 +0200)
The purpose of this is to prepare for multiple upgrade steps
to be performed in a single transaction, so that no change
at all is made to that database if one step fails.

Pair-Programmed-With: Gregor Beck <gbeck@sernet.de>

source3/registry/reg_backend_db.c

index 5c7f48923fb958632cbd4877c149c0c8498fff04..e87ae649cea526c2b2dcd0f0ee312eb91d822e9c 100644 (file)
@@ -507,29 +507,29 @@ WERROR regdb_init(void)
                return WERR_CAN_NOT_COMPLETE;
        }
 
+       if (regdb->transaction_start(regdb) != 0) {
+               return WERR_REG_IO_FAILURE;
+       }
+
        if (vers_id == REGVER_V1) {
                DEBUG(10, ("regdb_init: got registry db version %d, upgrading "
                           "to version %d\n", REGVER_V1, REGVER_V2));
 
-               if (regdb->transaction_start(regdb) != 0) {
-                       return WERR_REG_IO_FAILURE;
-               }
-
                werr = regdb_upgrade_v1_to_v2();
                if (!W_ERROR_IS_OK(werr)) {
                        regdb->transaction_cancel(regdb);
                        return werr;
                }
 
-               if (regdb->transaction_commit(regdb) != 0) {
-                       return WERR_REG_IO_FAILURE;
-               }
-
                vers_id = REGVER_V2;
        }
 
        /* future upgrade code should go here */
 
+       if (regdb->transaction_commit(regdb) != 0) {
+               return WERR_REG_IO_FAILURE;
+       }
+
        return WERR_OK;
 }