chiark / gitweb /
Do not fatal-error when deleting a global pref that does not exist.
authorRichard Kettlewell <rjk@terraraq.org.uk>
Sat, 30 Jul 2011 20:11:40 +0000 (21:11 +0100)
committerRichard Kettlewell <rjk@terraraq.org.uk>
Sat, 30 Jul 2011 20:11:40 +0000 (21:11 +0100)
lib/trackdb.c
lib/trackdb.h
server/server.c

index ddf11afa3c395f3848f9265f9624c6381aa96edf..4afd9257929960eb168fb921d383a906a2968fd5 100644 (file)
@@ -2736,16 +2736,18 @@ int trackdb_rescan_underway(void) {
  * @param name Global preference name
  * @param value New value
  * @param who Who is setting it
+ * @return 0 on success, -1 on error
  */
-void trackdb_set_global(const char *name,
+int trackdb_set_global(const char *name,
                         const char *value,
                         const char *who) {
   DB_TXN *tid;
-  int state;
+  int state, err;
 
   for(;;) {
     tid = trackdb_begin_transaction();
-    if(!trackdb_set_global_tid(name, value, tid))
+    err = trackdb_set_global_tid(name, value, tid);
+    if(err != DB_LOCK_DEADLOCK)
       break;
     trackdb_abort_transaction(tid);
   }
@@ -2766,6 +2768,7 @@ void trackdb_set_global(const char *name,
     eventlog("state", state ? "enable_random" : "disable_random", (char *)0);
   }
   eventlog("global_pref", name, value, (char *)0);
+  return err == 0 ? 0 : -1;
 }
 
 /** @brief Set a global preference
@@ -2791,7 +2794,7 @@ int trackdb_set_global_tid(const char *name,
     err = trackdb_globaldb->put(trackdb_globaldb, tid, &k, &d, 0);
   else
     err = trackdb_globaldb->del(trackdb_globaldb, tid, &k, 0);
-  if(err == DB_LOCK_DEADLOCK) return err;
+  if(err == DB_LOCK_DEADLOCK || err == DB_NOTFOUND) return err;
   if(err)
     disorder_fatal(0, "error updating database: %s", db_strerror(err));
   return 0;
index 1d7c8e97cf02d94e25498a32527eee21622cef79..a37c81b3fd8c478d366529b0624a56bb2b897c73 100644 (file)
@@ -148,9 +148,9 @@ int trackdb_rescan_cancel(void);
 void trackdb_gc(void);
 /* tidy up old database log files */
 
-void trackdb_set_global(const char *name,
-                        const char *value,
-                        const char *who);
+int trackdb_set_global(const char *name,
+                       const char *value,
+                       const char *who);
 /* set a global pref (remove if value=0). */
 
 const char *trackdb_get_global(const char *name);
index 4dafabbbcf380ac5756ba5c23ddf687a398c96f9..d8a84ea5683d0423ed85417c72c49a5dab402354 100644 (file)
@@ -1150,8 +1150,10 @@ static int c_set_global(struct conn *c,
     sink_writes(ev_writer_sink(c->w), "550 cannot set internal global preferences\n");
     return 1;
   }
-  trackdb_set_global(vec[0], vec[1], c->who);
-  sink_printf(ev_writer_sink(c->w), "250 OK\n");
+  if(trackdb_set_global(vec[0], vec[1], c->who))
+    sink_printf(ev_writer_sink(c->w), "250 OK\n");
+  else
+    sink_writes(ev_writer_sink(c->w), "550 not found\n");
   return 1;
 }