diff scid/crud.c @ 27:dae2de19ca5d

misc: switch to JSON everywhere
author David Demelier <markand@malikania.fr>
date Wed, 03 Aug 2022 15:18:09 +0200
parents
children 695637f1d8a7
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scid/crud.c	Wed Aug 03 15:18:09 2022 +0200
@@ -0,0 +1,79 @@
+/*
+ * crud.c -- convenient helpers for page-api-*
+ *
+ * Copyright (c) 2021 David Demelier <markand@malikania.fr>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "log.h"
+#include "page.h"
+
+static int
+save(struct kreq *r, int (*saver)(json_t *), const char *topic)
+{
+	json_t *doc;
+	json_error_t err;
+	int ret = -1;
+
+	if (!(doc = json_loads(r->fields[0].val, 0, &err)))
+		log_warn("%s: invalid JSON input: %s", topic, err.text);
+	else {
+		if (saver(doc) < 0)
+			log_warn("%s: database insertion failed", topic);
+		else
+			ret = 0;
+
+		json_decref(doc);
+	}
+
+	return ret;
+}
+
+void
+crud_insert(struct kreq *r, int (*saver)(json_t *), const char *topic)
+{
+	if (r->fieldsz < 1)
+		page(r, KHTTP_400, KMIME_APP_JSON, NULL, NULL);
+	else if (save(r, saver, topic) < 0)
+		page(r, KHTTP_500, KMIME_APP_JSON, NULL, NULL);
+	else {
+		khttp_head(r, kresps[KRESP_CONTENT_TYPE], "%s", kmimetypes[KMIME_APP_JSON]);
+		khttp_head(r, kresps[KRESP_STATUS], "%s", khttps[KHTTP_200]);
+		khttp_body(r);
+		khttp_free(r);
+	}
+}
+
+void
+crud_list(struct kreq *r, json_t *doc)
+{
+	char *str;
+
+	if (!doc)
+		page(r, KHTTP_500, KMIME_APP_JSON, NULL, NULL);
+	else {
+		if (!(str = json_dumps(doc, JSON_COMPACT)))
+			page(r, KHTTP_500, KMIME_APP_JSON, NULL, NULL);
+		else {
+			khttp_head(r, kresps[KRESP_CONTENT_TYPE], "%s", kmimetypes[KMIME_APP_JSON]);
+			khttp_head(r, kresps[KRESP_STATUS], "%s", khttps[KHTTP_200]);
+			khttp_body(r);
+			khttp_printf(r, "%s", str);
+			khttp_free(r);
+			json_decref(doc);
+		}
+
+		free(str);
+	}
+}