Author: vlendec
Date: 2006-04-17 17:56:57 +0000 (Mon, 17 Apr 2006)
New Revision: 15108

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=15108

Log:
Implement tdb_trans_store() and use it in secrets_store().

Tridge, did I use the transaction stuff right in tdb_trans_store?

Thanks,

Volker

Modified:
   trunk/source/passdb/secrets.c
   trunk/source/tdb/tdbutil.c


Changeset:
Modified: trunk/source/passdb/secrets.c
===================================================================
--- trunk/source/passdb/secrets.c       2006-04-17 17:16:46 UTC (rev 15107)
+++ trunk/source/passdb/secrets.c       2006-04-17 17:56:57 UTC (rev 15108)
@@ -104,8 +104,8 @@
        secrets_init();
        if (!tdb)
                return False;
-       return tdb_store(tdb, string_tdb_data(key), make_tdb_data(data, size),
-                        TDB_REPLACE) == 0;
+       return tdb_trans_store(tdb, string_tdb_data(key),
+                              make_tdb_data(data, size), TDB_REPLACE) == 0;
 }
 
 

Modified: trunk/source/tdb/tdbutil.c
===================================================================
--- trunk/source/tdb/tdbutil.c  2006-04-17 17:16:46 UTC (rev 15107)
+++ trunk/source/tdb/tdbutil.c  2006-04-17 17:56:57 UTC (rev 15108)
@@ -907,3 +907,32 @@
        return tdb->flags;
 }
 
+/****************************************************************************
+ tdb_store, wrapped in a transaction. This way we make sure that a process
+ that dies within writing does not leave a corrupt tdb behind.
+****************************************************************************/
+
+int tdb_trans_store(struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf,
+                   int flag)
+{
+       int res;
+
+       if ((res = tdb_transaction_start(tdb)) != 0) {
+               DEBUG(5, ("tdb_transaction_start failed\n"));
+               return res;
+       }
+
+       if ((res = tdb_store(tdb, key, dbuf, flag)) != 0) {
+               DEBUG(10, ("tdb_store failed\n"));
+               if (tdb_transaction_cancel(tdb) != 0) {
+                       smb_panic("Cancelling transaction failed\n");
+               }
+               return res;
+       }
+
+       if ((res = tdb_transaction_commit(tdb)) != 0) {
+               DEBUG(5, ("tdb_transaction_commit failed\n"));
+       }
+
+       return res;
+}

Reply via email to