]> arthur.barton.de Git - netatalk.git/blobdiff - etc/cnid_dbd/dbif.h
Merge remote-tracking branch 'origin/branch-netatalk-3-0' into develop
[netatalk.git] / etc / cnid_dbd / dbif.h
index 0939ceb971486a10967ed0b9d56dbd839c98a1ad..a6c88a98068ad30f9535e03d6cb694c12e17e7dd 100644 (file)
 /*
- * $Id: dbif.h,v 1.3 2009-04-21 08:55:44 franklahm Exp $
- *
- * Copyright (C) Joerg Lenneis 2003
- * All Rights Reserved.  See COPYING.
- */
+  Copyright (C) Joerg Lenneis 2003
+  Copyright (C) Frank Lahm 2009
+  All Rights Reserved.  See COPYING.
+
+
+  API usage
+  =========
+
+  Initialisation
+  --------------
+  1. Provide storage for a DBD * handle
+     DBD *dbd;
+  2. Call dbif_init with a filename to receive a DBD handle:
+     dbd = dbif_init("cnid2.db");
+     Pass NULL to create an in-memory db.
+     Note: the DBD type is NOT from BerkeleyDB ! We've defined it.
+  3. Call dbif_env_open to open an dbd environment if you called dbif_init
+     with a filename. Pass a db_param here for on-disk databases.
+  4. Call dbif_open to finally open the CNID database itself. Pass db_param
+     here for in-memory database.
+  
+  Querying the CNID database
+  --------------------------
+  Call dbif_[get|pget|put|del]. They map to the corresponding BerkeleyDB calls
+  with the same names.
+
+  Transactions
+  ------------
+  We use AUTO_COMMIT for the BDB database accesses. This avoids explicit transactions
+  for every bdb access which speeds up reads. But in order to be able to rollback
+  in case of errors we start a transaction once we encounter the first write from
+  dbif_put or dbif_del.
+  Thus you shouldn't call dbif_txn_[begin|abort|commit], they're used internally.
+
+  Checkpoiting
+  ------------
+  Call dbif_txn_checkpoint.
+
+  Closing
+  -------
+  Call dbif_close.
+
+  Silent Upgrade Support
+  ----------------------
+
+  On cnid_dbd shutdown we reopen the environment with recovery, close and then
+  remove it. This enables an upgraded netatalk installation possibly linked against
+  a newer bdb lib to succesfully open/create an environment and then silently
+  upgrade the database itself. How nice!
+*/
 
 #ifndef CNID_DBD_DBIF_H
 #define CNID_DBD_DBIF_H 1
 
-#include <sys/cdefs.h>
 #include <db.h>
+#include <atalk/adouble.h>
 #include "db_param.h"
 
-#define DBIF_DB_CNT 3
-
-#define DBIF_IDX_CNID      0
+#define DBIF_DB_CNT 4
+#define DBIF_CNID          0
 #define DBIF_IDX_DEVINO    1
 #define DBIF_IDX_DIDNAME   2
+#define DBIF_IDX_NAME      3
+
+#define LOCKFILENAME  "lock"
+#define LOCK_FREE          0
+#define LOCK_UNLOCK        1
+#define LOCK_EXCL          2
+#define LOCK_SHRD          3
+
+/* Structures */
+typedef struct {
+    char     *name;
+    DB       *db;
+    uint32_t flags;
+    uint32_t openflags;
+    DBTYPE   type;
+} db_table;
 
-extern int        dbif_stamp  __P((void *, int));
-extern int        dbif_env_init  __P((struct db_param *));
-extern int        dbif_open  __P((struct db_param *, int));
-extern int        dbif_close __P((void));
-extern int        dbif_closedb __P((void));
-extern int        dbif_get __P((const int, DBT *, DBT *, u_int32_t));
-extern int        dbif_pget __P((const int, DBT *, DBT *, DBT *, u_int32_t));
-extern int        dbif_put __P((const int, DBT *, DBT *, u_int32_t));
-extern int        dbif_del __P((const int, DBT *, u_int32_t));
+typedef struct {
+    DB_ENV   *db_env;
+    struct db_param db_param;
+    DB_TXN   *db_txn;
+    DBC      *db_cur;              /* for dbif_walk */
+    char     *db_envhome;
+    char     *db_filename;
+    FILE     *db_errlog;
+    db_table db_table[DBIF_DB_CNT];
+} DBD;
 
-extern int        dbif_count __P((const int, u_int32_t *));
+extern DBD *dbif_init(const char *envhome, const char *dbname);
+extern int dbif_env_open(DBD *dbd, struct db_param *dbp, uint32_t dbenv_oflags);
+extern int dbif_open(DBD *dbd, struct db_param *dbp, int reindex);
+extern int dbif_close(DBD *dbd);
+extern int dbif_env_remove(const char *path);
 
-extern int        dbif_txn_begin  __P((void));
-extern int        dbif_txn_commit  __P((void));
-extern int        dbif_txn_abort  __P((void));
-extern int        dbif_txn_checkpoint  __P((u_int32_t, u_int32_t, u_int32_t));
+extern int dbif_get(DBD *, const int, DBT *, DBT *, u_int32_t);
+extern int dbif_pget(DBD *, const int, DBT *, DBT *, DBT *, u_int32_t);
+extern int dbif_put(DBD *, const int, DBT *, DBT *, u_int32_t);
+extern int dbif_del(DBD *, const int, DBT *, u_int32_t);
+extern int dbif_count(DBD *, const int, u_int32_t *);
+extern int dbif_search(DBD *dbd, DBT *key, char *resbuf);
+extern int dbif_copy_rootinfokey(DBD *srcdbd, DBD *destdbd);
+extern int dbif_txn_begin(DBD *);
+extern int dbif_txn_commit(DBD *);
+extern int dbif_txn_abort(DBD *);
+extern int dbif_txn_close(DBD *dbd, int ret); /* Switch between commit+abort */
+extern int dbif_txn_checkpoint(DBD *, u_int32_t, u_int32_t, u_int32_t);
 
+extern int dbif_dump(DBD *dbd, int dumpindexes);
+extern int dbif_idwalk(DBD *dbd, cnid_t *cnid, int close);
 #endif