diff page-search.c @ 79:52029a52a385

pasterd: revert using ktemplate
author David Demelier <markand@malikania.fr>
date Fri, 17 Mar 2023 07:43:20 +0100
parents 9bfe5ce3cc45
children 1ffe2f5a8500
line wrap: on
line diff
--- a/page-search.c	Thu Mar 16 20:45:59 2023 +0100
+++ b/page-search.c	Fri Mar 17 07:43:20 2023 +0100
@@ -20,10 +20,11 @@
 #include <string.h>
 
 #include "database.h"
-#include "json-util.h"
 #include "page-index.h"
 #include "page-search.h"
+#include "page-status.h"
 #include "page.h"
+#include "paste.h"
 #include "util.h"
 
 #include "html/search.h"
@@ -31,19 +32,65 @@
 #define TITLE    "paster -- search"
 #define LIMIT    16
 
+enum {
+	KEYWORD_LANGUAGES
+};
+
+struct page {
+	struct kreq *req;
+	struct ktemplate template;
+};
+
+static const char * const keywords[] = {
+	[KEYWORD_LANGUAGES] = "languages"
+};
+
+static int
+format(size_t keyword, void *data)
+{
+	struct page *page = data;
+	struct khtmlreq html;
+
+	khtml_open(&html, page->req, 0);
+
+	switch (keyword) {
+	case KEYWORD_LANGUAGES:
+		for (size_t i = 0; i < languagesz; ++i) {
+			khtml_attr(&html, KELEM_OPTION, KATTR_NAME, languages[i], KATTR__MAX);
+			khtml_puts(&html, languages[i]);
+			khtml_closeelem(&html, 1);
+		}
+		break;
+	default:
+		break;
+	}
+
+	khtml_close(&html);
+
+	return 1;
+}
+
 static void
 get(struct kreq *req)
 {
-	page(req, KHTTP_200, html_search, json_pack("{ss so}",
-		"pagetitle",    "paster -- search",
-		"languages",    ju_languages(NULL)
-	));
+	struct page self = {
+		.req = req,
+		.template = {
+			.cb = format,
+			.arg = &self,
+			.key = keywords,
+			.keysz = NELEM(keywords)
+		}
+	};
+
+	page(req, KHTTP_200, TITLE, html_search, &self.template);
 }
 
 static void
 post(struct kreq *req)
 {
-	json_t *pastes;
+	struct paste pastes[LIMIT];
+	size_t pastesz = NELEM(pastes);
 	const char *key, *val, *title = NULL, *author = NULL, *language = NULL;
 
 	for (size_t i = 0; i < req->fieldsz; ++i) {
@@ -64,10 +111,14 @@
 	if (author && strlen(author) == 0)
 		author = NULL;
 
-	if (!(pastes = database_search(16, title, author, language)))
+	if (database_search(pastes, &pastesz, title, author, language) < 0)
 		page_status(req, KHTTP_500);
-	else
-		page_index_render(req, pastes);
+	else {
+		page_index_render(req, pastes, pastesz);
+
+		for (size_t i = 0; i < pastesz; ++i)
+			paste_finish(&pastes[i]);
+	}
 }
 
 void