From f1751882be545c3cff7791d1ab87dd51e27617c8 Mon Sep 17 00:00:00 2001 From: Reinout Meliesie Date: Sun, 22 Dec 2024 21:02:39 +0100 Subject: [PATCH] Make get_collection_from_file async --- Cargo.lock | 41 ++++++++++++++++++----- Cargo.toml | 4 +-- src/main.rs | 9 ++--- src/persistence.rs | 82 ++++++++++++++++++++++++++-------------------- 4 files changed, 83 insertions(+), 53 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 24e166f..f4c48c6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,6 +14,28 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "allocator-api2" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" + +[[package]] +name = "async-rusqlite" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a22b15c9049bd1150f224cffdd3d8557357cf1b95d8ba2d4bcf854c0812a5d" +dependencies = [ + "asyncified", + "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" @@ -73,9 +95,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "fallible-iterator" -version = "0.3.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "fallible-streaming-iterator" @@ -411,6 +433,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", + "allocator-api2", ] [[package]] @@ -421,9 +444,9 @@ checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" [[package]] name = "hashlink" -version = "0.9.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ "hashbrown 0.14.5", ] @@ -483,9 +506,9 @@ checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libsqlite3-sys" -version = "0.30.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326" dependencies = [ "pkg-config", "vcpkg", @@ -583,9 +606,9 @@ dependencies = [ [[package]] name = "rusqlite" -version = "0.32.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e" +checksum = "549b9d036d571d42e6e85d1c1425e2ac83491075078ca9a15be021c56b1641f2" dependencies = [ "bitflags", "fallible-iterator", @@ -848,8 +871,8 @@ dependencies = [ name = "zoodex" version = "1.0.0" dependencies = [ + "async-rusqlite", "fallible-iterator", "gtk4", "libadwaita", - "rusqlite", ] diff --git a/Cargo.toml b/Cargo.toml index a3238a9..e766a54 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later" lto = true [ dependencies ] -fallible-iterator = "0.3.0" +async-rusqlite = "0.4.0" +fallible-iterator = "0.2.0" # Must match version used by async-rusqlite gtk4 = { version = "0.9.2" , features = [ "v4_16" ] } libadwaita = { version = "0.7.0" , features = [ "v1_6" ] } -rusqlite = "0.32.1" diff --git a/src/main.rs b/src/main.rs index 6039b6d..97a583c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,10 +4,7 @@ mod persistence ; mod ui ; mod utility ; -use { - gtk4 :: { gio :: spawn_blocking , glib :: * } , - libadwaita :: { * , prelude :: * } , -} ; +use { gtk4 :: glib :: * , libadwaita :: { * , prelude :: * } } ; use crate :: { error :: { * , ZoodexError :: * } , persistence :: * , ui :: * } ; @@ -28,10 +25,8 @@ fn on_activate ( app : & Application ) { spawn_future_local ( async move { async_unit_result_context ( async { - let collection = spawn_blocking ( || - get_collection_from_file () ) . await ? ? ; + let collection = get_collection_from_file () . await ? ; ui . render_collection (collection) ; - Ok (()) } , |error| { diff --git a/src/persistence.rs b/src/persistence.rs index de7f691..844e11e 100644 --- a/src/persistence.rs +++ b/src/persistence.rs @@ -1,6 +1,9 @@ use { + async_rusqlite :: { + * , + rusqlite :: { Error , OpenFlags , Error :: * , ffi :: ErrorCode :: * } , + } , fallible_iterator :: * , - rusqlite :: { Connection , Error , Error :: * , ffi :: ErrorCode :: * } , std :: path :: * , } ; @@ -8,45 +11,50 @@ use crate :: { collection :: * , error :: { * , ZoodexError :: * } } ; -pub fn get_collection_from_file () -> Result { - let sqlite_connection = Connection :: open ("zoodex.sqlite") ? ; +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 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 ) ; + 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 ) ; - Ok ( Film { - uuid , - name , - original_name , - release_date , - runtime_minutes , - poster_file_path , - video_file_path , - } ) - } ) . collect () ? ; + Ok ( Film { + uuid , + name , + original_name , + release_date , + runtime_minutes , + poster_file_path , + video_file_path , + } ) + } ) . 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 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 ) ; - Ok ( Series { uuid , name , original_name , poster_file_path } ) - } ) . collect () ? ; + Ok ( Series { uuid , name , original_name , poster_file_path } ) + } ) . collect () ? ; - Ok ( Collection { films , series } ) + Ok ( Collection { films , series } ) + } ) . await } impl From for ZoodexError { @@ -62,3 +70,7 @@ impl From for ZoodexError { } } } + +impl From for ZoodexError { + fn from ( _ : AlreadyClosed ) -> Self { CollectionFileError } +}