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; }
static int remove_member_score_sha1(rlite *db, const unsigned char *key, long keylen, long levels_page_number, rl_btree *scores, long scores_page, rl_skiplist *skiplist, long skiplist_page, unsigned char *member, long member_len, double score, unsigned char digest[20]) { void *tmp; int retval; retval = rl_btree_remove_element(db, scores, scores_page, digest); if (retval != RL_OK && retval != RL_DELETED) { goto cleanup; } retval = rl_skiplist_delete(db, skiplist, skiplist_page, score, member, member_len); if (retval != RL_OK && retval != RL_DELETED) { goto cleanup; } if (retval == RL_DELETED) { RL_CALL(rl_read, RL_FOUND, db, &rl_data_type_list_long, levels_page_number, &rl_list_type_long, &tmp, 1); RL_CALL(rl_list_delete, RL_OK, db, tmp); RL_CALL(rl_delete, RL_OK, db, levels_page_number); RL_CALL(rl_key_delete, RL_OK, db, key, keylen); retval = RL_DELETED; } cleanup: return retval; }