Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}