diff --git a/src/cli.rs b/src/cli.rs index 8ddf06b..9bd8b92 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -30,6 +30,7 @@ pub enum TagsCommands { List, Add { add: Vec }, Remove { remove: Vec }, + Rename { old: String, new: String }, } #[derive(Debug, Args, PartialEq, Eq)] diff --git a/src/main.rs b/src/main.rs index 471383a..9ca41be 100644 --- a/src/main.rs +++ b/src/main.rs @@ -50,7 +50,8 @@ fn init_db(conn: &Connection) { conn.execute( r#"CREATE TABLE IF NOT EXISTS file_tag( file_id INT REFERENCES file(id), - tag_id INT REFERENCES tag(id) + tag_id INT REFERENCES tag(id), + PRIMARY KEY (file_id, tag_id) );"#, (), ) diff --git a/src/tags.rs b/src/tags.rs index b1d50af..759b596 100644 --- a/src/tags.rs +++ b/src/tags.rs @@ -68,7 +68,7 @@ pub fn handle_tag(args: TagArgs) { pub fn handle_tags(args: TagsArgs) { try_database(); - let conn = Connection::open(DB_PATH).unwrap(); + let mut conn = Connection::open(DB_PATH).unwrap(); match args.commands { Some(cli::TagsCommands::List) | None => { @@ -79,11 +79,20 @@ pub fn handle_tags(args: TagsArgs) { } w.flush().unwrap(); } - Some(cli::TagsCommands::Add { add }) => add_tags(&conn, add), + Some(cli::TagsCommands::Add { add }) => add_tags(&mut conn, add), Some(cli::TagsCommands::Remove { remove }) => remove_tags(&conn, remove), + Some(cli::TagsCommands::Rename { old, new }) => rename_tag(&conn, old, new), }; } +fn rename_tag(conn: &Connection, old: String, new: String) { + let mut stmt = conn + .prepare("UPDATE tag SET name = ? WHERE name = ?") + .unwrap(); + + stmt.execute([&new, &old]).unwrap(); +} + fn list_tags(conn: &Connection) -> Vec { let mut stmt = conn.prepare("SELECT name FROM tag").unwrap(); let result = stmt.query_map([], |row| row.get(0)).unwrap(); @@ -111,17 +120,21 @@ fn remove_tags(conn: &Connection, tags: Vec) { conn.execute(&query, params_from_iter(tags)).unwrap(); } -fn add_tags(conn: &Connection, tags: Vec) { - let mut query = r#"INSERT INTO tag(name) VALUES"#.to_string(); +fn add_tags(conn: &mut Connection, tags: Vec) { + let tx = conn.transaction().unwrap(); + { + let mut query = r#"INSERT INTO tag(name) VALUES"#.to_string(); - for (i, _tag) in tags.iter().enumerate() { - query.push_str("(?)"); - if i < tags.len() - 1 { - query.push(','); + for (i, _tag) in tags.iter().enumerate() { + query.push_str("(?)"); + if i < tags.len() - 1 { + query.push(','); + } } - } - conn.execute(&query, params_from_iter(tags)).unwrap(); + tx.execute(&query, params_from_iter(tags)).unwrap(); + } + tx.commit().unwrap(); } fn tag_file(conn: &mut Connection, file: PathBuf, tags: Vec) {