NeoMutt  2024-03-23-23-gec7045
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
kc.c
Go to the documentation of this file.
1
31#include "config.h"
32#include <kclangc.h>
33#include <stdio.h>
34#include "mutt/lib.h"
35#include "lib.h"
36
40static StoreHandle *store_kyotocabinet_open(const char *path)
41{
42 if (!path)
43 return NULL;
44
45 KCDB *db = kcdbnew();
46 if (!db)
47 return NULL;
48
49 struct Buffer kcdbpath = buf_make(1024);
50
51 buf_printf(&kcdbpath, "%s#type=kct#opts=l#rcomp=lex", path);
52
53 if (!kcdbopen(db, buf_string(&kcdbpath), KCOWRITER | KCOCREATE))
54 {
55 int ecode = kcdbecode(db);
56 mutt_debug(LL_DEBUG2, "kcdbopen failed for %s: %s (ecode %d)\n",
57 buf_string(&kcdbpath), kcdbemsg(db), ecode);
58 kcdbdel(db);
59 db = NULL;
60 }
61
62 buf_dealloc(&kcdbpath);
63 // Return an opaque pointer
64 return (StoreHandle *) db;
65}
66
70static void *store_kyotocabinet_fetch(StoreHandle *store, const char *key,
71 size_t klen, size_t *vlen)
72{
73 if (!store)
74 return NULL;
75
76 // Decloak an opaque pointer
77 KCDB *db = store;
78 return kcdbget(db, key, klen, vlen);
79}
80
84static void store_kyotocabinet_free(StoreHandle *store, void **ptr)
85{
86 if (!ptr || !*ptr)
87 return;
88
89 kcfree(*ptr);
90 *ptr = NULL;
91}
92
96static int store_kyotocabinet_store(StoreHandle *store, const char *key,
97 size_t klen, void *value, size_t vlen)
98{
99 if (!store)
100 return -1;
101
102 // Decloak an opaque pointer
103 KCDB *db = store;
104 if (!kcdbset(db, key, klen, value, vlen))
105 {
106 int ecode = kcdbecode(db);
107 return ecode ? ecode : -1;
108 }
109 return 0;
110}
111
115static int store_kyotocabinet_delete_record(StoreHandle *store, const char *key, size_t klen)
116{
117 if (!store)
118 return -1;
119
120 // Decloak an opaque pointer
121 KCDB *db = store;
122 if (!kcdbremove(db, key, klen))
123 {
124 int ecode = kcdbecode(db);
125 return ecode ? ecode : -1;
126 }
127 return 0;
128}
129
134{
135 if (!ptr || !*ptr)
136 return;
137
138 // Decloak an opaque pointer
139 KCDB *db = *ptr;
140 if (!kcdbclose(db))
141 {
142 int ecode = kcdbecode(db);
143 mutt_debug(LL_DEBUG2, "kcdbclose failed: %s (ecode %d)\n", kcdbemsg(db), ecode);
144 }
145 kcdbdel(db);
146 *ptr = NULL;
147}
148
152static const char *store_kyotocabinet_version(void)
153{
154 static char version_cache[128] = { 0 };
155 if (version_cache[0] == '\0')
156 snprintf(version_cache, sizeof(version_cache), "kyotocabinet %s", KCVERSION);
157
158 return version_cache;
159}
160
161STORE_BACKEND_OPS(kyotocabinet)
int buf_printf(struct Buffer *buf, const char *fmt,...)
Format a string overwriting a Buffer.
Definition: buffer.c:178
void buf_dealloc(struct Buffer *buf)
Release the memory allocated by a buffer.
Definition: buffer.c:394
struct Buffer buf_make(size_t size)
Make a new buffer on the stack.
Definition: buffer.c:75
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
Definition: buffer.h:97
#define mutt_debug(LEVEL,...)
Definition: logging2.h:89
static void store_kyotocabinet_close(StoreHandle **ptr)
Close a Store connection - Implements StoreOps::close() -.
Definition: kc.c:133
static int store_kyotocabinet_delete_record(StoreHandle *store, const char *key, size_t klen)
Delete a record from the Store - Implements StoreOps::delete_record() -.
Definition: kc.c:115
static void * store_kyotocabinet_fetch(StoreHandle *store, const char *key, size_t klen, size_t *vlen)
Fetch a Value from the Store - Implements StoreOps::fetch() -.
Definition: kc.c:70
static void store_kyotocabinet_free(StoreHandle *store, void **ptr)
Free a Value returned by fetch() - Implements StoreOps::free() -.
Definition: kc.c:84
static StoreHandle * store_kyotocabinet_open(const char *path)
Open a connection to a Store - Implements StoreOps::open() -.
Definition: kc.c:40
static int store_kyotocabinet_store(StoreHandle *store, const char *key, size_t klen, void *value, size_t vlen)
Write a Value to the Store - Implements StoreOps::store() -.
Definition: kc.c:96
static const char * store_kyotocabinet_version(void)
Get a Store version string - Implements StoreOps::version() -.
Definition: kc.c:152
@ LL_DEBUG2
Log at debug level 2.
Definition: logging2.h:44
Convenience wrapper for the library headers.
Key value store.
void StoreHandle
Opaque type for store backend.
Definition: lib.h:61
#define STORE_BACKEND_OPS(_name)
Definition: lib.h:162
String manipulation buffer.
Definition: buffer.h:36