From fca8495de4ed3b75e9003ec3b7b988b1b316bfb8 Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Fri, 20 Oct 2023 10:41:53 +0200 Subject: [PATCH] feat(lsm): implement lsm entry add & remove --- lsm/include/lsm/store.h | 21 ++++++++ lsm/src/_include/lsm/store_internal.h | 7 ++- lsm/src/store/lsm_store.c | 6 +++ lsm/src/store/lsm_store_entry.c | 73 ++++++++++++++++++++++++++- 4 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 lsm/src/store/lsm_store.c diff --git a/lsm/include/lsm/store.h b/lsm/include/lsm/store.h index d0fab21..e542f9d 100644 --- a/lsm/include/lsm/store.h +++ b/lsm/include/lsm/store.h @@ -59,6 +59,27 @@ bool lsm_entry_attr_present(lsm_entry *entry, lsm_attr_type type); lsm_error lsm_entry_attr_get(lsm_str **out, lsm_entry *entry, lsm_attr_type type); +/** + * Add a new attribute to the entry. + * + * @param entry entry to modify + * @param type type of attribute to add + * @param data data of attribute; ownership of pointer is taken over + */ +lsm_error lsm_entry_attr_insert(lsm_entry *entry, lsm_attr_type type, + lsm_str *data); + +/** + * Remove an atribute from the given entry, if present. + * + * @param out pointer to store removed data pointer in. If NULL, data pointer + * can get leaked. + * @param entry entry to remove attribute from + * @param type type of attribute to remove + */ +lsm_error lsm_entry_attr_remove(lsm_str **out, lsm_entry *entry, + lsm_attr_type type); + /** * A store consisting of LSM entries. * diff --git a/lsm/src/_include/lsm/store_internal.h b/lsm/src/_include/lsm/store_internal.h index d0aaed0..b4a833c 100644 --- a/lsm/src/_include/lsm/store_internal.h +++ b/lsm/src/_include/lsm/store_internal.h @@ -3,10 +3,11 @@ #include "lsm/store.h" #include "lsm/str_internal.h" +#include "lsm/trie.h" typedef struct lsm_attr { lsm_attr_type type; - lsm_str str; + lsm_str *str; } lsm_attr; struct lsm_entry { @@ -19,4 +20,8 @@ struct lsm_entry { lsm_str data; }; +struct lsm_store { + lsm_trie *trie; +}; + #endif diff --git a/lsm/src/store/lsm_store.c b/lsm/src/store/lsm_store.c new file mode 100644 index 0000000..8ba5740 --- /dev/null +++ b/lsm/src/store/lsm_store.c @@ -0,0 +1,6 @@ +#include "lsm/store.h" +#include "lsm/store_internal.h" + +/* lsm_error lsm_store_init(lsm_store **ptr) { */ +/* lsm_store *store = */ +/* } */ diff --git a/lsm/src/store/lsm_store_entry.c b/lsm/src/store/lsm_store_entry.c index 99a2b30..aa1c7fc 100644 --- a/lsm/src/store/lsm_store_entry.c +++ b/lsm/src/store/lsm_store_entry.c @@ -1,4 +1,6 @@ +#include #include +#include #include "lsm.h" #include "lsm/store_internal.h" @@ -27,7 +29,7 @@ lsm_error lsm_entry_attr_get(lsm_str **out, lsm_entry *entry, for (uint64_t i = 0; i < entry->attrs.count; i++) { if (entry->attrs.items[i].type == type) { - *out = &entry->attrs.items[i].str; + *out = entry->attrs.items[i].str; return lsm_error_ok; } @@ -35,3 +37,72 @@ lsm_error lsm_entry_attr_get(lsm_str **out, lsm_entry *entry, return lsm_error_not_found; } + +lsm_error lsm_entry_attr_remove(lsm_str **out, lsm_entry *entry, + lsm_attr_type type) { + if (!lsm_entry_attr_present(entry, type)) { + return lsm_error_not_found; + } + + if (entry->attrs.count == 1) { + *out = entry->attrs.items[0].str; + + free(entry->attrs.items); + entry->attrs.items = NULL; + entry->attrs.count = 0; + entry->attrs.bitmap = 0; + + return lsm_error_ok; + } + + uint64_t i = 0; + + while (entry->attrs.items[i].type != type) { + i++; + } + + lsm_attr *new_attrs = malloc((entry->attrs.count - 1) * sizeof(lsm_attr)); + + if (new_attrs == NULL) { + return lsm_error_failed_alloc; + } + + if (out != NULL) { + *out = entry->attrs.items[i].str; + } + + memcpy(new_attrs, entry->attrs.items, i * sizeof(lsm_attr)); + memcpy(&new_attrs[i], &entry->attrs.items[i + 1], + (entry->attrs.count - i - 1) * sizeof(lsm_attr)); + + free(entry->attrs.items); + + entry->attrs.items = new_attrs; + entry->attrs.count--; + entry->attrs.bitmap &= ~type; + + return lsm_error_ok; +} + +lsm_error lsm_entry_attr_insert(lsm_entry *entry, lsm_attr_type type, + lsm_str *data) { + if (lsm_entry_attr_present(entry, type)) { + return lsm_error_already_present; + } + + lsm_attr *new_attrs = + realloc(entry->attrs.items, (entry->attrs.count + 1) * sizeof(lsm_attr)); + + if (new_attrs == NULL) { + return lsm_error_failed_alloc; + } + + new_attrs[entry->attrs.count].type = type; + new_attrs[entry->attrs.count].str = data; + + entry->attrs.items = new_attrs; + entry->attrs.count++; + entry->attrs.bitmap |= type; + + return lsm_error_ok; +}