refactor(lsm): decouple attribute types
parent
535b92a6b6
commit
b5fc3a3612
|
@ -18,6 +18,12 @@ typedef struct lander_ctx {
|
||||||
uint64_t remaining_data;
|
uint64_t remaining_data;
|
||||||
} lander_ctx;
|
} lander_ctx;
|
||||||
|
|
||||||
|
typedef enum lander_attr_type : uint64_t {
|
||||||
|
lander_attr_type_entry_type = 1 << 0,
|
||||||
|
lander_attr_type_content_type = 1 << 1,
|
||||||
|
lander_attr_type_url = 1 << 2,
|
||||||
|
} lander_attr_type;
|
||||||
|
|
||||||
typedef enum lander_entry_type {
|
typedef enum lander_entry_type {
|
||||||
lander_entry_type_redirect = 0,
|
lander_entry_type_redirect = 0,
|
||||||
lander_entry_type_paste = 1,
|
lander_entry_type_paste = 1,
|
||||||
|
|
|
@ -9,18 +9,6 @@
|
||||||
|
|
||||||
#define LSM_STORE_DISK_THRESHOLD 1024
|
#define LSM_STORE_DISK_THRESHOLD 1024
|
||||||
|
|
||||||
/**
|
|
||||||
* The type of an entry attribute.
|
|
||||||
*
|
|
||||||
* Each type is represented as a single bit of an
|
|
||||||
* integer, so they can be easily combined into a bitmap.
|
|
||||||
*/
|
|
||||||
typedef enum lsm_attr_type : uint64_t {
|
|
||||||
lsm_attr_type_entry_type = 1 << 0,
|
|
||||||
lsm_attr_type_content_type = 1 << 1,
|
|
||||||
lsm_attr_type_url = 1 << 2,
|
|
||||||
} lsm_attr_type;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A handle referencing an entry inside a store. Read/write operations from/to
|
* A handle referencing an entry inside a store. Read/write operations from/to
|
||||||
* the entry go through this handle.
|
* the entry go through this handle.
|
||||||
|
@ -33,7 +21,7 @@ typedef struct lsm_entry_handle lsm_entry_handle;
|
||||||
* @param entry entry to check
|
* @param entry entry to check
|
||||||
* @param type type of attribute to check for
|
* @param type type of attribute to check for
|
||||||
*/
|
*/
|
||||||
bool lsm_entry_attr_present(lsm_entry_handle *handle, lsm_attr_type type);
|
bool lsm_entry_attr_present(lsm_entry_handle *handle, uint64_t type);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the contents of an attribute from an entry, if present
|
* Retrieve the contents of an attribute from an entry, if present
|
||||||
|
@ -43,7 +31,7 @@ bool lsm_entry_attr_present(lsm_entry_handle *handle, lsm_attr_type type);
|
||||||
* @param type type of attribute to return
|
* @param type type of attribute to return
|
||||||
*/
|
*/
|
||||||
lsm_error lsm_entry_attr_get(lsm_str **out, lsm_entry_handle *handle,
|
lsm_error lsm_entry_attr_get(lsm_str **out, lsm_entry_handle *handle,
|
||||||
lsm_attr_type type);
|
uint64_t type);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convenience wrapper around `lsm_entry_attr_get` that can be used if we know
|
* Convenience wrapper around `lsm_entry_attr_get` that can be used if we know
|
||||||
|
@ -54,7 +42,7 @@ lsm_error lsm_entry_attr_get(lsm_str **out, lsm_entry_handle *handle,
|
||||||
* @param type type of attribute to return
|
* @param type type of attribute to return
|
||||||
*/
|
*/
|
||||||
lsm_error lsm_entry_attr_get_num(uint64_t *out, lsm_entry_handle *handle,
|
lsm_error lsm_entry_attr_get_num(uint64_t *out, lsm_entry_handle *handle,
|
||||||
lsm_attr_type type);
|
uint64_t type);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a new attribute to the entry.
|
* Add a new attribute to the entry.
|
||||||
|
@ -63,7 +51,7 @@ lsm_error lsm_entry_attr_get_num(uint64_t *out, lsm_entry_handle *handle,
|
||||||
* @param type type of attribute to add
|
* @param type type of attribute to add
|
||||||
* @param data data of attribute; ownership of pointer is taken over
|
* @param data data of attribute; ownership of pointer is taken over
|
||||||
*/
|
*/
|
||||||
lsm_error lsm_entry_attr_insert(lsm_entry_handle *handle, lsm_attr_type type,
|
lsm_error lsm_entry_attr_insert(lsm_entry_handle *handle, uint64_t type,
|
||||||
lsm_str *data);
|
lsm_str *data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -74,8 +62,8 @@ lsm_error lsm_entry_attr_insert(lsm_entry_handle *handle, lsm_attr_type type,
|
||||||
* @param type type of attribute to add
|
* @param type type of attribute to add
|
||||||
* @param data data of attribute
|
* @param data data of attribute
|
||||||
*/
|
*/
|
||||||
lsm_error lsm_entry_attr_insert_num(lsm_entry_handle *handle,
|
lsm_error lsm_entry_attr_insert_num(lsm_entry_handle *handle, uint64_t type,
|
||||||
lsm_attr_type type, uint64_t data);
|
uint64_t data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove an atribute from the given entry, if present.
|
* Remove an atribute from the given entry, if present.
|
||||||
|
@ -86,7 +74,7 @@ lsm_error lsm_entry_attr_insert_num(lsm_entry_handle *handle,
|
||||||
* @param type type of attribute to remove
|
* @param type type of attribute to remove
|
||||||
*/
|
*/
|
||||||
lsm_error lsm_entry_attr_remove(lsm_str **out, lsm_entry_handle *handle,
|
lsm_error lsm_entry_attr_remove(lsm_str **out, lsm_entry_handle *handle,
|
||||||
lsm_attr_type type);
|
uint64_t type);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A store consisting of LSM entries.
|
* A store consisting of LSM entries.
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
#define LSM_IDX_FILE_NAME "lsm.idx"
|
#define LSM_IDX_FILE_NAME "lsm.idx"
|
||||||
|
|
||||||
typedef struct lsm_attr {
|
typedef struct lsm_attr {
|
||||||
lsm_attr_type type;
|
uint64_t type;
|
||||||
lsm_str *str;
|
lsm_str *str;
|
||||||
} lsm_attr;
|
} lsm_attr;
|
||||||
|
|
||||||
|
|
|
@ -56,12 +56,12 @@ void lsm_entry_close(lsm_entry_handle *handle) {
|
||||||
free(handle);
|
free(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool lsm_entry_attr_present(lsm_entry_handle *handle, lsm_attr_type type) {
|
bool lsm_entry_attr_present(lsm_entry_handle *handle, uint64_t type) {
|
||||||
return (handle->wrapper->entry->attrs.bitmap & type) != 0;
|
return (handle->wrapper->entry->attrs.bitmap & type) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
lsm_error lsm_entry_attr_get(lsm_str **out, lsm_entry_handle *handle,
|
lsm_error lsm_entry_attr_get(lsm_str **out, lsm_entry_handle *handle,
|
||||||
lsm_attr_type type) {
|
uint64_t type) {
|
||||||
if (!lsm_entry_attr_present(handle, type)) {
|
if (!lsm_entry_attr_present(handle, type)) {
|
||||||
return lsm_error_not_found;
|
return lsm_error_not_found;
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,7 @@ lsm_error lsm_entry_attr_get(lsm_str **out, lsm_entry_handle *handle,
|
||||||
}
|
}
|
||||||
|
|
||||||
lsm_error lsm_entry_attr_get_num(uint64_t *out, lsm_entry_handle *handle,
|
lsm_error lsm_entry_attr_get_num(uint64_t *out, lsm_entry_handle *handle,
|
||||||
lsm_attr_type type) {
|
uint64_t type) {
|
||||||
lsm_str *s;
|
lsm_str *s;
|
||||||
|
|
||||||
LSM_RES(lsm_entry_attr_get(&s, handle, type));
|
LSM_RES(lsm_entry_attr_get(&s, handle, type));
|
||||||
|
@ -96,7 +96,7 @@ lsm_error lsm_entry_attr_get_num(uint64_t *out, lsm_entry_handle *handle,
|
||||||
}
|
}
|
||||||
|
|
||||||
lsm_error lsm_entry_attr_remove(lsm_str **out, lsm_entry_handle *handle,
|
lsm_error lsm_entry_attr_remove(lsm_str **out, lsm_entry_handle *handle,
|
||||||
lsm_attr_type type) {
|
uint64_t type) {
|
||||||
if (!lsm_entry_attr_present(handle, type)) {
|
if (!lsm_entry_attr_present(handle, type)) {
|
||||||
return lsm_error_not_found;
|
return lsm_error_not_found;
|
||||||
}
|
}
|
||||||
|
@ -143,7 +143,7 @@ lsm_error lsm_entry_attr_remove(lsm_str **out, lsm_entry_handle *handle,
|
||||||
return lsm_error_ok;
|
return lsm_error_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
lsm_error lsm_entry_attr_insert(lsm_entry_handle *handle, lsm_attr_type type,
|
lsm_error lsm_entry_attr_insert(lsm_entry_handle *handle, uint64_t type,
|
||||||
lsm_str *data) {
|
lsm_str *data) {
|
||||||
if (lsm_entry_attr_present(handle, type)) {
|
if (lsm_entry_attr_present(handle, type)) {
|
||||||
return lsm_error_already_present;
|
return lsm_error_already_present;
|
||||||
|
@ -168,8 +168,8 @@ lsm_error lsm_entry_attr_insert(lsm_entry_handle *handle, lsm_attr_type type,
|
||||||
return lsm_error_ok;
|
return lsm_error_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
lsm_error lsm_entry_attr_insert_num(lsm_entry_handle *handle,
|
lsm_error lsm_entry_attr_insert_num(lsm_entry_handle *handle, uint64_t type,
|
||||||
lsm_attr_type type, uint64_t data) {
|
uint64_t data) {
|
||||||
lsm_str *s;
|
lsm_str *s;
|
||||||
LSM_RES(
|
LSM_RES(
|
||||||
lsm_str_init_copy_n(&s, (char *)&data, sizeof(uint64_t) / sizeof(char)));
|
lsm_str_init_copy_n(&s, (char *)&data, sizeof(uint64_t) / sizeof(char)));
|
||||||
|
|
|
@ -80,14 +80,14 @@ bool lander_get_entry_lsm(event_loop_conn *conn) {
|
||||||
|
|
||||||
lander_entry_type t;
|
lander_entry_type t;
|
||||||
lsm_entry_attr_get_num((uint64_t *)&t, c_ctx->entry,
|
lsm_entry_attr_get_num((uint64_t *)&t, c_ctx->entry,
|
||||||
lsm_attr_type_entry_type);
|
lander_attr_type_entry_type);
|
||||||
|
|
||||||
if (t == lander_entry_type_redirect) {
|
if (t == lander_entry_type_redirect) {
|
||||||
// For redirects, the URL is stored as an in-memory attribute
|
// For redirects, the URL is stored as an in-memory attribute
|
||||||
lsm_str *url_attr_val;
|
lsm_str *url_attr_val;
|
||||||
|
|
||||||
// This shouldn't be able to happen
|
// This shouldn't be able to happen
|
||||||
if (lsm_entry_attr_get(&url_attr_val, c_ctx->entry, lsm_attr_type_url) !=
|
if (lsm_entry_attr_get(&url_attr_val, c_ctx->entry, lander_attr_type_url) !=
|
||||||
lsm_error_ok) {
|
lsm_error_ok) {
|
||||||
error("Entry of type redirect detected without URL attribute");
|
error("Entry of type redirect detected without URL attribute");
|
||||||
|
|
||||||
|
|
|
@ -132,7 +132,7 @@ bool lander_post_redirect_lsm(event_loop_conn *conn) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
lsm_entry_attr_insert_num(c_ctx->entry, lsm_attr_type_entry_type,
|
lsm_entry_attr_insert_num(c_ctx->entry, lander_attr_type_entry_type,
|
||||||
lander_entry_type_redirect);
|
lander_entry_type_redirect);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -144,7 +144,7 @@ bool lander_post_redirect_body_to_attr(event_loop_conn *conn) {
|
||||||
|
|
||||||
lsm_str *attr_value;
|
lsm_str *attr_value;
|
||||||
lsm_str_init_copy_n(&attr_value, ctx->req.body.buf, ctx->req.body.len);
|
lsm_str_init_copy_n(&attr_value, ctx->req.body.buf, ctx->req.body.len);
|
||||||
lsm_entry_attr_insert(c_ctx->entry, lsm_attr_type_url, attr_value);
|
lsm_entry_attr_insert(c_ctx->entry, lander_attr_type_url, attr_value);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -171,7 +171,7 @@ bool lander_post_paste_lsm(event_loop_conn *conn) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
lsm_entry_attr_insert_num(c_ctx->entry, lsm_attr_type_entry_type,
|
lsm_entry_attr_insert_num(c_ctx->entry, lander_attr_type_entry_type,
|
||||||
lander_entry_type_paste);
|
lander_entry_type_paste);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Reference in New Issue