diff options
| author | Tristan Riehs <tristan.riehs@inria.fr> | 2025-11-17 09:42:50 +0100 |
|---|---|---|
| committer | Tristan Riehs <tristan.riehs@inria.fr> | 2025-11-17 09:42:50 +0100 |
| commit | 8fdc971154a54fb283915f546fa07fa92087fdc4 (patch) | |
| tree | 12bd372740c69fb4044ea51f43ec723c08579e15 /src/main.c | |
| parent | 8ffe93fa5acbe9b92c2daa204943312c81edd628 (diff) | |
Implement date query
Diffstat (limited to 'src/main.c')
| -rw-r--r-- | src/main.c | 41 |
1 files changed, 35 insertions, 6 deletions
@@ -428,21 +428,49 @@ static int print_all_callback(void *_print_header, int count, char **cols, char return 0; } +static void ftag_query_date(sqlite3 *db, char *sql, int max_len, + time_t before_date, time_t after_date) +{ + char buf[128]; + int need_and_keyword = 0; + strncat(sql, "\t(SELECT id,canonical_name,full_name FROM files", + max_len - strlen(sql)); + assert(strlen(sql) <= max_len); + if (before_date != 0) { + memset(buf, 0, sizeof(buf)); + snprintf(buf, sizeof(buf)-1, " WHERE date < %ld", before_date); + strncat(sql, buf, max_len - strlen(sql)); + assert(strlen(sql) <= max_len); + need_and_keyword = 1; + } + if (after_date != 0) { + if (need_and_keyword) + strncat(sql, " AND", max_len - strlen(sql)); + else + strncat(sql, " WHERE", max_len - strlen(sql)); + memset(buf, 0, sizeof(buf)); + snprintf(buf, sizeof(buf)-1, " date > %ld", after_date); + strncat(sql, buf, max_len - strlen(sql)); + assert(strlen(sql) <= max_len); + } + strncat(sql, ")\n", max_len - strlen(sql)); +} + /* Build the "join" part of the SQL query for the "ftag query" command. */ static void ftag_query_join(sqlite3 *db, char *sql, int max_len, - char **tags, int tag_count) + char **tags, int tag_count, + time_t before_date, time_t after_date) { assert(tag_count >= 0); if (tag_count == 0) { - strncat(sql, "\t(SELECT id,canonical_name,full_name FROM files)\n", - max_len - strlen(sql)); - assert(strlen(sql) <= max_len); + ftag_query_date(db, sql, max_len, before_date, after_date); return; } char *prefix = "\t(SELECT id,canonical_name,full_name FROM file_tags JOIN\n"; strncat(sql, prefix, max_len - strlen(sql)); assert(strlen(sql) <= max_len); - ftag_query_join(db, sql, max_len, tags, tag_count-1); + ftag_query_join(db, sql, max_len, + tags, tag_count-1, before_date, after_date); int tag_id = get_id_by_col(db, "tags", "name", tags[tag_count-1]); char suffix[128]; memset(suffix, 0, sizeof(suffix)); @@ -492,7 +520,8 @@ static void ftag_query(int argc, char **argv) sqlite3_check(rc, db); char sql_join[2048]; memset(sql_join, 0, sizeof(sql_join)); - ftag_query_join(db, sql_join, sizeof(sql_join)-1, tags, tag_count); + ftag_query_join(db, sql_join, sizeof(sql_join)-1, + tags, tag_count, before_date, after_date); memset(sql, 0, sizeof(sql)); snprintf(sql, sizeof(sql)-1, "SELECT id,canonical_name,full_name FROM (\n%s);\n", sql_join); |
