diff options
author | Emanuele Giaquinta <e.giaquinta@glauco.it> | 2008-09-25 15:07:16 -0700 |
---|---|---|
committer | Emanuele Giaquinta <e.giaquinta@glauco.it> | 2008-09-25 15:07:16 -0700 |
commit | 7fedd3e902e7aec814d2c966b02ff6d52cb29233 (patch) | |
tree | 63b10565f57ad8f237436e09cbfe95a1ab4b33cb /hcache.c | |
parent | c8aead4e6d2f54e40def5c339d31f1867e1f915a (diff) |
Support tokyocabinet (successor to qdbm). Closes #3112
Diffstat (limited to 'hcache.c')
-rw-r--r-- | hcache.c | 71 |
1 files changed, 71 insertions, 0 deletions
@@ -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 |