aboutsummaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
authorTristan Riehs <tristan.riehs@inria.fr>2025-11-17 09:42:50 +0100
committerTristan Riehs <tristan.riehs@inria.fr>2025-11-17 09:42:50 +0100
commit8fdc971154a54fb283915f546fa07fa92087fdc4 (patch)
tree12bd372740c69fb4044ea51f43ec723c08579e15 /src/main.c
parent8ffe93fa5acbe9b92c2daa204943312c81edd628 (diff)
Implement date query
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c41
1 files changed, 35 insertions, 6 deletions
diff --git a/src/main.c b/src/main.c
index af74c2c..acf25cc 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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);