feat(lsm): some more string functions; start of data streaming api
This commit is contained in:
parent
fca8495de4
commit
b552e0a81b
9 changed files with 199 additions and 17 deletions
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef LSM_STORE_INTERNAL
|
||||
#define LSM_STORE_INTERNAL
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "lsm/store.h"
|
||||
#include "lsm/str_internal.h"
|
||||
#include "lsm/trie.h"
|
||||
|
|
@ -11,17 +13,26 @@ typedef struct lsm_attr {
|
|||
} lsm_attr;
|
||||
|
||||
struct lsm_entry {
|
||||
lsm_str key;
|
||||
lsm_str *key;
|
||||
struct {
|
||||
uint64_t count;
|
||||
uint64_t bitmap;
|
||||
lsm_attr *items;
|
||||
} attrs;
|
||||
lsm_str data;
|
||||
struct {
|
||||
uint64_t len;
|
||||
union {
|
||||
FILE *file;
|
||||
char *ptr;
|
||||
} value;
|
||||
bool on_disk;
|
||||
} data;
|
||||
};
|
||||
|
||||
struct lsm_store {
|
||||
lsm_trie *trie;
|
||||
char *data_path;
|
||||
char *db_path;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,6 +1,81 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "lsm.h"
|
||||
#include "lsm/store.h"
|
||||
#include "lsm/trie.h"
|
||||
#include "lsm/store_internal.h"
|
||||
|
||||
/* lsm_error lsm_store_init(lsm_store **ptr) { */
|
||||
/* lsm_store *store = */
|
||||
/* } */
|
||||
lsm_error lsm_store_init(lsm_store **ptr) {
|
||||
lsm_store *store = calloc(1, sizeof(lsm_store));
|
||||
|
||||
if (store == NULL) {
|
||||
return lsm_error_failed_alloc;
|
||||
}
|
||||
|
||||
lsm_error res = lsm_trie_init(&store->trie);
|
||||
|
||||
if (res != lsm_error_ok) {
|
||||
free(store);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
*ptr = store;
|
||||
|
||||
return lsm_error_ok;
|
||||
}
|
||||
|
||||
lsm_error lsm_store_open(lsm_store **ptr, char *db_path, char *data_path) {
|
||||
lsm_store *store;
|
||||
LSM_RES(lsm_store_init(&store));
|
||||
|
||||
// TODO implement all of reading the db file
|
||||
|
||||
store->db_path = db_path;
|
||||
store->data_path = data_path;
|
||||
|
||||
*ptr = store;
|
||||
|
||||
return lsm_error_ok;
|
||||
}
|
||||
|
||||
lsm_error lsm_store_search(lsm_entry **out, lsm_store *store, lsm_str *key) {
|
||||
return lsm_trie_search((void **)out, store->trie, key);
|
||||
}
|
||||
|
||||
lsm_error lsm_store_insert(lsm_entry **out, lsm_store *store, lsm_str *key) {
|
||||
lsm_entry *entry;
|
||||
|
||||
LSM_RES(lsm_entry_init(&entry));
|
||||
LSM_RES(lsm_trie_insert(store->trie, key, entry));
|
||||
|
||||
entry->key = key;
|
||||
*out = entry;
|
||||
|
||||
return lsm_error_ok;
|
||||
}
|
||||
|
||||
lsm_error lsm_store_data_append(lsm_store *store, lsm_entry *entry, lsm_str *data) {
|
||||
uint64_t new_len = entry->data.len + lsm_str_len(data);
|
||||
|
||||
// Data is in memory and still fits -> keep it in memory
|
||||
if ((new_len <= LSM_STORE_DISK_THRESHOLD) && (!entry->data.on_disk)) {
|
||||
char *buf = realloc(entry->data.value.ptr, new_len * sizeof(char));
|
||||
|
||||
if (buf == NULL) {
|
||||
return lsm_error_failed_alloc;
|
||||
}
|
||||
|
||||
memcpy(&buf[entry->data.len], lsm_str_ptr(data), lsm_str_len(data));
|
||||
entry->data.value.ptr = buf;
|
||||
entry->data.len = new_len;
|
||||
}
|
||||
// Data will end up on disk
|
||||
else {
|
||||
// Data is not yet on disk, so we create the file
|
||||
if (!entry->data.on_disk) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,15 +27,15 @@ lsm_error lsm_entry_attr_get(lsm_str **out, lsm_entry *entry,
|
|||
return lsm_error_not_found;
|
||||
}
|
||||
|
||||
for (uint64_t i = 0; i < entry->attrs.count; i++) {
|
||||
if (entry->attrs.items[i].type == type) {
|
||||
*out = entry->attrs.items[i].str;
|
||||
uint64_t i = 0;
|
||||
|
||||
return lsm_error_ok;
|
||||
}
|
||||
while (entry->attrs.items[i].type != type) {
|
||||
i++;
|
||||
}
|
||||
|
||||
return lsm_error_not_found;
|
||||
*out = entry->attrs.items[i].str;
|
||||
|
||||
return lsm_error_ok;
|
||||
}
|
||||
|
||||
lsm_error lsm_entry_attr_remove(lsm_str **out, lsm_entry *entry,
|
||||
|
|
|
|||
|
|
@ -196,3 +196,40 @@ bool lsm_str_eq(lsm_str *s1, lsm_str *s2) {
|
|||
|
||||
return memcmp(lsm_str_ptr(s1), lsm_str_ptr(s2), s1->len) == 0;
|
||||
}
|
||||
|
||||
lsm_error lsm_str_append(lsm_str *s, lsm_str *s2) {
|
||||
if (s2->len == 0) {
|
||||
return lsm_error_ok;
|
||||
}
|
||||
|
||||
uint64_t new_len = s->len + s2->len;
|
||||
|
||||
if (new_len <= 8) {
|
||||
memcpy(&s->data.val[s->len], s2->data.val, s2->len);
|
||||
} else {
|
||||
char *buf;
|
||||
|
||||
if (s->len <= 8) {
|
||||
buf = malloc(new_len * sizeof(char));
|
||||
|
||||
if (buf == NULL) {
|
||||
return lsm_error_failed_alloc;
|
||||
}
|
||||
|
||||
memcpy(buf, s->data.val, s->len);
|
||||
} else {
|
||||
buf = realloc(s->data.ptr, new_len * sizeof(char));
|
||||
|
||||
if (buf == NULL) {
|
||||
return lsm_error_failed_alloc;
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(&buf[s->len], lsm_str_ptr(s2), s2->len);
|
||||
s->data.ptr = buf;
|
||||
}
|
||||
|
||||
s->len += s2->len;
|
||||
|
||||
return lsm_error_ok;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue