#include #include "lsm/store_internal.h" lsm_error lsm_read_handle_init(lsm_read_handle **out) { lsm_read_handle *handle = calloc(1, sizeof(lsm_read_handle)); if (handle == NULL) { return lsm_error_failed_alloc; } *out = handle; return lsm_error_ok; } bool lsm_read_attr_present(lsm_read_handle *handle, uint8_t type) { return lsm_entry_attr_present(handle->wrapper->entry, type); } lsm_error lsm_read_attr_get(const lsm_str **out, const lsm_read_handle *handle, uint8_t type) { return lsm_entry_attr_get(out, handle->wrapper->entry, type); } lsm_error lsm_read_attr_get_uint64_t(uint64_t *out, const lsm_read_handle *handle, uint8_t type) { return lsm_entry_attr_get_uint64_t(out, handle->wrapper->entry, type); } lsm_error lsm_read_attr_get_uint8_t(uint8_t *out, const lsm_read_handle *handle, uint8_t type) { return lsm_entry_attr_get_uint8_t(out, handle->wrapper->entry, type); } uint64_t lsm_read_data_len(const lsm_read_handle *handle) { return handle->wrapper->entry->data_len; } lsm_error lsm_read_data_read(uint64_t *out, char *buf, lsm_read_handle *handle, uint64_t len) { const lsm_entry *entry = handle->wrapper->entry; if (entry->data_len == 0) { *out = 0; return lsm_error_ok; } // Entries don't open their file unless needed if (handle->data.f == NULL) { LSM_RES(lsm_entry_data_open(&handle->data.f, handle->store, handle->wrapper->entry, "rb")); } uint64_t read; read = fread(buf, sizeof(char), len, handle->data.f); if ((read == 0) && (ferror(handle->data.f) != 0)) { return lsm_error_failed_io; } handle->data.pos += read; *out = read; return lsm_error_ok; } void lsm_read_close(lsm_read_handle *handle) { if (handle->data.f != NULL) { fclose(handle->data.f); handle->data.f = NULL; } pthread_rwlock_unlock(&handle->wrapper->lock); free(handle); }