]> uap-core.de Git - note.git/commitdiff
create default user_settings
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 16 Feb 2025 15:40:26 +0000 (16:40 +0100)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 16 Feb 2025 15:40:26 +0000 (16:40 +0100)
application/application.c
application/store.c
application/store.h
dbutils/db.c
dbutils/dbutils/db.h

index 42c7794beea092637d25c643d97fa0da6ec7f033..65f27577e96cb8584e4d6e9ece1d6e126a2dbf62 100644 (file)
@@ -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);
index 56d41dfcf1191a67486d68f998813c4d1f132de2..967978733400e7ff2f601896328c3ad7daf49f78 100644 (file)
@@ -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;
+}
index d603faab21c72c166da8b461cf50c470c7f4e1ca..691363113bd243a1558aa67aafe9bdfd4278c283 100644 (file)
@@ -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
 }
index d7f2500c4aa321404d9641b2604680b3caba20ca..a61126354073ad65bdf8315cf59e4cd089affe94 100644 (file)
@@ -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;
+}
index 167204b85dcba9ed9ef2a888c5e32c646adab33a..8a04a080ce7b20fc14ff1e385fa6020bb716c3c2 100644 (file)
@@ -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);