refactor: decouple meta plugins from DB via SaveMetaFn callback, extract shared utilities
- Add SaveMetaFn callback pattern: meta plugins receive a closure instead of
&Connection, enabling the same plugin code to work in local, client, and
server contexts (collect-to-Vec, collect-to-HashMap, or direct DB write)
- Client save now runs meta plugins locally during streaming (smart client
sets meta=false, server skips its own plugins)
- Add POST /api/item/{id}/update endpoint for re-running plugins on stored
content without downloading compressed data
- Add client update mode (--update with --meta-plugin flags)
- Extract shared utilities: stream_copy, print_serialized, build_path_table,
ensure_default_tag to reduce duplication across modes
- Add upsert_tag for idempotent tag addition (INSERT OR IGNORE)
- Add warn logging on save_meta lock failure in BaseMetaPlugin and MetaService
This commit is contained in:
12
src/db.rs
12
src/db.rs
@@ -337,6 +337,18 @@ pub fn add_tag(conn: &Connection, item_id: i64, tag_name: &str) -> Result<()> {
|
||||
insert_tag(conn, tag)
|
||||
}
|
||||
|
||||
/// Adds a tag to an item, ignoring if the tag already exists.
|
||||
///
|
||||
/// Uses `INSERT OR IGNORE` to make the operation idempotent.
|
||||
pub fn upsert_tag(conn: &Connection, item_id: i64, tag_name: &str) -> Result<()> {
|
||||
debug!("DB: Upserting tag: item={item_id}, tag={tag_name}");
|
||||
conn.execute(
|
||||
"INSERT OR IGNORE INTO tags (id, name) VALUES (?1, ?2)",
|
||||
params![item_id, tag_name],
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Adds metadata to an item.
|
||||
///
|
||||
/// Inserts a new metadata entry in the `metas` table.
|
||||
|
||||
Reference in New Issue
Block a user