diff --git a/src/database.rs b/src/database.rs index 1032d8a..f7504c6 100644 --- a/src/database.rs +++ b/src/database.rs @@ -6,8 +6,7 @@ pub struct File { pub hash: String, } -pub fn setup() -> Result<()> { - let connection = sqlite::open(":memory:")?; +pub fn setup(connection: &sqlite::Connection) -> Result<()> { let query = "CREATE TABLE files (file_identifier STRING, hash STRING)"; match connection.execute(query) { Ok(_) => Ok(()), @@ -15,10 +14,9 @@ pub fn setup() -> Result<()> { } } -pub fn put(file: File) -> Result<()> { - let connection = sqlite::open(":memory:")?; +pub fn put(file: &File, connection: &sqlite::Connection) -> Result<()> { let query = format!( - "INSERT INTO files (file_identifier, hash) VALUES ({}, {})", + "INSERT INTO files (file_identifier, hash) VALUES (\"{}\", \"{}\")", file.path, file.hash ); let result = connection.execute(query)?; @@ -26,8 +24,7 @@ pub fn put(file: File) -> Result<()> { Ok(result) } -pub fn duplicate_hashes() -> Result> { - let connection = sqlite::open(":memory:")?; +pub fn duplicate_hashes(connection: &sqlite::Connection) -> Result> { let query = format!( " SELECT a.* FROM files a @@ -35,7 +32,7 @@ pub fn duplicate_hashes() -> Result> { FROM files GROUP BY hash HAVING count(*) > 1 ) b - ON a.file_identifier = b.file_identifier + ON a.hash = b.hash ORDER BY a.file_identifier " ); diff --git a/src/main.rs b/src/main.rs index 2f33c5d..b3056bd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,8 +7,11 @@ use anyhow::Result; #[tokio::main] async fn main() -> Result<()> { - database::setup()?; - let duplicates = scanner::duplicates(cli::App::parse())?; + let connection = sqlite::open(":memory:")?; + + database::setup(&connection)?; + + let duplicates = scanner::duplicates(cli::App::parse(), &connection)?; dbg!(duplicates); Ok(()) diff --git a/src/scanner.rs b/src/scanner.rs index b13ddc1..981ab16 100644 --- a/src/scanner.rs +++ b/src/scanner.rs @@ -6,9 +6,9 @@ use anyhow::Result; use glob::glob; use std::{fs, io}; -pub fn duplicates(app_opts: App) -> Result> { - index_files(scan(app_opts)?); - database::duplicate_hashes() +pub fn duplicates(app_opts: App, connection: &sqlite::Connection) -> Result> { + index_files(scan(app_opts)?, connection); + database::duplicate_hashes(connection) } fn scan(app_opts: App) -> Result> { @@ -46,7 +46,7 @@ fn scan(app_opts: App) -> Result> { Ok(files) } -fn index_files(files: Vec) { +fn index_files(files: Vec, connection: &sqlite::Connection) { files .into_iter() .map(|file| { @@ -54,7 +54,7 @@ fn index_files(files: Vec) { database::File { path: file, hash } }) .for_each(|file| { - database::put(file).unwrap(); + database::put(&file, connection).unwrap(); }); }