diff options
Diffstat (limited to 'src/main.c')
| -rw-r--r-- | src/main.c | 70 |
1 files changed, 69 insertions, 1 deletions
@@ -1010,11 +1010,79 @@ static void ftag_tag_add(int argc, char **argv) free(new_tag_desc); } +static int tag_edit_desc_callback(void *_old, int, char **cols, char **) +{ + char **old = _old; + assert(cols); + assert(cols[0]); + *old = strdup(cols[0]); + return 0; +} + +static void ftag_tag_edit(int argc, char **argv) +{ + if (argc < 1) { + fprintf(stderr, "Usage: ftag tag edit [-h] [-n] NAME...\n"); + exit(EXIT_FAILURE); + } + int opt; + int edit_name = 0; + char *column_name; + char *optstring = "hn"; + char *tag_name = NULL; + sqlite3 *db; + int rc; + char sql[512]; + char *old; + char *new; + optind = 1; + while ((opt = getopt(argc, argv, optstring)) != -1) { + switch (opt) { + case 'h': + printf("Usage: ftag tag edit [-h] [-n] NAME...\n"); + exit(EXIT_SUCCESS); + case 'n': + edit_name = 1; + break; + case '?': + default: + fprintf(stderr, "Usage: ftag tag edit [-h] [-n] NAME...\n"); + exit(EXIT_FAILURE); + } + } + tag_name = argv[optind]; + /* TODO: check that tag exists */ + db = ftag_db_open(); + if (edit_name) { + column_name = "name"; + old = strdup(tag_name); + } + else { + column_name = "description"; + strbuild(sql, "SELECT description FROM tags WHERE name = '%s';", + tag_name); + rc = sqlite3_exec(db, sql, tag_edit_desc_callback, &old, NULL); + sqlite3_check(rc, db); + } + new = edit(old); + printf("%s: old content: %s\n", __func__, old); + printf("%s: new content: %s\n", __func__, new); + sanitize_sql_str(&new); + /* TODO: fix isse with UTF-8 and sanitize_sql_str */ + strbuild(sql, "UPDATE tags SET %s = '%s' WHERE name = '%s';", column_name, new, tag_name); + rc = sqlite3_exec(db, sql, NULL, NULL, NULL); + sqlite3_check(rc, db); + free(old); + free(new); + sqlite3_close(db); +} + static void ftag_tag_help(int, char **) { puts("Usage: ftag tag COMMAND [ARG]..."); puts("Available values for COMMAND:"); puts(" add create new tags"); + puts(" edit edit a tag"); puts(" help print this help"); puts(" list list available tags"); } @@ -1029,10 +1097,10 @@ static void ftag_tag(int argc, char **argv) assert_db_exists(); const struct ftag_command tag_commands[] = { {.name = "add", .func = ftag_tag_add}, + {.name = "edit", .func = ftag_tag_edit}, {.name = "help", .func = ftag_tag_help}, {.name = "list", .func = ftag_tag_list} /* TODO: add an alias command */ - /* TODO: add an edit command */ }; int tag_command_count = sizeof(tag_commands) / sizeof(struct ftag_command); parse_args(argc - 1, argv + 1, tag_commands, tag_command_count); |
