Ugh
This commit is contained in:
76
src/db.rs
76
src/db.rs
@@ -1,10 +1,10 @@
|
||||
use anyhow::{Context, Error, Result};
|
||||
use chrono::prelude::*;
|
||||
use lazy_static::lazy_static;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use log::*;
|
||||
use rusqlite::{Connection, OpenFlags, params};
|
||||
use rusqlite_migration::{M, Migrations};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::collections::HashMap;
|
||||
use std::path::PathBuf;
|
||||
use std::rc::Rc;
|
||||
@@ -245,7 +245,10 @@ pub fn insert_item(conn: &Connection, item: Item) -> Result<i64> {
|
||||
/// let item = db::create_item(&conn, compression)?;
|
||||
/// assert!(item.id.is_some());
|
||||
/// ```
|
||||
pub fn create_item(conn: &Connection, compression_type: crate::compression_engine::CompressionType) -> Result<Item> {
|
||||
pub fn create_item(
|
||||
conn: &Connection,
|
||||
compression_type: crate::compression_engine::CompressionType,
|
||||
) -> Result<Item> {
|
||||
let item = Item {
|
||||
id: None,
|
||||
ts: chrono::Utc::now(),
|
||||
@@ -353,11 +356,7 @@ pub fn update_item(conn: &Connection, item: Item) -> Result<()> {
|
||||
debug!("DB: Updating item: {:?}", item);
|
||||
conn.execute(
|
||||
"UPDATE items SET size=?2, compression=?3 WHERE id=?1",
|
||||
params![
|
||||
item.id,
|
||||
item.size,
|
||||
item.compression,
|
||||
],
|
||||
params![item.id, item.size, item.compression,],
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
@@ -1181,34 +1180,40 @@ pub fn get_item_meta_value(conn: &Connection, item: &Item, name: String) -> Resu
|
||||
/// let ids = vec![1, 2, 3];
|
||||
/// let tags_map = db::get_tags_for_items(&conn, &ids)?;
|
||||
/// ```
|
||||
pub fn get_tags_for_items(conn: &Connection, item_ids: &[i64]) -> Result<std::collections::HashMap<i64, Vec<Tag>>> {
|
||||
pub fn get_tags_for_items(
|
||||
conn: &Connection,
|
||||
item_ids: &[i64],
|
||||
) -> Result<std::collections::HashMap<i64, Vec<Tag>>> {
|
||||
debug!("DB: Getting tags for items: {:?}", item_ids);
|
||||
|
||||
|
||||
if item_ids.is_empty() {
|
||||
return Ok(std::collections::HashMap::new());
|
||||
}
|
||||
|
||||
|
||||
// Create placeholders for the IN clause
|
||||
let placeholders: Vec<String> = item_ids.iter().map(|_| "?".to_string()).collect();
|
||||
let placeholders_str = placeholders.join(",");
|
||||
|
||||
let sql = format!("SELECT id, name FROM tags WHERE id IN ({}) ORDER BY id ASC, name ASC", placeholders_str);
|
||||
|
||||
|
||||
let sql = format!(
|
||||
"SELECT id, name FROM tags WHERE id IN ({}) ORDER BY id ASC, name ASC",
|
||||
placeholders_str
|
||||
);
|
||||
|
||||
let mut statement = conn
|
||||
.prepare_cached(&sql)
|
||||
.context("Problem preparing SQL statement")?;
|
||||
|
||||
|
||||
let mut rows = statement.query(rusqlite::params_from_iter(item_ids))?;
|
||||
|
||||
|
||||
let mut tags_map: std::collections::HashMap<i64, Vec<Tag>> = std::collections::HashMap::new();
|
||||
|
||||
|
||||
while let Some(row) = rows.next()? {
|
||||
let id: i64 = row.get(0)?;
|
||||
let name: String = row.get(1)?;
|
||||
|
||||
tags_map.entry(id).or_insert_with(Vec::new).push(Tag { id, name });
|
||||
|
||||
tags_map.entry(id).or_default().push(Tag { id, name });
|
||||
}
|
||||
|
||||
|
||||
Ok(tags_map)
|
||||
}
|
||||
|
||||
@@ -1235,34 +1240,41 @@ pub fn get_tags_for_items(conn: &Connection, item_ids: &[i64]) -> Result<std::co
|
||||
/// let ids = vec![1, 2, 3];
|
||||
/// let meta_map = db::get_meta_for_items(&conn, &ids)?;
|
||||
/// ```
|
||||
pub fn get_meta_for_items(conn: &Connection, item_ids: &[i64]) -> Result<std::collections::HashMap<i64, std::collections::HashMap<String, String>>> {
|
||||
pub fn get_meta_for_items(
|
||||
conn: &Connection,
|
||||
item_ids: &[i64],
|
||||
) -> Result<std::collections::HashMap<i64, std::collections::HashMap<String, String>>> {
|
||||
debug!("DB: Getting meta for items: {:?}", item_ids);
|
||||
|
||||
|
||||
if item_ids.is_empty() {
|
||||
return Ok(std::collections::HashMap::new());
|
||||
}
|
||||
|
||||
|
||||
// Create placeholders for the IN clause
|
||||
let placeholders: Vec<String> = item_ids.iter().map(|_| "?".to_string()).collect();
|
||||
let placeholders_str = placeholders.join(",");
|
||||
|
||||
let sql = format!("SELECT id, name, value FROM metas WHERE id IN ({}) ORDER BY id ASC, name ASC", placeholders_str);
|
||||
|
||||
|
||||
let sql = format!(
|
||||
"SELECT id, name, value FROM metas WHERE id IN ({}) ORDER BY id ASC, name ASC",
|
||||
placeholders_str
|
||||
);
|
||||
|
||||
let mut statement = conn
|
||||
.prepare_cached(&sql)
|
||||
.context("Problem preparing SQL statement")?;
|
||||
|
||||
|
||||
let mut rows = statement.query(rusqlite::params_from_iter(item_ids))?;
|
||||
|
||||
let mut meta_map: std::collections::HashMap<i64, std::collections::HashMap<String, String>> = std::collections::HashMap::new();
|
||||
|
||||
|
||||
let mut meta_map: std::collections::HashMap<i64, std::collections::HashMap<String, String>> =
|
||||
std::collections::HashMap::new();
|
||||
|
||||
while let Some(row) = rows.next()? {
|
||||
let id: i64 = row.get(0)?;
|
||||
let name: String = row.get(1)?;
|
||||
let value: String = row.get(2)?;
|
||||
|
||||
meta_map.entry(id).or_insert_with(std::collections::HashMap::new).insert(name, value);
|
||||
|
||||
meta_map.entry(id).or_default().insert(name, value);
|
||||
}
|
||||
|
||||
|
||||
Ok(meta_map)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user