int ol_unjar(ol_database *db, const char *key, size_t klen, unsigned char **data, size_t *dsize) { if (db->is_enabled(OL_F_DISABLE_TX, &db->feature_set) || db->state == OL_S_COMMITTING || db->state == OL_S_STARTUP) { /* Fake a transaction: */ ol_transaction stack_tx = { .tx_id = 0, .parent_db = NULL, .transaction_db = db }; return olt_unjar(&stack_tx, key, klen, data, dsize); } ol_transaction *tx = olt_begin(db); int unjar_ret = OL_SUCCESS; check(tx != NULL, "Could not begin transaction."); unjar_ret = olt_unjar(tx, key, klen, data, dsize); check(unjar_ret == OL_SUCCESS, "Could not unjar."); check(olt_commit(tx) == OL_SUCCESS, "Could not commit transaction."); return OL_SUCCESS; error: if (tx != NULL && unjar_ret != OL_SUCCESS) olt_abort(tx); return OL_FAILURE; }
vector *ol_bulk_unjar(ol_database *db, const ol_key_array keys, const size_t num_keys) { ol_transaction *tx = NULL; vector *to_return = NULL; check(db != NULL, "Cannot unjar on NULL database."); check((tx = olt_begin(db)) != NULL, "Could not begin transaction."); to_return = vector_new(sizeof(unsigned char *), 256); unsigned int i; for (i = 0; i < num_keys; i++) { const char *key = keys[i]; unsigned char *item = NULL; size_t item_size = 0; olt_unjar(tx, key, strnlen(key, KEY_SIZE), &item, &item_size); if (item != NULL) { vector_append_ptr(to_return, item); } else { vector_append_ptr(to_return, NULL); } } check(olt_commit(tx) == 0, "Could not commit unjar transaction."); return to_return; error: return NULL; }
int olt_exists(ol_transaction *tx, const char *key, size_t klen) { return olt_unjar(tx, key, klen, NULL, NULL); }