store.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. #include "volksdata/store.h"
  2. #define ENTRY(a, b) case VOLK_STORE_##a: return &b;
  3. const VOLK_StoreInt *
  4. VOLK_store_int (VOLK_StoreType type) {
  5. switch (type) {
  6. BACKEND_TBL
  7. default: return NULL;
  8. }
  9. }
  10. #undef ENTRY
  11. const char *
  12. VOLK_store_type_label (VOLK_StoreType type)
  13. {
  14. #define ENTRY(a, b) case VOLK_STORE_##a: return "STORE_" #a;
  15. switch (type) {
  16. BACKEND_TBL
  17. default: return "";
  18. }
  19. #undef ENTRY
  20. }
  21. VOLK_Store *
  22. VOLK_store_new (
  23. const VOLK_StoreType store_type, const char *store_id, size_t size,
  24. bool clear)
  25. {
  26. if (UNLIKELY (!VOLK_IS_INIT)) {
  27. log_error (
  28. "Environment is not initialized. Did you call VOLK_init()?");
  29. return NULL;
  30. }
  31. const VOLK_StoreInt *sif = VOLK_store_int (store_type);
  32. if (UNLIKELY (!sif)) {
  33. log_error ("Not a valid store type: %d", store_type);
  34. return NULL;
  35. }
  36. VOLK_Store *store;
  37. MALLOC_GUARD (store, NULL);
  38. store->type = store_type;
  39. store->sif = sif;
  40. store->id = store_id ? strdup (store_id) : NULL;
  41. if (store->sif->setup_fn)
  42. PCHECK (store->sif->setup_fn (store_id, clear), fail);
  43. // TODO implement custom default context.
  44. store->data = store->sif->new_fn (store_id, size);
  45. return store;
  46. fail:
  47. free (store->id);
  48. free (store);
  49. return NULL;
  50. }
  51. void
  52. VOLK_store_free (VOLK_Store *store)
  53. {
  54. if (UNLIKELY (!store)) return;
  55. store->sif->free_fn (store->data);
  56. if (store->id) free (store->id);
  57. free (store);
  58. }
  59. size_t
  60. VOLK_store_size (const VOLK_Store *store)
  61. { return store->sif->size_fn (store->data); }
  62. VOLK_StoreFeature
  63. VOLK_store_features (const VOLK_Store *store)
  64. { return store->sif->features; }
  65. char *
  66. VOLK_store_id (const VOLK_Store *store)
  67. { return store->sif->id_fn (store->data); }
  68. VOLK_rc
  69. VOLK_store_begin (VOLK_Store *store, int flags, void **txn) {
  70. if (UNLIKELY (!(store->sif->features & VOLK_STORE_TXN)))
  71. return VOLK_NOT_IMPL_ERR;
  72. return store->sif->txn_begin_fn (store->data, flags, txn);
  73. }
  74. VOLK_rc
  75. VOLK_store_commit (VOLK_Store *store, void *txn)
  76. {
  77. if (UNLIKELY (!(store->sif->features & VOLK_STORE_TXN)))
  78. return VOLK_NOT_IMPL_ERR;
  79. return store->sif->txn_commit_fn (txn);
  80. }
  81. void
  82. VOLK_store_abort (VOLK_Store *store, void *txn)
  83. {
  84. if (UNLIKELY (!(store->sif->features & VOLK_STORE_TXN))) return;
  85. store->sif->txn_abort_fn (txn);
  86. }
  87. VOLK_rc
  88. VOLK_store_update_ctx_txn (
  89. VOLK_Store *store, void *txn, const VOLK_Buffer *old_c,
  90. const VOLK_Buffer *new_c)
  91. {
  92. // TODO Handle txn better for non-txn stores.
  93. if (UNLIKELY (!(store->sif->features & VOLK_STORE_CTX)))
  94. return VOLK_NOT_IMPL_ERR;
  95. return store->sif->update_ctx_fn (store->data, old_c, new_c, txn);
  96. }
  97. void *
  98. VOLK_store_add_init_txn (
  99. VOLK_Store *store, void *txn, const VOLK_Buffer *sc)
  100. // TODO Handle txn better for non-txn stores.
  101. { return store->sif->add_init_fn (store->data, sc, txn); }
  102. VOLK_rc
  103. VOLK_store_add_iter (
  104. VOLK_Store *store, void *it, const VOLK_BufferTriple *sspo)
  105. { return store->sif->add_iter_fn (it, sspo); }
  106. void
  107. VOLK_store_add_abort (VOLK_Store *store, void *it)
  108. {
  109. if (
  110. UNLIKELY (!(store->sif->features & VOLK_STORE_TXN)) ||
  111. UNLIKELY (!store->sif->add_abort_fn)
  112. ) return;
  113. store->sif->add_abort_fn (it);
  114. }
  115. VOLK_rc
  116. VOLK_store_add_done (VOLK_Store *store, void *it)
  117. { return store->sif->add_done_fn (it); }
  118. VOLK_rc
  119. VOLK_store_add_term_txn (VOLK_Store *store, void *txn, VOLK_Buffer *sterm)
  120. { return store->sif->add_term_fn (store, sterm, txn); }
  121. void *
  122. VOLK_store_lookup_txn (
  123. const VOLK_Store *store, void *txn,
  124. const VOLK_Buffer *ss, const VOLK_Buffer *sp, const VOLK_Buffer *so,
  125. const VOLK_Buffer *sc, size_t *ct)
  126. {
  127. if (UNLIKELY (!(store->sif->features & VOLK_STORE_CTX)) && sc) {
  128. log_warn (
  129. "Store does not support contexts. Ignoring passed context.");
  130. sc = NULL;
  131. }
  132. return store->sif->lookup_fn (store->data, ss, sp, so, sc, txn, ct); }
  133. VOLK_rc VOLK_store_iter_next (
  134. VOLK_Store *store, void *it, VOLK_BufferTriple *sspo,
  135. VOLK_Buffer **ctx)
  136. {
  137. if (UNLIKELY (!(store->sif->features & VOLK_STORE_CTX)) && ctx) {
  138. log_warn (
  139. "Store does not support contexts. Ignoring passed context.");
  140. ctx = NULL;
  141. }
  142. return store->sif->lu_next_fn (it, sspo, ctx);
  143. }
  144. void
  145. VOLK_store_iter_free (VOLK_Store *store, void *it)
  146. { store->sif->lu_free_fn (it); }
  147. void *
  148. VOLK_store_iter_txn (const VOLK_Store *store, void *it)
  149. {
  150. if (UNLIKELY (!(store->sif->features & VOLK_STORE_TXN))) {
  151. log_warn ("Store does not support transactions.");
  152. return NULL;
  153. }
  154. return store->sif->iter_txn_fn (it);
  155. }
  156. VOLK_rc
  157. VOLK_store_remove_txn (
  158. VOLK_Store *store, void *txn,
  159. const VOLK_Buffer *ss, const VOLK_Buffer *sp, const VOLK_Buffer *so,
  160. const VOLK_Buffer *sc, size_t *ct)
  161. { return store->sif->remove_fn (store->data, ss, sp, so, sc, txn, ct); }
  162. VOLK_Buffer **
  163. VOLK_store_ctx_list_txn (VOLK_Store *store, void *txn)
  164. {
  165. if (UNLIKELY (!(store->sif->features & VOLK_STORE_CTX))) {
  166. log_error ("Store does not support contexts.");
  167. return NULL;
  168. }
  169. return store->sif->ctx_list_fn (store->data, txn);
  170. }