diff options
author | Egor Tensin <Egor.Tensin@gmail.com> | 2022-09-11 20:23:24 +0300 |
---|---|---|
committer | Egor Tensin <Egor.Tensin@gmail.com> | 2022-09-11 20:23:24 +0300 |
commit | 23f9521d1abdeb599fbe81d0c196a9ee92f5fd8a (patch) | |
tree | 5ee5e59339bf2af98039ec4584f8a01410a95c11 /src/storage.c | |
parent | log: refactoring (diff) | |
download | cimple-23f9521d1abdeb599fbe81d0c196a9ee92f5fd8a.tar.gz cimple-23f9521d1abdeb599fbe81d0c196a9ee92f5fd8a.zip |
create SQLite database on startup
Diffstat (limited to '')
-rw-r--r-- | src/storage.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/storage.c b/src/storage.c new file mode 100644 index 0000000..eac3e2d --- /dev/null +++ b/src/storage.c @@ -0,0 +1,69 @@ +#include "storage.h" +#include "log.h" +#include "storage_sqlite.h" + +typedef void (*storage_settings_destroy_t)(const struct storage_settings *); +typedef int (*storage_create_t)(struct storage *, const struct storage_settings *); +typedef void (*storage_destroy_t)(struct storage *); + +struct storage_api { + storage_settings_destroy_t destroy_settings; + storage_create_t create; + storage_destroy_t destroy; +}; + +static const struct storage_api apis[] = { + { + storage_settings_destroy_sqlite, + storage_create_sqlite, + storage_destroy_sqlite, + }, +}; + +static size_t numof_apis() +{ + return sizeof(apis) / sizeof(apis[0]); +} + +static const struct storage_api *get_api(enum storage_type type) +{ + if (type < 0) + goto invalid_type; + if ((size_t)type > numof_apis()) + goto invalid_type; + + return &apis[type]; + +invalid_type: + log_err("Unsupported storage type: %d\n", type); + return NULL; +} + +void storage_settings_destroy(const struct storage_settings *settings) +{ + const struct storage_api *api = get_api(settings->type); + if (!api) + return; + api->destroy_settings(settings); +} + +int storage_create(struct storage *storage, const struct storage_settings *settings) +{ + int ret = 0; + const struct storage_api *api = get_api(settings->type); + if (!api) + return -1; + ret = api->create(storage, settings); + if (ret < 0) + return ret; + storage->type = settings->type; + return ret; +} + +void storage_destroy(struct storage *storage) +{ + const struct storage_api *api = get_api(storage->type); + if (!api) + return; + api->destroy(storage); +} |