Volksdata 1.0b10
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, VOLK_StoreFlags 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 if (UNLIKELY (!(store->sif->features & VOLK_STORE_CTX)))
129 return VOLK_NOT_IMPL_ERR;
130
131 return store->sif->update_ctx_fn (store->data, old_c, new_c, txn);
132}
133
134
135void *
137 VOLK_Store *store, void *txn, const VOLK_Buffer *sc)
138{ return store->sif->add_init_fn (store->data, sc, txn); }
139
140
143 VOLK_Store *store, void *it, const VOLK_BufferTriple *sspo)
144{ return store->sif->add_iter_fn (it, sspo); }
145
146
147void
149{
150 if (
151 UNLIKELY (!(store->sif->features & VOLK_STORE_TXN)) ||
152 UNLIKELY (!store->sif->add_abort_fn)
153 ) return;
154
155 store->sif->add_abort_fn (it);
156}
157
158
161{ return store->sif->add_done_fn (it); }
162
163
166{ return store->sif->add_term_fn (store->data, sterm, txn); }
167
168
169void *
171 const VOLK_Store *store, void *txn,
172 const VOLK_Buffer *ss, const VOLK_Buffer *sp, const VOLK_Buffer *so,
173 const VOLK_Buffer *sc, size_t *ct)
174{
175 if (UNLIKELY (!(store->sif->features & VOLK_STORE_CTX)) && sc) {
176 log_warn (
177 "Store does not support contexts. Ignoring passed context.");
178 sc = NULL;
179 }
180
181 return store->sif->lookup_fn (store->data, ss, sp, so, sc, txn, ct); }
182
183
185 VOLK_Store *store, void *it, VOLK_BufferTriple *sspo,
186 VOLK_Buffer **ctx)
187{
188 if (UNLIKELY (!(store->sif->features & VOLK_STORE_CTX)) && ctx) {
189 log_warn (
190 "Store does not support contexts. Ignoring passed context.");
191 ctx = NULL;
192 }
193
194 return store->sif->lu_next_fn (it, sspo, ctx);
195}
196
197
198void
200{ store->sif->lu_free_fn (it); }
201
202
203void *
204VOLK_store_iter_txn (const VOLK_Store *store, void *it)
205{
206 if (UNLIKELY (!(store->sif->features & VOLK_STORE_TXN))) {
207 log_warn ("Store does not support transactions.");
208 return NULL;
209 }
210
211 return store->sif->iter_txn_fn (it);
212}
213
214
217 VOLK_Store *store, void *txn,
218 const VOLK_Buffer *ss, const VOLK_Buffer *sp, const VOLK_Buffer *so,
219 const VOLK_Buffer *sc, size_t *ct)
220{ return store->sif->remove_fn (store->data, ss, sp, so, sc, txn, ct); }
221
222
225{
226 if (UNLIKELY (!(store->sif->features & VOLK_STORE_CTX))) {
227 log_error ("Store does not support contexts.");
228 return NULL;
229 }
230
231 return store->sif->ctx_list_fn (store->data, txn);
232}
#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:409
#define NLCHECK(exp, marker)
Log error and jump to marker if exp is NULL.
Definition core.h:337
#define PCHECK(exp, marker)
Jump to marker if exp returns a negative value (skip warnings).
Definition core.h:324
#define log_debug(...)
Definition core.h:294
char * strdup(const char *src)
Replacement for GNU strdup.
Definition core.c:109
int VOLK_rc
Return code.
Definition core.h:91
#define VOLK_NOT_IMPL_ERR
Functionality is not implemented.
Definition core.h:150
void * VOLK_store_add_init_txn(VOLK_Store *store, void *txn, const VOLK_Buffer *sc)
Initialize bulk triple load.
Definition store.c:136
VOLK_rc VOLK_store_add_done(VOLK_Store *store, void *it)
Finalize an add loop and free iterator.
Definition store.c:160
void VOLK_store_add_abort(VOLK_Store *store, void *it)
Abort an add loop and free iterator.
Definition store.c:148
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:142
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:165
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:170
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:184
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:224
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:199
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:204
VOLK_rc VOLK_store_begin(VOLK_Store *store, VOLK_StoreFlags flags, void **txn)
Begin a transaction.
Definition store.c:96
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:216
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
VOLK_StoreFlags
Store flags passed to various operations.
VOLK_StoreFeature
Store feature flags.
@ VOLK_STORE_TXN
Supports transaction handling.
@ VOLK_STORE_CTX
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
Opaque back end data.
Definition store.h:68
char * id
Definition store.h:61
const VOLK_StoreInt * sif
Store interface.
Definition store.h:67
VOLK_StoreType type
Store type.
Definition store.h:60