feat(lsm): iterator over items in trie

This commit is contained in:
Jef Roosens 2023-12-23 10:06:02 +01:00
parent 5564e23ceb
commit f4d711365d
Signed by: Jef Roosens
GPG key ID: B75D4F293C7052DB
9 changed files with 229 additions and 8 deletions

View file

@ -27,6 +27,7 @@ typedef enum lsm_error {
lsm_error_null_value = 4,
lsm_error_failed_io = 5,
lsm_error_lock_busy = 6,
lsm_error_done = 7,
} lsm_error;
/*typedef struct lsm_string { */

View file

@ -102,6 +102,6 @@ void lsm_bt_iter(lsm_bt_iterator *out, const lsm_bt *bt);
* @return true if a new entry was returned, false if the iterator has no more
* entries to return
*/
bool lsm_bt_iter_next(const void **out, char *key_out, lsm_bt_iterator *iter);
bool lsm_bt_iter_next(void **out, char *key_out, lsm_bt_iterator *iter);
#endif

View file

@ -1,7 +1,10 @@
#ifndef LSM_TRIE
#define LSM_TRIE
#include <stdlib.h>
#include "lsm.h"
#include "lsm/bt.h"
#include "lsm/str.h"
/**
@ -9,6 +12,11 @@
*/
typedef struct lsm_trie lsm_trie;
/**
* A node inside an `lsm_trie` trie
*/
typedef struct lsm_trie_node lsm_trie_node;
/**
* Initialize a new trie.
*
@ -57,4 +65,36 @@ lsm_error lsm_trie_remove(void **out, lsm_trie *trie, const lsm_str *key);
*/
uint64_t lsm_trie_size(const lsm_trie *trie);
/**
* Represents an in-flight iterator over a trie
*/
typedef struct lsm_trie_iterator lsm_trie_iterator;
/**
* Initialize an iterator to iterate over all entries with keys starting
* with the given prefix.
*
* @param out pointer to store iterator pointer in
* @param trie trie to iterate
* @param prefix prefix of the keys; a zero-length string means iterating over
* the entire trie; NULL is interpreted as a zero-length string
*/
lsm_error lsm_trie_iter(lsm_trie_iterator **out, const lsm_trie *trie,
const lsm_str *prefix);
/**
* Advance the given iterator.
*
* @param out pointer to store next data pointer in
* @param iter iterator to advance
* @return `lsm_error_ok` if next element has been returned, `lsm_error_done` if
* no more elements are present, or some other error code
*/
lsm_error lsm_trie_iter_next(void **out, lsm_trie_iterator *iter);
/**
* Free the given iterator.
*/
void lsm_trie_iter_free(lsm_trie_iterator *iter);
#endif