From f407e36cf1c0ba2ee5ad1166958190719fa3a85b Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Sun, 16 Feb 2025 16:40:26 +0100 Subject: [PATCH] create default user_settings --- application/application.c | 20 ++++++++---- application/store.c | 61 ++++++++++++++++++++++++++++++++++++ application/store.h | 2 ++ dbutils/db.c | 66 +++++++++++++++++++++++++++++++++++++++ dbutils/dbutils/db.h | 15 +++++++++ 5 files changed, 158 insertions(+), 6 deletions(-) diff --git a/application/application.c b/application/application.c index 42c7794..65f2757 100644 --- a/application/application.c +++ b/application/application.c @@ -41,7 +41,7 @@ void application_startup(UiEvent *event, void *data) { return; } - // Get environment required by settings + // Get environment required for settings char hostname[HOST_NAME_MAX]; char *host = NULL; if(gethostname(hostname, sizeof(hostname)) == 0) { @@ -69,11 +69,19 @@ void application_startup(UiEvent *event, void *data) { } if(!settings_valid) { - // no valid settings (or no settings) - // TODO: Show a initialization dialog, where the user could - // select available settings or create new settings - fprintf(stderr, "TODO: settings prompt\n"); - exit(-1); + if(usersettings && cxListSize(usersettings) == 0) { + // create default settings + if(note_store_create_default(host, user)) { + fprintf(stderr, "Error: cannot create default settings\n"); + exit(1); + } + } else { + // no valid settings (or no settings) + // TODO: Show a initialization dialog, where the user could + // select available settings or create new settings + fprintf(stderr, "TODO: settings prompt\n"); + exit(1); + } } cxMempoolFree(mp); diff --git a/application/store.c b/application/store.c index 56d41df..9679787 100644 --- a/application/store.c +++ b/application/store.c @@ -165,3 +165,64 @@ void note_store_set_settings( settings_default_node_id = default_node_id; } + +/* + * Creates default user settings for host/user. This also creates a default + * repository and collection. + * Global settings are initialized by this function. + */ +int note_store_create_default(const char *host, const char *user) { + const char *profile_name = "default"; + + const char *sql1 = "insert into repositories(name, local_path) values ('default', '$documents/notes') returning repository_id;"; + const char *sql2 = "insert into collections(repository_id, name) values (?, concat(?, '_', ?, '_root')) returning collection_id;"; + const char *sql3 = "insert into user_settings(host, user, profile_name, default_repository_id, default_collection_id) values (?, ?, ?, ?, ?)"; + + int err = 1; + int64_t repo_id; + int64_t collection_id; + + // Create Repository + DBUQuery *insert_repo = connection->createQuery(connection, NULL); + dbuQuerySetSQL(insert_repo, sql1); + if(!insert_repo->exec(insert_repo)) { + err = dbuResultAsValue(insert_repo->getResult(insert_repo), &repo_id); + } + insert_repo->free(insert_repo); + + if(err) { + return 1; + } + + // Create root collection + err = 1; + DBUQuery *insert_collection = connection->createQuery(connection, NULL); + dbuQuerySetSQL(insert_collection, sql2); + dbuQuerySetParamInt64(insert_collection, 0, repo_id); + dbuQuerySetParamString(insert_collection, 1, cx_str(host)); + dbuQuerySetParamString(insert_collection, 2, cx_str(user)); + if(!insert_collection->exec(insert_collection)) { + err = dbuResultAsValue(insert_collection->getResult(insert_collection), &collection_id); + } + insert_collection->free(insert_collection); + + if(err) { + return 1; + } + + // Create user settings + DBUQuery *insert_settings = connection->createQuery(connection, NULL); + dbuQuerySetSQL(insert_settings, sql3); + dbuQuerySetParamString(insert_collection, 0, cx_str(host)); + dbuQuerySetParamString(insert_collection, 1, cx_str(user)); + dbuQuerySetParamString(insert_collection, 2, cx_str(profile_name)); + dbuQuerySetParamInt64(insert_collection, 3, repo_id); + dbuQuerySetParamInt64(insert_collection, 4, collection_id); + err = insert_settings->exec(insert_settings); + if(!err) { + note_store_set_settings(host, user, profile_name, repo_id, collection_id); + } + insert_settings->free(insert_settings); + + return err; +} diff --git a/application/store.h b/application/store.h index d603faa..6913631 100644 --- a/application/store.h +++ b/application/store.h @@ -58,6 +58,8 @@ void note_store_set_settings( int64_t default_repository_id, int64_t default_node_id); +int note_store_create_default(const char *host, const char *user); + #ifdef __cplusplus } diff --git a/dbutils/db.c b/dbutils/db.c index d7f2500..a611263 100644 --- a/dbutils/db.c +++ b/dbutils/db.c @@ -80,3 +80,69 @@ DBUResult* dbuQueryGetResult(DBUQuery *q) { void dbuQueryFree(DBUQuery *q) { q->free(q); } + + + +int dbuResultAsInt32(DBUResult *r, int32_t *result) { + int64_t i; + int ret = dbuResultAsInt64(r, &i); + if(!ret) { + *result = (int32_t)i; + } + return ret; +} + +int dbuResultAsUInt32(DBUResult *r, uint32_t *result) { + int64_t i; + int ret = dbuResultAsInt64(r, &i); + if(!ret) { + *result = (uint32_t)i; + } + return ret; +} + +int dbuResultAsInt64(DBUResult *r, int64_t *result) { + if(r->hasData(r)) { + if(r->fieldType(r, 0) == DBU_FIELD_INT) { + if(r->optional_getInt) { + *result = r->optional_getInt(r, 0); + } else { + cxstring s = r->getText(r, 0); + return cx_strtoi64(s, result, 10); + } + return 0; + } + } + return -1; +} + +int dbuResultAsUInt64(DBUResult *r, uint64_t *result) { + int64_t i; + int ret = dbuResultAsInt64(r, &i); + if(!ret) { + *result = (uint64_t)i; + } + return ret; +} + +int dbuResultAsString(DBUResult *r, char **result) { + cxmutstr s; + int ret = dbuResultAsCxString(r, &s); + if(!ret) { + *result = s.ptr; + } + return ret; +} + +int dbuResultAsCxString(DBUResult *r, cxmutstr *result) { + if(r->hasData(r)) { + if(r->fieldType(r, 0) != DBU_FIELD_NULL) { + cxstring s = r->getText(r, 0); + if(s.ptr) { + *result = cx_strdup(s); + return 0; + } + } + } + return -1; +} diff --git a/dbutils/dbutils/db.h b/dbutils/dbutils/db.h index 167204b..8a04a08 100644 --- a/dbutils/dbutils/db.h +++ b/dbutils/dbutils/db.h @@ -110,6 +110,21 @@ DBUResult* dbuQueryGetResult(DBUQuery *q); void dbuQueryFree(DBUQuery *q); +#define dbuResultAsValue(r, result) \ + _Generic(result, \ + int32_t* : dbuResultAsInt32, \ + uint32_t*: dbuResultAsUInt32, \ + int64_t* : dbuResultAsInt64, \ + uint64_t*: dbuResultAsUInt64, \ + char** : dbuResultAsString, \ + cxmutstr*: dbuResultAsCxString)(r, result) + +int dbuResultAsInt32(DBUResult *r, int32_t *result); +int dbuResultAsUInt32(DBUResult *r, uint32_t *result); +int dbuResultAsInt64(DBUResult *r, int64_t *result); +int dbuResultAsUInt64(DBUResult *r, uint64_t *result); +int dbuResultAsString(DBUResult *r, char **result); +int dbuResultAsCxString(DBUResult *r, cxmutstr *result); DBUObjectBuilder* dbuObjectBuilder(DBUClass *type, DBUQuery *query, const CxAllocator *a); void dbuObjectBuilderSetDenseResult(DBUObjectBuilder *builder, bool dense); -- 2.43.5