|
@@ -368,6 +368,167 @@ static int test_quad_store()
|
|
|
}
|
|
|
|
|
|
|
|
|
+static int test_txn_commit (void)
|
|
|
+{
|
|
|
+ if (!(store->sif->features & LSUP_STORE_TXN)) return 0;
|
|
|
+
|
|
|
+ ASSERT (
|
|
|
+ store->sif->txn_begin_fn != NULL,
|
|
|
+ "Transaction begin function is NULL!");
|
|
|
+ ASSERT (
|
|
|
+ store->sif->txn_commit_fn != NULL,
|
|
|
+ "Transaction commit function is NULL!");
|
|
|
+ ASSERT (
|
|
|
+ store->sif->txn_abort_fn != NULL,
|
|
|
+ "Transaction abort function is NULL!");
|
|
|
+ ASSERT (
|
|
|
+ store->sif->add_abort_fn != NULL,
|
|
|
+ "Add abort function is NULL!");
|
|
|
+ ASSERT (
|
|
|
+ store->sif->iter_txn_fn != NULL,
|
|
|
+ "Iterator transaction function is NULL!");
|
|
|
+
|
|
|
+ if (store->sif->setup_fn)
|
|
|
+ EXPECT_PASS (store->sif->setup_fn (store->id, true));
|
|
|
+
|
|
|
+ log_info ("Testing transaction control for %s", store->id);
|
|
|
+ store->data = store->sif->new_fn (store->id, 0);
|
|
|
+ ASSERT (store->data != NULL, "Error creating store data back end!");
|
|
|
+
|
|
|
+ LSUP_Triple *trp = create_triples();
|
|
|
+ LSUP_BufferTriple ser_trp[NUM_TRP];
|
|
|
+
|
|
|
+ for (int i = 0; i < NUM_TRP; i++) {
|
|
|
+ LSUP_BufferTriple *tmp = LSUP_triple_serialize (trp + i);
|
|
|
+ ser_trp[i] = *tmp;
|
|
|
+ free (tmp);
|
|
|
+ }
|
|
|
+
|
|
|
+ void *it;
|
|
|
+
|
|
|
+ it = store->sif->add_init_fn (store->data, NULL, NULL);
|
|
|
+ for (size_t i = 0; i < NUM_TRP; i++) {
|
|
|
+ LSUP_rc rc = store->sif->add_iter_fn (it, ser_trp + i);
|
|
|
+ ASSERT (rc >= 0, "Error inserting triples!");
|
|
|
+ }
|
|
|
+ store->sif->add_abort_fn (it);
|
|
|
+
|
|
|
+ EXPECT_INT_EQ (store->sif->size_fn (store->data), 0);
|
|
|
+
|
|
|
+
|
|
|
+ void *txn;
|
|
|
+ EXPECT_PASS (store->sif->txn_begin_fn (store->data, 0, &txn));
|
|
|
+ it = store->sif->add_init_fn (store->data, NULL, txn);
|
|
|
+ for (size_t i = 0; i < NUM_TRP; i++) {
|
|
|
+ LSUP_rc rc = store->sif->add_iter_fn (it, ser_trp + i);
|
|
|
+ ASSERT (rc >= 0, "Error inserting triples!");
|
|
|
+ }
|
|
|
+ store->sif->add_done_fn (it);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ EXPECT_INT_EQ (store->sif->size_fn (store->data), 0);
|
|
|
+
|
|
|
+ size_t ct;
|
|
|
+ it = store->sif->lookup_fn (
|
|
|
+ store->data, NULL, NULL, NULL, NULL, txn, &ct);
|
|
|
+ store->sif->lu_free_fn (it);
|
|
|
+
|
|
|
+ EXPECT_INT_EQ (ct, 8);
|
|
|
+
|
|
|
+
|
|
|
+ EXPECT_PASS (store->sif->txn_commit_fn (txn));
|
|
|
+ it = store->sif->lookup_fn (
|
|
|
+ store->data, NULL, NULL, NULL, NULL, NULL, &ct);
|
|
|
+ store->sif->lu_free_fn (it);
|
|
|
+ EXPECT_INT_EQ (ct, 8);
|
|
|
+ EXPECT_INT_EQ (store->sif->size_fn (store->data), 8);
|
|
|
+
|
|
|
+ for (int i = 0; i < NUM_TRP; i++) {
|
|
|
+ LSUP_buffer_free (ser_trp[i].s);
|
|
|
+ LSUP_buffer_free (ser_trp[i].p);
|
|
|
+ LSUP_buffer_free (ser_trp[i].o);
|
|
|
+ }
|
|
|
+
|
|
|
+ store->sif->free_fn (store->data);
|
|
|
+ free_triples (trp);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+static int test_txn_abort (void)
|
|
|
+{
|
|
|
+ if (!(store->sif->features & LSUP_STORE_TXN)) return 0;
|
|
|
+
|
|
|
+ if (store->sif->setup_fn)
|
|
|
+ EXPECT_PASS (store->sif->setup_fn (store->id, true));
|
|
|
+
|
|
|
+ log_info ("Testing transaction control for %s", store->id);
|
|
|
+ store->data = store->sif->new_fn (store->id, 0);
|
|
|
+ ASSERT (store->data != NULL, "Error creating store data back end!");
|
|
|
+
|
|
|
+ LSUP_Triple *trp = create_triples();
|
|
|
+ LSUP_BufferTriple ser_trp[NUM_TRP];
|
|
|
+
|
|
|
+ for (int i = 0; i < NUM_TRP; i++) {
|
|
|
+ LSUP_BufferTriple *tmp = LSUP_triple_serialize (trp + i);
|
|
|
+ ser_trp[i] = *tmp;
|
|
|
+ free (tmp);
|
|
|
+ }
|
|
|
+
|
|
|
+ void *it;
|
|
|
+
|
|
|
+ it = store->sif->add_init_fn (store->data, NULL, NULL);
|
|
|
+ for (size_t i = 0; i < NUM_TRP; i++) {
|
|
|
+ LSUP_rc rc = store->sif->add_iter_fn (it, ser_trp + i);
|
|
|
+ ASSERT (rc >= 0, "Error inserting triples!");
|
|
|
+ }
|
|
|
+ store->sif->add_abort_fn (it);
|
|
|
+
|
|
|
+ EXPECT_INT_EQ (store->sif->size_fn (store->data), 0);
|
|
|
+
|
|
|
+
|
|
|
+ void *txn;
|
|
|
+ EXPECT_PASS (store->sif->txn_begin_fn (store->data, 0, &txn));
|
|
|
+ it = store->sif->add_init_fn (store->data, NULL, txn);
|
|
|
+ for (size_t i = 0; i < NUM_TRP; i++) {
|
|
|
+ LSUP_rc rc = store->sif->add_iter_fn (it, ser_trp + i);
|
|
|
+ ASSERT (rc >= 0, "Error inserting triples!");
|
|
|
+ }
|
|
|
+ store->sif->add_done_fn (it);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ EXPECT_INT_EQ (store->sif->size_fn (store->data), 0);
|
|
|
+
|
|
|
+ size_t ct;
|
|
|
+ it = store->sif->lookup_fn (
|
|
|
+ store->data, NULL, NULL, NULL, NULL, txn, &ct);
|
|
|
+ store->sif->lu_free_fn (it);
|
|
|
+
|
|
|
+ EXPECT_INT_EQ (ct, 8);
|
|
|
+
|
|
|
+
|
|
|
+ store->sif->txn_abort_fn (txn);
|
|
|
+ it = store->sif->lookup_fn (
|
|
|
+ store->data, NULL, NULL, NULL, NULL, NULL, &ct);
|
|
|
+ store->sif->lu_free_fn (it);
|
|
|
+ EXPECT_INT_EQ (ct, 0);
|
|
|
+
|
|
|
+ for (int i = 0; i < NUM_TRP; i++) {
|
|
|
+ LSUP_buffer_free (ser_trp[i].s);
|
|
|
+ LSUP_buffer_free (ser_trp[i].p);
|
|
|
+ LSUP_buffer_free (ser_trp[i].o);
|
|
|
+ }
|
|
|
+
|
|
|
+ store->sif->free_fn (store->data);
|
|
|
+ free_triples (trp);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
int store_tests()
|
|
|
{
|
|
|
#define ENTRY(a, b) \
|
|
@@ -375,7 +536,9 @@ int store_tests()
|
|
|
store->id = STORE_ID_##a; \
|
|
|
store->sif = &b; \
|
|
|
RUN (test_triple_store); \
|
|
|
- RUN (test_quad_store);
|
|
|
+ RUN (test_quad_store); \
|
|
|
+ RUN (test_txn_commit); \
|
|
|
+ RUN (test_txn_abort);
|
|
|
BACKEND_TBL
|
|
|
#undef ENTRY
|
|
|
return 0;
|