]> git.ozlabs.org Git - ccan/blobdiff - ccan/tdb2/private.h
tdb2: rework io functions to return enum TDB_ERROR.
[ccan] / ccan / tdb2 / private.h
index 09f447f9221d179377d3e25bddae3a45977c49b1..f0b5cae562db93b5b9bb8cc05607f36ad36556dc 100644 (file)
@@ -1,6 +1,6 @@
 #ifndef TDB_PRIVATE_H
 #define TDB_PRIVATE_H
- /* 
+ /*
    Trivial Database 2: private types and prototypes
    Copyright (C) Rusty Russell 2010
 
@@ -37,7 +37,7 @@
 #include <ccan/tdb2/tdb2.h>
 #include <ccan/likely/likely.h>
 #include <ccan/compiler/compiler.h>
-#ifdef HAVE_BYTESWAP_H
+#if HAVE_BYTESWAP_H
 #include <byteswap.h>
 #endif
 
@@ -74,6 +74,16 @@ typedef uint64_t tdb_off_t;
 #define TDB_RECOVERY_INVALID_MAGIC (0x0ULL)
 
 #define TDB_OFF_ERR ((tdb_off_t)-1)
+#define TDB_OFF_IS_ERR(off) unlikely(off >= (tdb_off_t)TDB_ERR_LAST)
+
+/* Packing errors into pointers and v.v. */
+#define TDB_PTR_IS_ERR(ptr) \
+       unlikely((void *)(ptr) >= (void *)(long)TDB_ERR_LAST)
+#define TDB_PTR_ERR(p) ((enum TDB_ERROR)(long)(p))
+#define TDB_ERR_PTR(err) ((void *)(long)(err))
+
+/* Common case of returning true, false or -ve error. */
+typedef int tdb_bool_err;
 
 /* Prevent others from opening the file. */
 #define TDB_OPEN_LOCK 0
