amduat-api/src/amduatd_store.c

104 lines
2.8 KiB
C

#include "amduatd_store.h"
#include "amduat/asl/asl_store_fs_meta.h"
#include <string.h>
bool amduatd_store_backend_parse(const char *value,
amduatd_store_backend_t *out_backend) {
if (value == NULL || out_backend == NULL) {
return false;
}
if (strcmp(value, "fs") == 0) {
*out_backend = AMDUATD_STORE_BACKEND_FS;
return true;
}
if (strcmp(value, "index") == 0) {
*out_backend = AMDUATD_STORE_BACKEND_INDEX;
return true;
}
return false;
}
const char *amduatd_store_backend_name(amduatd_store_backend_t backend) {
switch (backend) {
case AMDUATD_STORE_BACKEND_FS:
return "fs";
case AMDUATD_STORE_BACKEND_INDEX:
return "index";
default:
return "unknown";
}
}
bool amduatd_store_caps_supported(amduatd_store_backend_t backend,
amduatd_store_caps_t *out_caps) {
if (out_caps == NULL) {
return false;
}
memset(out_caps, 0, sizeof(*out_caps));
if (backend == AMDUATD_STORE_BACKEND_FS) {
out_caps->get = true;
out_caps->put = true;
out_caps->validate_config = true;
return true;
}
if (backend == AMDUATD_STORE_BACKEND_INDEX) {
out_caps->get = true;
out_caps->put = true;
out_caps->get_indexed = true;
out_caps->put_indexed = true;
out_caps->log_scan = true;
out_caps->current_state = true;
out_caps->tombstone = true;
out_caps->tombstone_lift = true;
out_caps->validate_config = true;
return true;
}
return true;
}
bool amduatd_store_init(amduat_asl_store_t *store,
amduat_asl_store_fs_config_t *cfg,
amduatd_store_ctx_t *ctx,
const char *root_path,
amduatd_store_backend_t backend) {
if (store == NULL || cfg == NULL || ctx == NULL || root_path == NULL) {
return false;
}
memset(store, 0, sizeof(*store));
memset(ctx, 0, sizeof(*ctx));
memset(cfg, 0, sizeof(*cfg));
if (!amduat_asl_store_fs_load_config(root_path, cfg)) {
return false;
}
if (backend == AMDUATD_STORE_BACKEND_FS) {
if (!amduat_asl_store_fs_init(&ctx->fs, cfg->config, root_path)) {
return false;
}
amduat_asl_store_init(store,
cfg->config,
amduat_asl_store_fs_ops(),
&ctx->fs);
return true;
}
if (backend == AMDUATD_STORE_BACKEND_INDEX) {
if (!amduat_asl_store_index_fs_init(&ctx->index_fs,
cfg->config,
root_path)) {
return false;
}
amduat_asl_store_init(store,
cfg->config,
amduat_asl_store_index_fs_ops(),
&ctx->index_fs);
return true;
}
return false;
}