diff options
| author | Tristan Riehs <tristan.riehs@inria.fr> | 2025-11-14 20:14:02 +0100 |
|---|---|---|
| committer | Tristan Riehs <tristan.riehs@inria.fr> | 2025-11-14 20:14:02 +0100 |
| commit | 72fbf9ff67b82d8576bdd2633e3227230ca83ad0 (patch) | |
| tree | 1446b750aa940dcd39c1a0c791cb0b30c9c5f62a /src | |
| parent | c9f9e28aebce9a86755aa141c47103f76aff4d08 (diff) | |
Progress on ftag query
Query works for a single tag. Multi-tag SQL query looks fine but does
not work.
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.c | 39 |
1 files changed, 28 insertions, 11 deletions
@@ -393,6 +393,29 @@ static int print_all_callback(void *_print_header, int count, char **cols, char return 0; } +/* 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) +{ + 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); + 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); + char suffix[128]; + memset(suffix, 0, sizeof(suffix)); + snprintf(suffix, sizeof(suffix)-1, + "\t\tON id = file\n\t\tWHERE tag = %d)\n", tag_count-1); + strncat(sql, suffix, max_len - strlen(sql)); + assert(strlen(sql) <= max_len); +} + static void ftag_query(int argc, char **argv) { if (argc == 0) { @@ -427,22 +450,16 @@ static void ftag_query(int argc, char **argv) argv += 2; } char sql[4096]; - char sql_join[2048]; sqlite3 *db; int rc; rc = sqlite3_open(DATABASE_PATH, &db); sqlite3_check(rc, db); - for (int join_idx = 0; join_idx < tag_count; join_idx++) { - int tag_id = get_id_by_col(db, "tags", "name", tags[join_idx]); - memset(sql_join, 0, sizeof(sql_join)); - snprintf(sql_join, sizeof(sql_join)-1, - "\t(SELECT id,canonical_name,full_name\n" - " FROM (files JOIN file_tags ON id = file)\n" - " WHERE tag = %d)\n", tag_id); - strcat(sql, sql_join); - } + char sql_join[2048]; + memset(sql_join, 0, sizeof(sql_join)); + ftag_query_join(db, sql_join, sizeof(sql_join)-1, tags, tag_count); memset(sql, 0, sizeof(sql)); - snprintf(sql, sizeof(sql)-1, "SELECT id,canonical_name,full_name FROM (\n%s);\n", sql_join); + snprintf(sql, sizeof(sql)-1, + "SELECT id,canonical_name,full_name FROM (\n%s);\n", sql_join); printf("%s: debug: SQL query is:\n%s", __func__, sql); int print_header = 1; rc = sqlite3_exec(db, sql, print_all_callback, &print_header, NULL); |