@@ -325,17 +335,20 @@ struct tdb_context {
        int mmap_flags;
 
        /* Error code for last tdb error. */
-       enum TDB_ERROR ecode; 
+       enum TDB_ERROR ecode;
 
        /* the flags passed to tdb_open, for tdb_reopen. */
        uint32_t flags;
 
        /* Logging function */
-       tdb_logfn_t logfn;
+       void (*logfn)(struct tdb_context *tdb,
+                     enum tdb_log_level level,
+                     void *log_private,
+                     const char *message);
        void *log_private;
 
        /* Hash function. */
-       tdb_hashfn_t khash;
+       uint64_t (*khash)(const void *key, size_t len, uint64_t seed, void *);
        void *hash_priv;
        uint64_t hash_seed;
 
@@ -361,15 +374,17 @@ struct tdb_context {
 
        /* Single list of all TDBs, to avoid multiple opens. */
        struct tdb_context *next;
-       dev_t device;   
+       dev_t device;
        ino_t inode;
 };
 
 struct tdb_methods {
-       int (*read)(struct tdb_context *, tdb_off_t, void *, tdb_len_t);
-       int (*write)(struct tdb_context *, tdb_off_t, const void *, tdb_len_t);
-       int (*oob)(struct tdb_context *, tdb_off_t, bool);
-       int (*expand_file)(struct tdb_context *, tdb_len_t);
+       enum TDB_ERROR (*tread)(struct tdb_context *, tdb_off_t, void *,
+                               tdb_len_t);
+       enum TDB_ERROR (*twrite)(struct tdb_context *, tdb_off_t, const void *,
+                                tdb_len_t);
+       enum TDB_ERROR (*oob)(struct tdb_context *, tdb_off_t, bool);
+       enum TDB_ERROR (*expand_file)(struct tdb_context *, tdb_len_t);
        void *(*direct)(struct tdb_context *, tdb_off_t, size_t, bool);
 };
 
@@ -379,6 +394,14 @@ struct tdb_methods {
 /* hash.c: */
 void tdb_hash_init(struct tdb_context *tdb);
 
+int first_in_hash(struct tdb_context *tdb,
+                 struct traverse_info *tinfo,
+                 TDB_DATA *kbuf, size_t *dlen);
+
+int next_in_hash(struct tdb_context *tdb,
+                struct traverse_info *tinfo,
+                TDB_DATA *kbuf, size_t *dlen);
+
 /* Hash random memory. */
 uint64_t tdb_hash(struct tdb_context *tdb, const void *ptr, size_t len);
 
@@ -474,11 +497,6 @@ tdb_off_t tdb_find_nonzero_off(struct tdb_context *tdb,
 tdb_off_t tdb_find_zero_off(struct tdb_context *tdb, tdb_off_t off,
                            uint64_t num);
 
-/* Even on files, we can get partial writes due to signals. */
-bool tdb_pwrite_all(int fd, const void *buf, size_t len, tdb_off_t off);
-bool tdb_pread_all(int fd, void *buf, size_t len, tdb_off_t off);
-bool tdb_read_all(int fd, void *buf, size_t len);
-
 /* Allocate and make a copy of some offset. */
 void *tdb_alloc_read(struct tdb_context *tdb, tdb_off_t offset, tdb_len_t len);
 
@@ -502,61 +520,54 @@ void add_stat_(struct tdb_context *tdb, uint64_t *stat, size_t val);
 void tdb_lock_init(struct tdb_context *tdb);
 
 /* Lock/unlock a range of hashes. */
-int tdb_lock_hashes(struct tdb_context *tdb,
-                   tdb_off_t hash_lock, tdb_len_t hash_range,
-                   int ltype, enum tdb_lock_flags waitflag);
-int tdb_unlock_hashes(struct tdb_context *tdb,
-                     tdb_off_t hash_lock,
-                     tdb_len_t hash_range, int ltype);
+enum TDB_ERROR tdb_lock_hashes(struct tdb_context *tdb,
+                              tdb_off_t hash_lock, tdb_len_t hash_range,
+                              int ltype, enum tdb_lock_flags waitflag);
+enum TDB_ERROR tdb_unlock_hashes(struct tdb_context *tdb,
+                                tdb_off_t hash_lock,
+                                tdb_len_t hash_range, int ltype);
 
 /* Lock/unlock a particular free bucket. */
-int tdb_lock_free_bucket(struct tdb_context *tdb, tdb_off_t b_off,
-                        enum tdb_lock_flags waitflag);
+enum TDB_ERROR tdb_lock_free_bucket(struct tdb_context *tdb, tdb_off_t b_off,
+                                   enum tdb_lock_flags waitflag);
 void tdb_unlock_free_bucket(struct tdb_context *tdb, tdb_off_t b_off);
 
 /* Serialize transaction start. */
-int tdb_transaction_lock(struct tdb_context *tdb, int ltype);
-int tdb_transaction_unlock(struct tdb_context *tdb, int ltype);
+enum TDB_ERROR tdb_transaction_lock(struct tdb_context *tdb, int ltype);
+void tdb_transaction_unlock(struct tdb_context *tdb, int ltype);
 
 /* Do we have any hash locks (ie. via tdb_chainlock) ? */
 bool tdb_has_hash_locks(struct tdb_context *tdb);
 
 /* Lock entire database. */
-int tdb_allrecord_lock(struct tdb_context *tdb, int ltype,
-                      enum tdb_lock_flags flags, bool upgradable);
-int tdb_allrecord_unlock(struct tdb_context *tdb, int ltype);
-int tdb_allrecord_upgrade(struct tdb_context *tdb);
+enum TDB_ERROR tdb_allrecord_lock(struct tdb_context *tdb, int ltype,
+                                 enum tdb_lock_flags flags, bool upgradable);
+void tdb_allrecord_unlock(struct tdb_context *tdb, int ltype);
+enum TDB_ERROR tdb_allrecord_upgrade(struct tdb_context *tdb);
 
 /* Serialize db open. */
-int tdb_lock_open(struct tdb_context *tdb, enum tdb_lock_flags flags);
+enum TDB_ERROR tdb_lock_open(struct tdb_context *tdb,
+                            enum tdb_lock_flags flags);
 void tdb_unlock_open(struct tdb_context *tdb);
 bool tdb_has_open_lock(struct tdb_context *tdb);
 
 /* Serialize db expand. */
-int tdb_lock_expand(struct tdb_context *tdb, int ltype);
+enum TDB_ERROR tdb_lock_expand(struct tdb_context *tdb, int ltype);
 void tdb_unlock_expand(struct tdb_context *tdb, int ltype);
 bool tdb_has_expansion_lock(struct tdb_context *tdb);
 
 /* If it needs recovery, grab all the locks and do it. */
-int tdb_lock_and_recover(struct tdb_context *tdb);
-
-/* traverse.c: */
-int first_in_hash(struct tdb_context *tdb, int ltype,
-                 struct traverse_info *tinfo,
-                 TDB_DATA *kbuf, size_t *dlen);
-int next_in_hash(struct tdb_context *tdb, int ltype,
-                struct traverse_info *tinfo,
-                TDB_DATA *kbuf, size_t *dlen);
+enum TDB_ERROR tdb_lock_and_recover(struct tdb_context *tdb);
 
 /* transaction.c: */
 int tdb_transaction_recover(struct tdb_context *tdb);
 bool tdb_needs_recovery(struct tdb_context *tdb);
 
 /* tdb.c: */
-void COLD tdb_logerr(struct tdb_context *tdb,
-                    enum TDB_ERROR ecode,
-                    enum tdb_debug_level level,
-                    const char *fmt, ...);
+enum TDB_ERROR COLD tdb_logerr(struct tdb_context *tdb,
+                              enum TDB_ERROR ecode,
+                              enum tdb_log_level level,
+                              const char *fmt, ...);
 
 #ifdef TDB_TRACE
 void tdb_trace(struct tdb_context *tdb, const char *op);