123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- #include "volksdata/store.h"
- #define ENTRY(a, b) case VOLK_STORE_##a: return &b;
- const VOLK_StoreInt *
- VOLK_store_int (VOLK_StoreType type) {
- switch (type) {
- BACKEND_TBL
- default: return NULL;
- }
- }
- #undef ENTRY
- const char *
- VOLK_store_type_label (VOLK_StoreType type)
- {
- #define ENTRY(a, b) case VOLK_STORE_##a: return "STORE_" #a;
- switch (type) {
- BACKEND_TBL
- default: return "";
- }
- #undef ENTRY
- }
- VOLK_Store *
- VOLK_store_new (
- const VOLK_StoreType store_type, const char *store_id, size_t size,
- bool clear)
- {
- if (UNLIKELY (!VOLK_IS_INIT)) {
- log_error (
- "Environment is not initialized. Did you call VOLK_init()?");
- return NULL;
- }
- const VOLK_StoreInt *sif = VOLK_store_int (store_type);
- if (UNLIKELY (!sif)) {
- log_error ("Not a valid store type: %d", store_type);
- return NULL;
- }
- VOLK_Store *store;
- MALLOC_GUARD (store, NULL);
- store->type = store_type;
- store->sif = sif;
- store->id = store_id ? strdup (store_id) : NULL;
- if (store->sif->setup_fn)
- PCHECK (store->sif->setup_fn (store_id, clear), fail);
- // TODO implement custom default context.
- store->data = store->sif->new_fn (store_id, size);
- return store;
- fail:
- free (store->id);
- free (store);
- return NULL;
- }
- void
- VOLK_store_free (VOLK_Store *store)
- {
- if (UNLIKELY (!store)) return;
- store->sif->free_fn (store->data);
- if (store->id) free (store->id);
- free (store);
- }
- size_t
- VOLK_store_size (const VOLK_Store *store)
- { return store->sif->size_fn (store->data); }
- VOLK_StoreFeature
- VOLK_store_features (const VOLK_Store *store)
- { return store->sif->features; }
- char *
- VOLK_store_id (const VOLK_Store *store)
- { return store->sif->id_fn (store->data); }
- VOLK_rc
- VOLK_store_begin (VOLK_Store *store, int flags, void **txn) {
- if (UNLIKELY (!(store->sif->features & VOLK_STORE_TXN)))
- return VOLK_NOT_IMPL_ERR;
- return store->sif->txn_begin_fn (store->data, flags, txn);
- }
- VOLK_rc
- VOLK_store_commit (VOLK_Store *store, void *txn)
- {
- if (UNLIKELY (!(store->sif->features & VOLK_STORE_TXN)))
- return VOLK_NOT_IMPL_ERR;
- return store->sif->txn_commit_fn (txn);
- }
- void
- VOLK_store_abort (VOLK_Store *store, void *txn)
- {
- if (UNLIKELY (!(store->sif->features & VOLK_STORE_TXN))) return;
- store->sif->txn_abort_fn (txn);
- }
- VOLK_rc
- VOLK_store_update_ctx_txn (
- VOLK_Store *store, void *txn, const VOLK_Buffer *old_c,
- const VOLK_Buffer *new_c)
- {
- // TODO Handle txn better for non-txn stores.
- if (UNLIKELY (!(store->sif->features & VOLK_STORE_CTX)))
- return VOLK_NOT_IMPL_ERR;
- return store->sif->update_ctx_fn (store->data, old_c, new_c, txn);
- }
- void *
- VOLK_store_add_init_txn (
- VOLK_Store *store, void *txn, const VOLK_Buffer *sc)
- // TODO Handle txn better for non-txn stores.
- { return store->sif->add_init_fn (store->data, sc, txn); }
- VOLK_rc
- VOLK_store_add_iter (
- VOLK_Store *store, void *it, const VOLK_BufferTriple *sspo)
- { return store->sif->add_iter_fn (it, sspo); }
- void
- VOLK_store_add_abort (VOLK_Store *store, void *it)
- {
- if (
- UNLIKELY (!(store->sif->features & VOLK_STORE_TXN)) ||
- UNLIKELY (!store->sif->add_abort_fn)
- ) return;
- store->sif->add_abort_fn (it);
- }
- VOLK_rc
- VOLK_store_add_done (VOLK_Store *store, void *it)
- { return store->sif->add_done_fn (it); }
- VOLK_rc
- VOLK_store_add_term_txn (VOLK_Store *store, void *txn, VOLK_Buffer *sterm)
- { return store->sif->add_term_fn (store, sterm, txn); }
- 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)
- {
- if (UNLIKELY (!(store->sif->features & VOLK_STORE_CTX)) && sc) {
- log_warn (
- "Store does not support contexts. Ignoring passed context.");
- sc = NULL;
- }
- return store->sif->lookup_fn (store->data, ss, sp, so, sc, txn, ct); }
- VOLK_rc VOLK_store_iter_next (
- VOLK_Store *store, void *it, VOLK_BufferTriple *sspo,
- VOLK_Buffer **ctx)
- {
- if (UNLIKELY (!(store->sif->features & VOLK_STORE_CTX)) && ctx) {
- log_warn (
- "Store does not support contexts. Ignoring passed context.");
- ctx = NULL;
- }
- return store->sif->lu_next_fn (it, sspo, ctx);
- }
- void
- VOLK_store_iter_free (VOLK_Store *store, void *it)
- { store->sif->lu_free_fn (it); }
- void *
- VOLK_store_iter_txn (const VOLK_Store *store, void *it)
- {
- if (UNLIKELY (!(store->sif->features & VOLK_STORE_TXN))) {
- log_warn ("Store does not support transactions.");
- return NULL;
- }
- return store->sif->iter_txn_fn (it);
- }
- 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)
- { return store->sif->remove_fn (store->data, ss, sp, so, sc, txn, ct); }
- VOLK_Buffer **
- VOLK_store_ctx_list_txn (VOLK_Store *store, void *txn)
- {
- if (UNLIKELY (!(store->sif->features & VOLK_STORE_CTX))) {
- log_error ("Store does not support contexts.");
- return NULL;
- }
- return store->sif->ctx_list_fn (store->data, txn);
- }
|