From 7c516fbd25909f34e0f34c86bb9e33b35fa94093 Mon Sep 17 00:00:00 2001 From: Jamie Date: Fri, 1 Oct 2021 14:11:28 -0700 Subject: [PATCH] getting somewhere? --- src-tauri/Cargo.lock | 22 +++++++++ src-tauri/Cargo.toml | 4 +- src-tauri/src/commands.rs | 3 +- src-tauri/src/db/entity/file.rs | 41 ++++++++++++++++ src-tauri/src/db/entity/mod.rs | 1 + src-tauri/src/db/mod.rs | 1 + src-tauri/src/filesystem/file.rs | 82 +++++++++++--------------------- src-tauri/src/main.rs | 7 +++ 8 files changed, 103 insertions(+), 58 deletions(-) create mode 100644 src-tauri/src/db/entity/file.rs create mode 100644 src-tauri/src/db/entity/mod.rs diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 92935cec7..001daaad5 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1175,6 +1175,19 @@ dependencies = [ "syn 1.0.74", ] +[[package]] +name = "env_logger" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + [[package]] name = "env_proxy" version = "0.4.1" @@ -1812,6 +1825,12 @@ dependencies = [ "itoa", ] +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + [[package]] name = "ico" version = "0.1.0" @@ -3328,8 +3347,10 @@ dependencies = [ "chrono", "crossbeam", "data-encoding", + "env_logger", "futures", "int-enum", + "log", "rebind", "refinery", "ring 0.17.0-alpha.10", @@ -3354,6 +3375,7 @@ dependencies = [ "chrono", "futures", "futures-util", + "log", "rust_decimal", "sea-orm-macros", "sea-query", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 4298c1247..964d71399 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -28,7 +28,9 @@ int-enum = "0.4.0" rusqlite = "0.25.3" refinery = { version = "0.6.0", features = ["rusqlite"] } sqlx = { version = "0.5.7", features = ["sqlite"] } -sea-orm = { version = "^0", features = [ "sqlx-sqlite", "runtime-async-std-rustls", "macros" ], default-features = false } +sea-orm = { version = "^0", features = [ "sqlx-sqlite", "runtime-async-std-rustls", "macros", "debug-print" ], default-features = false } +env_logger = "0.9.0" +log = "0.4.14" [features] default = [ "custom-protocol" ] diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index da3f05391..a209bca1d 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -1,6 +1,5 @@ -use crate::filesystem::checksum; +// use crate::filesystem::checksum; use crate::filesystem::file; -use crate::filesystem::file::File; use tauri::InvokeError; diff --git a/src-tauri/src/db/entity/file.rs b/src-tauri/src/db/entity/file.rs new file mode 100644 index 000000000..1404ac148 --- /dev/null +++ b/src-tauri/src/db/entity/file.rs @@ -0,0 +1,41 @@ +use chrono::NaiveDateTime; +use sea_orm::entity::prelude::*; +use serde::{Deserialize, Serialize}; + +// ------------------------------------- +// Entity: File +// Represents an item discovered on the filesystem +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, DeriveEntityModel, Default)] +#[sea_orm(table_name = "files")] +// ------------------------------------- +pub struct Model { + // identity + #[sea_orm(primary_key)] + pub id: u32, + pub buffer_checksum: String, + pub meta_checksum: String, + pub uri: String, + // metadata + pub name: String, + pub extension: String, + pub size_in_bytes: String, + // pub encryption: crypto::Encryption, + #[sea_orm(nullable)] + pub ipfs_id: Option, + // ownership + #[sea_orm(nullable)] + pub storage_device_id: Option, + #[sea_orm(nullable)] + pub capture_device_id: Option, + #[sea_orm(nullable)] + pub parent_file_id: Option, + // date + pub date_created: Option, + pub date_modified: Option, + pub date_indexed: Option, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation {} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/src-tauri/src/db/entity/mod.rs b/src-tauri/src/db/entity/mod.rs new file mode 100644 index 000000000..2e172cd0f --- /dev/null +++ b/src-tauri/src/db/entity/mod.rs @@ -0,0 +1 @@ +pub mod file; diff --git a/src-tauri/src/db/mod.rs b/src-tauri/src/db/mod.rs index 96e5461de..1ba757968 100644 --- a/src-tauri/src/db/mod.rs +++ b/src-tauri/src/db/mod.rs @@ -1,2 +1,3 @@ pub mod connection; +pub mod entity; // pub mod migrate; diff --git a/src-tauri/src/filesystem/file.rs b/src-tauri/src/filesystem/file.rs index afd792028..32f29308c 100644 --- a/src-tauri/src/filesystem/file.rs +++ b/src-tauri/src/filesystem/file.rs @@ -1,87 +1,59 @@ -use crate::crypto; use crate::db; use crate::filesystem::checksum; use crate::util::time; -use chrono::{NaiveDateTime, Utc}; -use sea_orm::entity::prelude::*; use sea_orm::entity::*; -use sea_orm::InsertResult; -use serde::{Deserialize, Serialize}; +use sea_orm::QueryFilter; use std::ffi::OsStr; use std::fs; use std::io; use std::path; -// ------------------------------------- -// Entity: File -// Represents an item discovered on the filesystem -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, DeriveEntityModel)] -#[sea_orm(table_name = "files")] -// ------------------------------------- -pub struct Model { - // identity - #[sea_orm(primary_key)] - pub id: u32, - pub buffer_checksum: String, - pub meta_checksum: String, - pub uri: String, - // metadata - pub name: String, - pub extension: String, - pub size_in_bytes: String, - // pub encryption: crypto::Encryption, - #[sea_orm(nullable)] - pub ipfs_id: Option, - // ownership - #[sea_orm(nullable)] - pub storage_device_id: Option, - #[sea_orm(nullable)] - pub capture_device_id: Option, - #[sea_orm(nullable)] - pub parent_file_id: Option, - // date - pub date_created: NaiveDateTime, - pub date_modified: NaiveDateTime, - pub date_indexed: NaiveDateTime, -} - -pub type File = ActiveModel; - -#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} - -impl ActiveModelBehavior for ActiveModel {} +use crate::db::entity::file; // Read a file from path returning the File struct // Generates meta checksum and extracts metadata -pub async fn read_file(path: &str) -> io::Result { +pub async fn read_file(path: &str) -> io::Result { let db = db::connection::get_connection().await.unwrap(); let path_buff = path::PathBuf::from(path); let metadata = fs::metadata(&path)?; - if metadata.is_dir() { - // return Err(); - } - let size = metadata.len(); let meta_checksum = checksum::create_meta_hash(path.to_owned(), size)?; - let file = File { + let existing_file = file::Entity::find() + .filter(file::Column::MetaChecksum.contains(&meta_checksum)) + .all(&db) + .await + .unwrap(); + + println!("Existing file found {:?}", existing_file); + + let file = file::ActiveModel { meta_checksum: Set(meta_checksum), name: Set(extract_name(path_buff.file_name())), extension: Set(extract_name(path_buff.extension())), uri: Set(path.to_owned()), size_in_bytes: Set(format!("{}", size)), - date_created: Set(time::system_time_to_date_time(metadata.created()).unwrap()), - date_modified: Set(time::system_time_to_date_time(metadata.modified()).unwrap()), - date_indexed: Set(time::system_time_to_date_time(metadata.modified()).unwrap()), + date_created: Set(Some( + time::system_time_to_date_time(metadata.created()).unwrap(), + )), + date_modified: Set(Some( + time::system_time_to_date_time(metadata.modified()).unwrap(), + )), + date_indexed: Set(Some( + time::system_time_to_date_time(metadata.modified()).unwrap(), + )), ..Default::default() }; - let res = file.insert(&db).await.unwrap(); + let file = file + .save(&db) + .await + .map_err(|error| println!("Failed to read file: {}", error)) + .unwrap(); - Ok(res) + Ok(file) } // extract name from OsStr returned by PathBuff diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 9338145d4..86e263e5e 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -10,9 +10,16 @@ mod db; mod filesystem; mod util; use crate::app::menu; +use env_logger; use futures::executor::block_on; +use log; fn main() { + env_logger::builder() + .filter_level(log::LevelFilter::Debug) + .is_test(true) + .init(); + let connection = db::connection::create_primary_db(); let primary_db = block_on(connection).unwrap();