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) {
}
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);
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;
+}
int64_t default_repository_id,
int64_t default_node_id);
+int note_store_create_default(const char *host, const char *user);
+
#ifdef __cplusplus
}
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;
+}
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);