int rl_key_set(rlite *db, const unsigned char *key, long keylen, unsigned char type, long value_page, unsigned long long expires, long version) { int retval; rl_key *key_obj = NULL; unsigned char *digest = NULL; RL_CALL2(rl_key_delete, RL_OK, RL_NOT_FOUND, db, key, keylen); RL_MALLOC(digest, sizeof(unsigned char) * 20); RL_CALL(sha1, RL_OK, key, keylen, digest); rl_btree *btree; RL_CALL(rl_get_key_btree, RL_OK, db, &btree, 1); RL_MALLOC(key_obj, sizeof(*key_obj)) RL_CALL(rl_multi_string_set, RL_OK, db, &key_obj->string_page, key, keylen); key_obj->type = type; key_obj->value_page = value_page; key_obj->expires = expires; // reserving version=0 for non existent keys if (version == 0) { version = 1; } key_obj->version = version; RL_CALL(rl_btree_add_element, RL_OK, db, btree, db->databases[rl_get_selected_db(db)], digest, key_obj); retval = RL_OK; cleanup: if (retval != RL_OK) { rl_free(digest); rl_free(key_obj); } return retval; }
int rl_key_delete(struct rlite *db, const unsigned char *key, long keylen) { int retval; void *tmp; unsigned char *digest; rl_btree *btree = NULL; rl_key *key_obj = NULL; RL_MALLOC(digest, sizeof(unsigned char) * 20); RL_CALL(sha1, RL_OK, key, keylen, digest); RL_CALL(rl_get_key_btree, RL_OK, db, &btree, 0); retval = rl_btree_find_score(db, btree, digest, &tmp, NULL, NULL); if (retval == RL_FOUND) { int selected_database = rl_get_selected_db(db); key_obj = tmp; RL_CALL(rl_multi_string_delete, RL_OK, db, key_obj->string_page); retval = rl_btree_remove_element(db, btree, db->databases[selected_database], digest); if (retval == RL_DELETED) { db->databases[selected_database] = 0; retval = RL_OK; } else if (retval != RL_OK) { goto cleanup; } } cleanup: rl_free(digest); return retval; }
int rl_watch(struct rlite *db, struct watched_key** _watched_key, const unsigned char *key, long keylen) { int retval; struct watched_key* wkey = NULL; RL_MALLOC(wkey, sizeof(struct watched_key)); wkey->database = rl_get_selected_db(db); RL_CALL(sha1, RL_OK, key, keylen, wkey->digest); RL_CALL2(rl_key_get_hash_ignore_expire, RL_FOUND, RL_NOT_FOUND, db, wkey->digest, NULL, NULL, NULL, NULL, &wkey->version, 1); if (retval == RL_NOT_FOUND) { wkey->version = 0; } *_watched_key = wkey; retval = RL_OK; cleanup: if (retval != RL_OK) { rl_free(wkey); } return retval; }
int rl_get_key_btree(rlite *db, rl_btree **retbtree, int create) { void *_btree; int retval; int selected_database = rl_get_selected_db(db);; if (!db->databases[selected_database]) { if (!create) { return RL_NOT_FOUND; } rl_btree *btree; RL_CALL(rl_btree_create, RL_OK, db, &btree, &rl_btree_type_hash_sha1_key); db->databases[selected_database] = db->next_empty_page; RL_CALL(rl_write, RL_OK, db, &rl_data_type_btree_hash_sha1_key, db->databases[selected_database], btree); } RL_CALL(rl_read, RL_FOUND, db, &rl_data_type_btree_hash_sha1_key, db->databases[selected_database], &rl_btree_type_hash_sha1_key, &_btree, 1); *retbtree = _btree; retval = RL_OK; cleanup: return retval; }