aboutsummaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c70
1 files changed, 69 insertions, 1 deletions
diff --git a/src/main.c b/src/main.c
index a9ab73b..912cfde 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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);