diff --git a/Cargo.lock b/Cargo.lock index 0246916..04ea6b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,27 +15,17 @@ dependencies = [ ] [[package]] -name = "allocator-api2" -version = "0.2.21" +name = "async-sqlite" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "async-rusqlite" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a22b15c9049bd1150f224cffdd3d8557357cf1b95d8ba2d4bcf854c0812a5d" +checksum = "4e420455ac3543544cbf17c36ff308807a6e62d7952e965c749dab53d860870c" dependencies = [ - "asyncified", + "crossbeam-channel", + "futures-channel", + "futures-util", "rusqlite", ] -[[package]] -name = "asyncified" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddbcf3c524e7338b7e791a2b2d82c478c89930f1ecd4a64bced1211392b6ccae" - [[package]] name = "autocfg" version = "1.4.0" @@ -87,6 +77,21 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "crossbeam-channel" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + [[package]] name = "equivalent" version = "1.0.1" @@ -95,9 +100,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "fallible-iterator" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" [[package]] name = "fallible-streaming-iterator" @@ -433,7 +438,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", - "allocator-api2", ] [[package]] @@ -444,9 +448,9 @@ checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "hashlink" -version = "0.8.4" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" dependencies = [ "hashbrown 0.14.5", ] @@ -506,9 +510,9 @@ checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libsqlite3-sys" -version = "0.26.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" dependencies = [ "pkg-config", "vcpkg", @@ -606,9 +610,9 @@ dependencies = [ [[package]] name = "rusqlite" -version = "0.29.0" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "549b9d036d571d42e6e85d1c1425e2ac83491075078ca9a15be021c56b1641f2" +checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e" dependencies = [ "bitflags", "fallible-iterator", @@ -871,7 +875,7 @@ dependencies = [ name = "zoodex" version = "1.0.0" dependencies = [ - "async-rusqlite", + "async-sqlite", "fallible-iterator", "gtk4", "libadwaita", diff --git a/Cargo.toml b/Cargo.toml index e766a54..b2b1039 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later" lto = true [ dependencies ] -async-rusqlite = "0.4.0" -fallible-iterator = "0.2.0" # Must match version used by async-rusqlite +async-sqlite = { version = "0.3.1" , default-features = false } +fallible-iterator = "0.3.0" # Must match version used by async-sqlite gtk4 = { version = "0.9.2" , features = [ "v4_16" ] } libadwaita = { version = "0.7.0" , features = [ "v1_6" ] } diff --git a/src/error.rs b/src/error.rs index ad46530..0de1aec 100644 --- a/src/error.rs +++ b/src/error.rs @@ -3,7 +3,7 @@ use std :: { * , any :: * , future :: * } ; # [ derive (Debug) ] pub enum ZoodexError { - CollectionFileError , + CollectionFileReadError , } pub type Result = result :: Result < Success , ZoodexError > ; diff --git a/src/main.rs b/src/main.rs index 97a583c..44fca61 100644 --- a/src/main.rs +++ b/src/main.rs @@ -31,7 +31,7 @@ fn on_activate ( app : & Application ) { } , |error| { match error { - CollectionFileError => eprintln ! ("Could not open collection file") , + CollectionFileReadError => eprintln ! ("Could not read collection file") , } ; ui . close_window () ; } , diff --git a/src/persistence.rs b/src/persistence.rs index 844e11e..32f3776 100644 --- a/src/persistence.rs +++ b/src/persistence.rs @@ -1,7 +1,8 @@ use { - async_rusqlite :: { + async_sqlite :: { * , - rusqlite :: { Error , OpenFlags , Error :: * , ffi :: ErrorCode :: * } , + Error :: * , + rusqlite :: { OpenFlags , Error :: * , ffi :: ErrorCode :: * } , } , fallible_iterator :: * , std :: path :: * , @@ -12,57 +13,74 @@ use crate :: { collection :: * , error :: { * , ZoodexError :: * } } ; pub async fn get_collection_from_file () -> Result { - let sqlite_connection = Connection :: builder () . open_with_flags ( - "zoodex.sqlite" , - OpenFlags :: SQLITE_OPEN_READ_ONLY | OpenFlags :: SQLITE_OPEN_NO_MUTEX , - ) . await ? ; + let sqlite_client = ClientBuilder :: new () + . path ("zoodex.sqlite") + . flags ( OpenFlags :: SQLITE_OPEN_READ_ONLY | OpenFlags :: SQLITE_OPEN_NO_MUTEX ) + . open () + . await ? ; - sqlite_connection . call ( |sqlite_connection| { - let mut films_query = sqlite_connection - . prepare ("select * from films order by release_date desc") ? ; - let films = films_query . query (()) ? . map ( |row| { - let uuid = row . get (0) ? ; - let name = row . get (1) ? ; - let original_name = row . get (2) ? ; - let release_date = row . get (3) ? ; - let runtime_minutes = row . get (4) ? ; - let poster_file_path = row . get :: < _ , Option > (5) ? - . map ( PathBuf :: from ) ; - let video_file_path = row . get :: < _ , Option > (6) ? - . map ( PathBuf :: from ) ; + let collection = sqlite_client . conn ( |sqlite_connection| { + let films = sqlite_connection + . prepare ("select * from films order by release_date desc") ? + . query (()) ? + . map ( |row| { + let uuid = row . get (0) ? ; + let name = row . get (1) ? ; + let original_name = row . get (2) ? ; + let release_date = row . get (3) ? ; + let runtime_minutes = row . get (4) ? ; + let poster_file_path = row . get :: < _ , Option > (5) ? + . map ( PathBuf :: from ) ; + let video_file_path = row . get :: < _ , Option > (6) ? + . map ( PathBuf :: from ) ; - Ok ( Film { - uuid , - name , - original_name , - release_date , - runtime_minutes , - poster_file_path , - video_file_path , + Ok ( Film { + uuid , + name , + original_name , + release_date , + runtime_minutes , + poster_file_path , + video_file_path , + } ) } ) - } ) . collect () ? ; + . collect () ? ; - let mut series_query = sqlite_connection . prepare ("select * from series") ? ; - let series = series_query . query (()) ? . map ( |row| { - let uuid = row . get (0) ? ; - let name = row . get (1) ? ; - let original_name = row . get (2) ? ; - let poster_file_path = row . get :: < _ , Option > (3) ? - . map ( PathBuf :: from ) ; + let series = sqlite_connection + . prepare ("select * from series") ? + . query (()) ? + . map ( |row| { + let uuid = row . get (0) ? ; + let name = row . get (1) ? ; + let original_name = row . get (2) ? ; + let poster_file_path = row. get :: < _ , Option > (3) ? + . map ( PathBuf :: from ) ; - Ok ( Series { uuid , name , original_name , poster_file_path } ) - } ) . collect () ? ; + Ok ( Series { uuid , name , original_name , poster_file_path } ) + } ) + . collect () ? ; Ok ( Collection { films , series } ) - } ) . await + } ) . await ? ; + + Ok (collection) } impl From for ZoodexError { fn from ( error : Error ) -> Self { + match error { + Rusqlite (error) => ZoodexError :: from (error) , + _ => panic ! () , + } + } +} + +impl From < rusqlite :: Error > for ZoodexError { + fn from ( error : rusqlite :: Error ) -> Self { match error { SqliteFailure ( error , _ ) => { match error . code { - Unknown => CollectionFileError , + CannotOpen => CollectionFileReadError , _ => panic ! () , } } , @@ -70,7 +88,3 @@ impl From for ZoodexError { } } } - -impl From for ZoodexError { - fn from ( _ : AlreadyClosed ) -> Self { CollectionFileError } -}