Пример #1
0
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;
}
Пример #2
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}