diff options
-rw-r--r-- | events.c | 37 | ||||
-rw-r--r-- | server.h | 4 |
2 files changed, 40 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) { diff --git a/server.h b/server.h index eee5419..4a18ef0 100644 --- a/server.h +++ b/server.h @@ -90,6 +90,7 @@ enum kcgi_err contextsPage(struct kreq *req); extern int eventsGap; extern int eventsOverlap; extern int eventsLimit; +extern const char *EventsTopicQuery; extern const char *EventsAfterQuery; extern const char *EventsBeforeQuery; extern const char *SearchQuery; @@ -102,6 +103,7 @@ extern struct Statements { sqlite3_stmt *networks; sqlite3_stmt *contexts; sqlite3_stmt *contextsMOTD; + sqlite3_stmt *eventsTopic; sqlite3_stmt *eventsAfter; sqlite3_stmt *eventsBefore; sqlite3_stmt *search; @@ -118,6 +120,7 @@ static inline void dbPrepareAll(void) { dbPrepare(&stmt.networks, NetworksQuery); dbPrepare(&stmt.contexts, ContextsQuery); dbPrepare(&stmt.contextsMOTD, ContextsMOTDQuery); + dbPrepare(&stmt.eventsTopic, EventsTopicQuery); dbPrepare(&stmt.eventsAfter, EventsAfterQuery); dbPrepare(&stmt.eventsBefore, EventsBeforeQuery); dbPrepare(&stmt.search, SearchQuery); @@ -127,6 +130,7 @@ static inline void dbClose(void) { sqlite3_finalize(stmt.networks); sqlite3_finalize(stmt.contexts); sqlite3_finalize(stmt.contextsMOTD); + sqlite3_finalize(stmt.eventsTopic); sqlite3_finalize(stmt.eventsAfter); sqlite3_finalize(stmt.eventsBefore); sqlite3_finalize(stmt.search); |