cscvs to tla changeset 58
[onak.git] / keydb_db3.c
index 4d1bcca162acc14948e0e0e29be077170d76c2fb..2cb61aacaccacc4b353df1a25ea314ca3100c34d 100644 (file)
@@ -25,6 +25,7 @@
 #include "decodekey.h"
 #include "keystructs.h"
 #include "mem.h"
+#include "log.h"
 #include "onak-conf.h"
 #include "parsekey.h"
 
@@ -107,12 +108,12 @@ struct ll *makewordlist(struct ll *wordlist, char *word)
  */
 void initdb(void)
 {
-       char buf[1024];
        int ret = 0;
 
        ret = db_env_create(&dbenv, 0);
        if (ret != 0) {
-               fprintf(stderr, "db_env_create: %s\n", db_strerror(ret));
+               logthing(LOGTHING_CRITICAL,
+                       "db_env_create: %s", db_strerror(ret));
                exit(1);
        }
 
@@ -139,7 +140,8 @@ void initdb(void)
 
        ret = db_create(&dbconn, dbenv, 0);
        if (ret != 0) {
-               fprintf(stderr, "db_create: %s\n", db_strerror(ret));
+               logthing(LOGTHING_CRITICAL,
+                               "db_create: %s", db_strerror(ret));
                exit(1);
        }
 
@@ -155,7 +157,7 @@ void initdb(void)
 
        ret = db_create(&worddb, dbenv, 0);
        if (ret != 0) {
-               fprintf(stderr, "db_create: %s\n", db_strerror(ret));
+               logthing(LOGTHING_CRITICAL, "db_create: %s", db_strerror(ret));
                exit(1);
        }
        ret = worddb->set_flags(worddb, DB_DUP);
@@ -198,6 +200,7 @@ bool starttrans(void)
 {
        int ret;
 
+       assert(dbenv != NULL);
        assert(txn == NULL);
 
        ret = txn_begin(dbenv,
@@ -221,6 +224,7 @@ void endtrans(void)
 {
        int ret;
 
+       assert(dbenv != NULL);
        assert(txn != NULL);
 
        ret = txn_commit(txn,
@@ -699,6 +703,52 @@ int delete_key(uint64_t keyid, bool intrans)
        return deadlock ? (-1) : (ret == DB_NOTFOUND);
 }
 
+/**
+ *     dumpdb - dump the key database
+ *     @filenamebase: The base filename to use for the dump.
+ *
+ *     Dumps the database into one or more files, which contain pure OpenPGP
+ *     that can be reimported into onak or gpg. filenamebase provides a base
+ *     file name for the dump; several files may be created, all of which will
+ *     begin with this string and then have a unique number and a .pgp
+ *     extension.
+ */
+int dumpdb(char *filenamebase)
+{
+       DBT key, data;
+       DBC *cursor = NULL;
+       int ret = 0;
+       int fd = -1;
+
+       starttrans();
+       
+       ret = dbconn->cursor(dbconn,
+               txn,
+               &cursor,
+               0);   /* flags */
+
+       fd = open(filenamebase, O_CREAT | O_WRONLY | O_TRUNC, 0640);
+       memset(&key, 0, sizeof(key));
+       memset(&data, 0, sizeof(data));
+       ret = cursor->c_get(cursor, &key, &data, DB_NEXT);
+       while (ret == 0) {
+               write(fd, data.data, data.size);
+               memset(&key, 0, sizeof(key));
+               memset(&data, 0, sizeof(data));
+               ret = cursor->c_get(cursor, &key, &data, DB_NEXT);
+       }
+       dbconn->err(dbconn, ret, "Problem reading key");
+
+       close(fd);
+
+       ret = cursor->c_close(cursor);
+       cursor = NULL;
+       
+       endtrans();
+       
+       return 0;
+}
+
 /*
  * Include the basic keydb routines.
  */