NeoMutt  2024-03-23-23-gec7045
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
rocksdb.c
Go to the documentation of this file.
1
31#include "config.h"
32#include <stddef.h>
33#include <rocksdb/c.h>
34#include "mutt/lib.h"
35#include "lib.h"
36
41{
42 rocksdb_t *db;
43 rocksdb_options_t *options;
44 rocksdb_readoptions_t *read_options;
45 rocksdb_writeoptions_t *write_options;
46 char *err;
47};
48
53static void rocksdb_sdata_free(struct RocksDbStoreData **ptr)
54{
55 if (!ptr || !*ptr)
56 return;
57
58 struct RocksDbStoreData *sdata = *ptr;
59 FREE(&sdata->err);
60
61 FREE(ptr);
62}
63
69{
70 return mutt_mem_calloc(1, sizeof(struct RocksDbStoreData));
71}
72
76static StoreHandle *store_rocksdb_open(const char *path)
77{
78 if (!path)
79 return NULL;
80
81 struct RocksDbStoreData *sdata = rocksdb_sdata_new();
82
83 /* RocksDB stores errors in form of strings */
84 sdata->err = NULL;
85
86 /* setup generic options, create new db and limit log to one file */
87 sdata->options = rocksdb_options_create();
88 rocksdb_options_set_create_if_missing(sdata->options, 1);
89 rocksdb_options_set_keep_log_file_num(sdata->options, 1);
90
91 /* setup read options, we verify with checksums */
92 sdata->read_options = rocksdb_readoptions_create();
93 rocksdb_readoptions_set_verify_checksums(sdata->read_options, 1);
94
95 /* setup write options, no sync needed, disable WAL */
96 sdata->write_options = rocksdb_writeoptions_create();
97 rocksdb_writeoptions_set_sync(sdata->write_options, 0);
98 rocksdb_writeoptions_disable_WAL(sdata->write_options, 1);
99
100 rocksdb_options_set_compression(sdata->options, rocksdb_no_compression);
101
102 /* open database and check for error in sdata->error */
103 sdata->db = rocksdb_open(sdata->options, path, &sdata->err);
104 if (sdata->err)
105 {
106 rocksdb_options_destroy(sdata->options);
107 rocksdb_readoptions_destroy(sdata->read_options);
108 rocksdb_writeoptions_destroy(sdata->write_options);
109 rocksdb_sdata_free(&sdata);
110 return NULL;
111 }
112
113 // Return an opaque pointer
114 return (StoreHandle *) sdata;
115}
116
120static void *store_rocksdb_fetch(StoreHandle *store, const char *key, size_t klen, size_t *vlen)
121{
122 if (!store)
123 return NULL;
124
125 // Decloak an opaque pointer
126 struct RocksDbStoreData *sdata = store;
127
128 void *rv = rocksdb_get(sdata->db, sdata->read_options, key, klen, vlen, &sdata->err);
129 if (sdata->err)
130 {
131 rocksdb_free(sdata->err);
132 sdata->err = NULL;
133 return NULL;
134 }
135
136 return rv;
137}
138
142static void store_rocksdb_free(StoreHandle *store, void **ptr)
143{
144 FREE(ptr);
145}
146
150static int store_rocksdb_store(StoreHandle *store, const char *key, size_t klen,
151 void *value, size_t vlen)
152{
153 if (!store)
154 return -1;
155
156 // Decloak an opaque pointer
157 struct RocksDbStoreData *sdata = store;
158
159 rocksdb_put(sdata->db, sdata->write_options, key, klen, value, vlen, &sdata->err);
160 if (sdata->err)
161 {
162 rocksdb_free(sdata->err);
163 sdata->err = NULL;
164 return -1;
165 }
166
167 return 0;
168}
169
173static int store_rocksdb_delete_record(StoreHandle *store, const char *key, size_t klen)
174{
175 if (!store)
176 return -1;
177
178 // Decloak an opaque pointer
179 struct RocksDbStoreData *sdata = store;
180
181 rocksdb_delete(sdata->db, sdata->write_options, key, klen, &sdata->err);
182 if (sdata->err)
183 {
184 rocksdb_free(sdata->err);
185 sdata->err = NULL;
186 return -1;
187 }
188
189 return 0;
190}
191
196{
197 if (!ptr || !*ptr)
198 return;
199
200 // Decloak an opaque pointer
201 struct RocksDbStoreData *sdata = *ptr;
202
203 /* close database and free resources */
204 rocksdb_close(sdata->db);
205 rocksdb_options_destroy(sdata->options);
206 rocksdb_readoptions_destroy(sdata->read_options);
207 rocksdb_writeoptions_destroy(sdata->write_options);
208
209 rocksdb_sdata_free((struct RocksDbStoreData **) ptr);
210}
211
215static const char *store_rocksdb_version(void)
216{
217/* return sth. like "RocksDB 6.7.3" */
218#define RDBVER(major, minor, patch) #major "." #minor "." #patch
219 return "RocksDB " RDBVER(ROCKSDB_MAJOR, ROCKSDB_MINOR, ROCKSDB_PATCH);
220}
221
222STORE_BACKEND_OPS(rocksdb)
static void store_rocksdb_close(StoreHandle **ptr)
Close a Store connection - Implements StoreOps::close() -.
Definition: rocksdb.c:195
static int store_rocksdb_delete_record(StoreHandle *store, const char *key, size_t klen)
Delete a record from the Store - Implements StoreOps::delete_record() -.
Definition: rocksdb.c:173
static void * store_rocksdb_fetch(StoreHandle *store, const char *key, size_t klen, size_t *vlen)
Fetch a Value from the Store - Implements StoreOps::fetch() -.
Definition: rocksdb.c:120
static void store_rocksdb_free(StoreHandle *store, void **ptr)
Free a Value returned by fetch() - Implements StoreOps::free() -.
Definition: rocksdb.c:142
static StoreHandle * store_rocksdb_open(const char *path)
Open a connection to a Store - Implements StoreOps::open() -.
Definition: rocksdb.c:76
static int store_rocksdb_store(StoreHandle *store, const char *key, size_t klen, void *value, size_t vlen)
Write a Value to the Store - Implements StoreOps::store() -.
Definition: rocksdb.c:150
static const char * store_rocksdb_version(void)
Get a Store version string - Implements StoreOps::version() -.
Definition: rocksdb.c:215
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:50
#define FREE(x)
Definition: memory.h:45
Convenience wrapper for the library headers.
static struct RocksDbStoreData * rocksdb_sdata_new(void)
Create new RocksDb Store Data.
Definition: rocksdb.c:68
#define RDBVER(major, minor, patch)
static void rocksdb_sdata_free(struct RocksDbStoreData **ptr)
Free RocksDb Store Data.
Definition: rocksdb.c:53
Key value store.
void StoreHandle
Opaque type for store backend.
Definition: lib.h:61
#define STORE_BACKEND_OPS(_name)
Definition: lib.h:162
RocksDB store.
Definition: rocksdb.c:41
rocksdb_options_t * options
Definition: rocksdb.c:43
rocksdb_t * db
Definition: rocksdb.c:42
rocksdb_readoptions_t * read_options
Definition: rocksdb.c:44
rocksdb_writeoptions_t * write_options
Definition: rocksdb.c:45
char * err
Definition: rocksdb.c:46