Error checking and recovery for uiddb on init
[claws-mail-maildir-plugin.git] / src / uiddb.c
index 9df0967833d06e557487c8e7518e856c996838ef..c998fd815dfbf608fb2de1b54d41d9ea713181e0 100644 (file)
@@ -36,8 +36,24 @@ static DB_ENV *dbenv;
 
 void uiddb_init()
 {
-       db_env_create(&dbenv, 0);
-       dbenv->open(dbenv, get_tmp_dir(), DB_INIT_MPOOL | DB_INIT_CDB | DB_CREATE, 0600);
+       int ret;
+       int flags = DB_INIT_MPOOL | DB_INIT_CDB | DB_CREATE;
+
+       if ((ret = db_env_create(&dbenv, 0)) != 0) {
+               g_warning("db_env_create: %s", db_strerror(ret));
+               return;
+       }
+       if ((ret = dbenv->open(dbenv, get_tmp_dir(), flags, 0600)) != 0) {
+               if (ret != DB_RUNRECOVERY) {
+                       g_warning("dbenv->open: %s", db_strerror(ret));
+                       return;
+               }
+               flags |= DB_RECOVER;
+               if ((ret = dbenv->open(dbenv, get_tmp_dir(), flags, 0600)) != 0) {
+                       g_warning("dbenv->open (recovering): %s", db_strerror(ret));
+                       return;
+               }
+       }
 
        initialized = TRUE;
 }