From 87bec5ac3091bfd193af3bc91146164774c1f61e Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Tue, 31 Dec 2019 16:47:54 -0500 Subject: Add option to group events by context --- scoop.1 | 9 +++++++-- scoop.c | 14 +++++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/scoop.1 b/scoop.1 index 823e5ee..a9a40c0 100644 --- a/scoop.1 +++ b/scoop.1 @@ -8,7 +8,7 @@ . .Sh SYNOPSIS .Nm -.Op Fl pqv +.Op Fl gpqv .Op Fl D Ar date .Op Fl N Ar network .Op Fl T Ar target @@ -43,7 +43,9 @@ The arguments are as follows: Match events which occurred on .Ar date , of the format -.Ar YYYY-MM-DD . +.Ar YYYY-MM-DD +or the keyword +.Cm now . . .It Fl N Ar network Match events from contexts on @@ -72,6 +74,9 @@ The database must have been initialized by The default path is as in .Xr litterbox 1 . . +.It Fl g +Group events by context. +. .It Fl h Ar host Match events from users with the hostname .Ar host . diff --git a/scoop.c b/scoop.c index 5855e70..1f031e2 100644 --- a/scoop.c +++ b/scoop.c @@ -29,6 +29,7 @@ static const char *Inner = SQL( SELECT contexts.network, contexts.name AS context, + // TODO: Replace with a strftime and option. date(events.time) || 'T' || time(events.time) || 'Z' AS time, events.type, names.nick, @@ -66,6 +67,11 @@ static const char *Outer = SQL( ORDER BY time, event ); +static const char *Group = SQL( + SELECT * FROM results + ORDER BY network, context, time, event +); + typedef void Format( const char *network, const char *context, const char *time, enum Type type, const char *nick, const char *user, const char *target, const char *message @@ -176,15 +182,17 @@ int main(int argc, char *argv[]) { const char *target = NULL; const char *search = NULL; int limit = -1; + bool group = false; int opt; - while (0 < (opt = getopt(argc, argv, "D:N:T:c:d:h:l:n:pqst:u:v"))) { + while (0 < (opt = getopt(argc, argv, "D:N:T:c:d:gh:l:n:pqst:u:v"))) { switch (opt) { break; case 'D': date = optarg; break; case 'N': network = optarg; break; case 'T': target = optarg; break; case 'c': context = optarg; break; case 'd': path = optarg; + break; case 'g': group = true; break; case 'h': host = optarg; break; case 'l': limit = strtol(optarg, NULL, 0); break; case 'n': nick = optarg; @@ -244,13 +252,13 @@ int main(int argc, char *argv[]) { snprintf( sql, sizeof(sql), "WITH results AS (%s AND %s %s) %s;", - Inner, Search, Limit, Outer + Inner, Search, Limit, (group ? Group : Outer) ); } else { snprintf( sql, sizeof(sql), "WITH results AS (%s %s) %s;", - Inner, Limit, Outer + Inner, Limit, (group ? Group : Outer) ); } -- cgit 1.4.1 f='/src/commit/bin/bit.y?id=86891cd638ad3481e58d79952e1b3131d14ac44a&follow=1'>Remove empty comma statement from bitJune McEnroe 2021-01-01Increment license header templatesJune McEnroe 2020-12-31Tell "Music" rather than "iTunes"June McEnroe 2020-12-31Add ASCII control code names to bitJune McEnroe 2020-12-31Simplify bit lexing and parsingJune McEnroe 2020-12-31Add ddateJune McEnroe 2020-12-30Print octal for 8 bits in bitJune McEnroe 2020-12-30Add unary & to bitJune McEnroe 2020-12-30Support unary + in orderJune McEnroe 2020-12-30Add postfix $ operator to bitJune McEnroe 2020-12-29Add make lexerJune McEnroe 2020-12-29Clean up C lexerJune McEnroe 2020-12-29Clean up hilex code somewhatJune McEnroe 2020-12-29Match lex/yacc %% %{ %} lines as MacroJune McEnroe 2020-12-29Match top-level C definitions as IdentifierTagJune McEnroe 2020-12-29Match C type declarations as IdentifierTagJune McEnroe 2020-12-29Match function-like macro definitions as IdentifierTagJune McEnroe 2020-12-29Reconfigure C macro start conditionsJune McEnroe 2020-12-29Document HTML class namesJune McEnroe 2020-12-29Rename Tag class to IdentifierTagJune McEnroe 2020-12-29Change HTML class from hi to hilexJune McEnroe 2020-12-29Add hilex HTML outputJune McEnroe