NeoMutt  2024-03-23-23-gec7045
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
gdbm.c
Go to the documentation of this file.
1
31#include "config.h"
32#include <stddef.h>
33#include <gdbm.h>
34#include <limits.h>
35#include "mutt/lib.h"
36#include "lib.h"
37
41static StoreHandle *store_gdbm_open(const char *path)
42{
43 if (!path)
44 return NULL;
45
46 const int pagesize = 4096;
47
48 GDBM_FILE db = gdbm_open((char *) path, pagesize, GDBM_WRCREAT, 00600, NULL);
49 if (!db)
50 {
51 /* if rw failed try ro */
52 db = gdbm_open((char *) path, pagesize, GDBM_READER, 00600, NULL);
53 }
54
55 // Return an opaque pointer
56 return (StoreHandle *) db;
57}
58
62static void *store_gdbm_fetch(StoreHandle *store, const char *key, size_t klen, size_t *vlen)
63{
64 if (!store || (klen > INT_MAX))
65 return NULL;
66
67 datum dkey = { 0 };
68 datum data = { 0 };
69
70 // Decloak an opaque pointer
71 GDBM_FILE db = store;
72
73 dkey.dptr = (char *) key;
74 dkey.dsize = klen;
75 data = gdbm_fetch(db, dkey);
76
77 *vlen = data.dsize;
78 return data.dptr;
79}
80
84static void store_gdbm_free(StoreHandle *store, void **ptr)
85{
86 FREE(ptr);
87}
88
92static int store_gdbm_store(StoreHandle *store, const char *key, size_t klen,
93 void *value, size_t vlen)
94{
95 if (!store || (klen > INT_MAX) || (vlen > INT_MAX))
96 return -1;
97
98 datum dkey = { 0 };
99 datum databuf = { 0 };
100
101 // Decloak an opaque pointer
102 GDBM_FILE db = store;
103
104 dkey.dptr = (char *) key;
105 dkey.dsize = klen;
106
107 databuf.dsize = vlen;
108 databuf.dptr = value;
109
110 return gdbm_store(db, dkey, databuf, GDBM_REPLACE);
111}
112
116static int store_gdbm_delete_record(StoreHandle *store, const char *key, size_t klen)
117{
118 if (!store || (klen > INT_MAX))
119 return -1;
120
121 datum dkey = { 0 };
122
123 // Decloak an opaque pointer
124 GDBM_FILE db = store;
125
126 dkey.dptr = (char *) key;
127 dkey.dsize = klen;
128
129 return gdbm_delete(db, dkey);
130}
131
136{
137 if (!ptr || !*ptr)
138 return;
139
140 // Decloak an opaque pointer
141 GDBM_FILE db = *ptr;
142 gdbm_close(db);
143 *ptr = NULL;
144}
145
149static const char *store_gdbm_version(void)
150{
151 return gdbm_version;
152}
153
static void store_gdbm_close(StoreHandle **ptr)
Close a Store connection - Implements StoreOps::close() -.
Definition: gdbm.c:135
static int store_gdbm_delete_record(StoreHandle *store, const char *key, size_t klen)
Delete a record from the Store - Implements StoreOps::delete_record() -.
Definition: gdbm.c:116
static void * store_gdbm_fetch(StoreHandle *store, const char *key, size_t klen, size_t *vlen)
Fetch a Value from the Store - Implements StoreOps::fetch() -.
Definition: gdbm.c:62
static void store_gdbm_free(StoreHandle *store, void **ptr)
Free a Value returned by fetch() - Implements StoreOps::free() -.
Definition: gdbm.c:84
static StoreHandle * store_gdbm_open(const char *path)
Open a connection to a Store - Implements StoreOps::open() -.
Definition: gdbm.c:41
static int store_gdbm_store(StoreHandle *store, const char *key, size_t klen, void *value, size_t vlen)
Write a Value to the Store - Implements StoreOps::store() -.
Definition: gdbm.c:92
static const char * store_gdbm_version(void)
Get a Store version string - Implements StoreOps::version() -.
Definition: gdbm.c:149
#define FREE(x)
Definition: memory.h:45
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