summary refs log tree commit diff
path: root/events.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--events.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/events.c b/events.c
index c516631..5dbb6b7 100644
--- a/events.c
+++ b/events.c
@@ -66,6 +66,18 @@ dateForm(struct khtmlreq *html, struct Scope scope, const char *_time) {
 		|| khtml_closeelem(html, 1);
 }
 
+const char *EventsTopicQuery = SQL(
+	SELECT topics.topic
+	FROM topics
+	JOIN contexts USING (context)
+	WHERE contexts.network = :network
+		AND contexts.name = :context
+		AND contexts.query <= NOT :public
+		AND topics.time <= strftime('%s', :time)
+	ORDER BY topics.time DESC
+	LIMIT 1;
+);
+
 const char *EventsAfterQuery = SQL(
 	SELECT
 		events.event,
@@ -147,6 +159,30 @@ enum kcgi_err eventsPage(struct kreq *req) {
 		|| khtml_elem(&html, KELEM_TABLE);
 	if (error) return error;
 
+	sqlite3_reset(stmt.eventsTopic);
+	dbBindText(stmt.eventsTopic, ":network", scope.network);
+	dbBindText(stmt.eventsTopic, ":context", scope.context);
+	dbBindText(stmt.eventsTopic, ":time", time);
+	dbBindInt(stmt.eventsTopic, ":public", contextsPublic);
+
+	int result = sqlite3_step(stmt.eventsTopic);
+	if (result == SQLITE_ROW) {
+		error = 0
+			|| khtml_elem(&html, KELEM_THEAD)
+			|| khtml_elem(&html, KELEM_TR)
+			|| khtml_attr(
+				&html, KELEM_TH,
+				KATTR_CLASS, "topic",
+				KATTR_COLSPAN, "3",
+				KATTR__MAX
+			)
+			|| khtml_puts(&html, sqlite3_column_text(stmt.eventsTopic, 0))
+			|| khtml_closeelem(&html, 3);
+		if (error) return error;
+		result = sqlite3_step(stmt.eventsTopic);
+	}
+	if (result != SQLITE_DONE) errx(EX_SOFTWARE, "%s", sqlite3_errmsg(db));
+
 	sqlite3_stmt *events = stmt.eventsAfter;
 	if (req->fieldmap[Before]) events = stmt.eventsBefore;
 
@@ -158,7 +194,6 @@ enum kcgi_err eventsPage(struct kreq *req) {
 	dbBindInt(events, ":limit", eventsLimit);
 
 	int rows;
-	int result;
 	time_t prevTime = 0;
 	int64_t prevEvent = 0;
 	for (rows = 0; SQLITE_ROW == (result = sqlite3_step(events)); ++rows) {