Volksdata 1.0b7
RDF library
Loading...
Searching...
No Matches
store.c
Go to the documentation of this file.
1#include "volksdata/store.h"
2
3
4#define ENTRY(a, b) case VOLK_STORE_##a: return &b;
5const VOLK_StoreInt *
7 switch (type) {
9 default: return NULL;
10 }
11}
12#undef ENTRY
13
14
15const char *
17{
18#define ENTRY(a, b) case VOLK_STORE_##a: return "STORE_" #a;
19 switch (type) {
21 default: return "";
22 }
23#undef ENTRY
24}
25
26
29 const VOLK_StoreType store_type, const char *store_id, size_t size,
30 bool clear)
31{
33 log_error (
34 "Environment is not initialized. Did you call VOLK_init()?");
35 return NULL;
36 }
37 const VOLK_StoreInt *sif = VOLK_store_int (store_type);
38 if (UNLIKELY (!sif)) {
39 log_error ("Not a valid store type: %d", store_type);
40 return NULL;
41 }
42
43 VOLK_Store *store;
44 MALLOC_GUARD (store, NULL);
45
46 store->type = store_type;
47 store->sif = sif;
48
49 if (store->sif->setup_fn)
50 PCHECK (store->sif->setup_fn (store_id, clear), fail);
51
52 // TODO implement custom default context.
53 store->data = store->sif->new_fn (store_id, size);
54 NLCHECK (store->data, fail);
55
56 if (store->sif->id_fn) store->id = store->sif->id_fn (store->data);
57 else store->id = store_id ? strdup (store_id) : NULL;
58
59 return store;
60
61fail:
62 free (store);
63
64 return NULL;
65}
66
67
68void
70{
71 if (UNLIKELY (!store)) return;
72 LOG_DEBUG ("Freeing store @%p", store);
73
74 store->sif->free_fn (store->data);
75 if (store->id) free (store->id);
76 free (store);
77}
78
79
80size_t
82{ return store->sif->size_fn (store->data); }
83
84
87{ return store->sif->features; }
88
89
90char *
92{ return store->sif->id_fn (store->data); }
93
94
96VOLK_store_begin (VOLK_Store *store, int flags, void **txn) {
97 if (UNLIKELY (!(store->sif->features & VOLK_STORE_TXN)))
98 return VOLK_NOT_IMPL_ERR;
99
100 return store->sif->txn_begin_fn (store->data, flags, txn);
101}
102
103
105VOLK_store_commit (VOLK_Store *store, void *txn)
106{
107 if (UNLIKELY (!(store->sif->features & VOLK_STORE_TXN)))
108 return VOLK_NOT_IMPL_ERR;
109
110 return store->sif->txn_commit_fn (txn);
111}
112
113
114void
115VOLK_store_abort (VOLK_Store *store, void *txn)
116{
117 if (UNLIKELY (!(store->sif->features & VOLK_STORE_TXN))) return;
118
119 store->sif->txn_abort_fn (txn);
120}
121
122
125 VOLK_Store *store, void *txn, const VOLK_Buffer *old_c,
126 const VOLK_Buffer *new_c)
127{
128 // TODO Handle txn better for non-txn stores.
129 if (UNLIKELY (!(store->sif->features & VOLK_STORE_CTX)))
130 return VOLK_NOT_IMPL_ERR;
131
132 return store->sif->update_ctx_fn (store->data, old_c, new_c, txn);
133}
134
135
136void *
138 VOLK_Store *store, void *txn, const VOLK_Buffer *sc)
139 // TODO Handle txn better for non-txn stores.
140{ return store->sif->add_init_fn (store->data, sc, txn); }
141
142
145 VOLK_Store *store, void *it, const VOLK_BufferTriple *sspo)
146{ return store->sif->add_iter_fn (it, sspo); }
147
148
149void
151{
152 if (
153 UNLIKELY (!(store->sif->features & VOLK_STORE_TXN)) ||
154 UNLIKELY (!store->sif->add_abort_fn)
155 ) return;
156
157 store->sif->add_abort_fn (it);
158}
159
160
163{ return store->sif->add_done_fn (it); }
164
165
168{ return store->sif->add_term_fn (store, sterm, txn); }
169
170
171void *
173 const VOLK_Store *store, void *txn,
174 const VOLK_Buffer *ss, const VOLK_Buffer *sp, const VOLK_Buffer *so,
175 const VOLK_Buffer *sc, size_t *ct)
176{
177 if (UNLIKELY (!(store->sif->features & VOLK_STORE_CTX)) && sc) {
178 log_warn (
179 "Store does not support contexts. Ignoring passed context.");
180 sc = NULL;
181 }
182
183 return store->sif->lookup_fn (store->data, ss, sp, so, sc, txn, ct); }
184
185
187 VOLK_Store *store, void *it, VOLK_BufferTriple *sspo,
188 VOLK_Buffer **ctx)
189{
190 if (UNLIKELY (!(store->sif->features & VOLK_STORE_CTX)) && ctx) {
191 log_warn (
192 "Store does not support contexts. Ignoring passed context.");
193 ctx = NULL;
194 }
195
196 return store->sif->lu_next_fn (it, sspo, ctx);
197}
198
199
200void
202{ store->sif->lu_free_fn (it); }
203
204
205void *
206VOLK_store_iter_txn (const VOLK_Store *store, void *it)
207{
208 if (UNLIKELY (!(store->sif->features & VOLK_STORE_TXN))) {
209 log_warn ("Store does not support transactions.");
210 return NULL;
211 }
212
213 return store->sif->iter_txn_fn (it);
214}
215
216
219 VOLK_Store *store, void *txn,
220 const VOLK_Buffer *ss, const VOLK_Buffer *sp, const VOLK_Buffer *so,
221 const VOLK_Buffer *sc, size_t *ct)
222{ return store->sif->remove_fn (store->data, ss, sp, so, sc, txn, ct); }
223
224
227{
228 if (UNLIKELY (!(store->sif->features & VOLK_STORE_CTX))) {
229 log_error ("Store does not support contexts.");
230 return NULL;
231 }
232
233 return store->sif->ctx_list_fn (store->data, txn);
234}
#define UNLIKELY(x)
Definition core.h:39
bool VOLK_env_is_init
Whether the environment is initialized.
Definition core.c:11
#define MALLOC_GUARD(var, rc)
Allocate one pointer with malloc and return rc if it fails.
Definition core.h:375
#define NLCHECK(exp, marker)
Log error and jump to marker if exp is NULL.
Definition core.h:315
#define PCHECK(exp, marker)
Jump to marker if exp returns a negative value (skip warnings).
Definition core.h:303
char * strdup(const char *src)
Replacement for GNU strdup.
Definition core.c:109
#define LOG_DEBUG(...)
Definition core.h:275
int VOLK_rc
Definition core.h:79
#define VOLK_NOT_IMPL_ERR
Functionality is not implemented.
Definition core.h:138
VOLK_StoreFeature
Store feature flags.
@ VOLK_STORE_TXN
Supports transaction handling.
@ VOLK_STORE_CTX
VOLK_rc VOLK_store_begin(VOLK_Store *store, int flags, void **txn)
Begin a transaction.
Definition store.c:96
void * VOLK_store_add_init_txn(VOLK_Store *store, void *txn, const VOLK_Buffer *sc)
Initialize bulk triple load.
Definition store.c:137
VOLK_rc VOLK_store_add_done(VOLK_Store *store, void *it)
Finalize an add loop and free iterator.
Definition store.c:162
void VOLK_store_add_abort(VOLK_Store *store, void *it)
Abort an add loop and free iterator.
Definition store.c:150
const VOLK_StoreInt * VOLK_store_int(VOLK_StoreType type)
Return store interface for a specific type.
Definition store.c:6
VOLK_rc VOLK_store_add_iter(VOLK_Store *store, void *it, const VOLK_BufferTriple *sspo)
Add one triple into the store.
Definition store.c:144
VOLK_StoreFeature VOLK_store_features(const VOLK_Store *store)
Feature flags belonging to the store interface.
Definition store.c:86
VOLK_rc VOLK_store_add_term_txn(VOLK_Store *store, void *txn, VOLK_Buffer *sterm)
Add a single term to the store.
Definition store.c:167
void * VOLK_store_lookup_txn(const VOLK_Store *store, void *txn, const VOLK_Buffer *ss, const VOLK_Buffer *sp, const VOLK_Buffer *so, const VOLK_Buffer *sc, size_t *ct)
Look up triples by pattern matching.
Definition store.c:172
VOLK_rc VOLK_store_iter_next(VOLK_Store *store, void *it, VOLK_BufferTriple *sspo, VOLK_Buffer **ctx)
Yield the matching triples and advance the iterator.
Definition store.c:186
char * VOLK_store_id(const VOLK_Store *store)
Store identifier.
Definition store.c:91
VOLK_Buffer ** VOLK_store_ctx_list_txn(VOLK_Store *store, void *txn)
get index of all graph (context) URIs in a store.
Definition store.c:226
VOLK_StoreType
Store types. All prefixed with VOLK_STORE_.
Definition store.h:39
void VOLK_store_iter_free(VOLK_Store *store, void *it)
Free an iterator allocated by a lookup.
Definition store.c:201
const char * VOLK_store_type_label(VOLK_StoreType type)
Return the store type label.
Definition store.c:16
size_t VOLK_store_size(const VOLK_Store *store)
Store size in triples.
Definition store.c:81
VOLK_Store * VOLK_store_new(const VOLK_StoreType store_type, const char *store_id, size_t size, bool clear)
Create a new store.
Definition store.c:28
void * VOLK_store_iter_txn(const VOLK_Store *store, void *it)
Get iterator active transaction handle.
Definition store.c:206
VOLK_rc VOLK_store_commit(VOLK_Store *store, void *txn)
Commit a transaction.
Definition store.c:105
VOLK_rc VOLK_store_remove_txn(VOLK_Store *store, void *txn, const VOLK_Buffer *ss, const VOLK_Buffer *sp, const VOLK_Buffer *so, const VOLK_Buffer *sc, size_t *ct)
Delete triples by pattern matching.
Definition store.c:218
void VOLK_store_abort(VOLK_Store *store, void *txn)
Abort (roll back) a transaction.
Definition store.c:115
void VOLK_store_free(VOLK_Store *store)
Free a store created with VOLK_store_new().
Definition store.c:69
VOLK_rc VOLK_store_update_ctx_txn(VOLK_Store *store, void *txn, const VOLK_Buffer *old_c, const VOLK_Buffer *new_c)
Update the context of triples in a context-aware store.
Definition store.c:124
#define BACKEND_TBL
Definition store.h:32
Generic store dependency.
Triple of byte buffers.
Definition buffer.h:60
General-purpose data buffer.
Definition buffer.h:47
Store interface.
store_size_fn_t size_fn
Number of triples in the store.
VOLK_StoreFeature features
Feature flags.
store_txn_abort_fn_t txn_abort_fn
Abort transaction.
store_new_fn_t new_fn
Create a new store instance.
iter_free_fn_t lu_free_fn
Free the lookup iterator.
store_txn_commit_fn_t txn_commit_fn
Commit transaction.
store_remove_fn_t remove_fn
Remove triples by pattern.
store_add_abort_fn_t add_abort_fn
store_add_iter_fn_t add_iter_fn
Add one triple.
store_add_term_fn_t add_term_fn
store_update_ctx_fn_t update_ctx_fn
store_free_fn_t free_fn
Free the store.
store_txn_begin_fn_t txn_begin_fn
Begin transaction.
store_setup_fn_t setup_fn
Called before store_new_fn_t.
store_ctx_list_fn_t ctx_list_fn
store_add_init_fn_t add_init_fn
Initialize add iteration.
iter_txn_fn_t iter_txn_fn
Get iterator's transaction.
iter_next_fn_t lu_next_fn
Advance the lookup iterator.
store_id_fn_t id_fn
Get store ID.
store_lookup_fn_t lookup_fn
Look up triples by pattern. 
store_add_done_fn_t add_done_fn
Complete the add process.
Store structure.
Definition store.h:59
void * data
Store back end data.
Definition store.h:67
char * id
Definition store.h:61
const VOLK_StoreInt * sif
Store interface.
Definition store.h:66
VOLK_StoreType type
Store type.
Definition store.h:60