summaryrefslogtreecommitdiffstats
path: root/hcache.c
diff options
context:
space:
mode:
authorEmanuele Giaquinta <e.giaquinta@glauco.it>2008-09-25 15:07:16 -0700
committerEmanuele Giaquinta <e.giaquinta@glauco.it>2008-09-25 15:07:16 -0700
commit7fedd3e902e7aec814d2c966b02ff6d52cb29233 (patch)
tree63b10565f57ad8f237436e09cbfe95a1ab4b33cb /hcache.c
parentc8aead4e6d2f54e40def5c339d31f1867e1f915a (diff)
Support tokyocabinet (successor to qdbm). Closes #3112
Diffstat (limited to 'hcache.c')
-rw-r--r--hcache.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/hcache.c b/hcache.c
index 2a988f5f..1184e97a 100644
--- a/hcache.c
+++ b/hcache.c
@@ -26,6 +26,8 @@
#include <depot.h>
#include <cabin.h>
#include <villa.h>
+#elif HAVE_TC
+#include <tcbdb.h>
#elif HAVE_GDBM
#include <gdbm.h>
#elif HAVE_DB4
@@ -55,6 +57,13 @@ static struct header_cache
char *folder;
unsigned int crc;
} HEADER_CACHE;
+#elif HAVE_TC
+static struct header_cache
+{
+ TCBDB *db;
+ char *folder;
+ unsigned int crc;
+} HEADER_CACHE;
#elif HAVE_GDBM
static struct header_cache
{
@@ -701,6 +710,9 @@ mutt_hcache_fetch_raw (header_cache_t *h, const char *filename,
#endif
#ifdef HAVE_QDBM
char *data = NULL;
+#elif HAVE_TC
+ void *data;
+ int sp;
#elif HAVE_GDBM
datum key;
datum data;
@@ -733,6 +745,10 @@ mutt_hcache_fetch_raw (header_cache_t *h, const char *filename,
data = vlget(h->db, path, ksize, NULL);
return data;
+#elif HAVE_TC
+ data = tcbdbget(h->db, path, ksize, &sp);
+
+ return data;
#elif HAVE_GDBM
key.dptr = path;
key.dsize = ksize;
@@ -803,6 +819,8 @@ mutt_hcache_store_raw (header_cache_t* h, const char* filename, void* data,
#endif
#if HAVE_QDBM
return vlput(h->db, path, ksize, data, dlen, VL_DOVER);
+#elif HAVE_TC
+ return tcbdbput(h->db, path, ksize, data, dlen);
#elif HAVE_GDBM
key.dptr = path;
key.dsize = ksize;
@@ -876,6 +894,52 @@ mutt_hcache_delete(header_cache_t *h, const char *filename,
return vlout(h->db, path, ksize);
}
+#elif HAVE_TC
+static int
+hcache_open_tc (struct header_cache* h, const char* path)
+{
+ h->db = tcbdbnew();
+ if (option(OPTHCACHECOMPRESS))
+ tcbdbtune(h->db, 0, 0, 0, -1, -1, BDBTDEFLATE);
+ if (tcbdbopen(h->db, path, BDBOWRITER | BDBOCREAT))
+ return 0;
+ else
+ {
+ tcbdbdel(h->db);
+ return -1;
+ }
+}
+
+void
+mutt_hcache_close(header_cache_t *h)
+{
+ if (!h)
+ return;
+
+ tcbdbclose(h->db);
+ tcbdbdel(h->db);
+ FREE(&h->folder);
+ FREE(&h);
+}
+
+int
+mutt_hcache_delete(header_cache_t *h, const char *filename,
+ size_t(*keylen) (const char *fn))
+{
+ char path[_POSIX_PATH_MAX];
+ int ksize;
+
+ if (!h)
+ return -1;
+
+ strncpy(path, h->folder, sizeof (path));
+ safe_strcat(path, sizeof (path), filename);
+
+ ksize = strlen(h->folder) + keylen(path + strlen(h->folder));
+
+ return tcbdbout(h->db, path, ksize);
+}
+
#elif HAVE_GDBM
static int
hcache_open_gdbm (struct header_cache* h, const char* path)
@@ -1039,6 +1103,8 @@ mutt_hcache_open(const char *path, const char *folder, hcache_namer_t namer)
#if HAVE_QDBM
hcache_open = hcache_open_qdbm;
+#elif HAVE_TC
+ hcache_open= hcache_open_tc;
#elif HAVE_GDBM
hcache_open = hcache_open_gdbm;
#elif HAVE_DB4
@@ -1090,4 +1156,9 @@ const char *mutt_hcache_backend (void)
{
return "qdbm " _QDBM_VERSION;
}
+#elif HAVE_TC
+const char *mutt_hcache_backend (void)
+{
+ return "tokyocabinet " _TC_VERSION;
+}
#endif