Make get_collection_from_file async
This commit is contained in:
parent
183efaa047
commit
f1751882be
4 changed files with 83 additions and 53 deletions
41
Cargo.lock
generated
41
Cargo.lock
generated
|
@ -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",
|
||||
]
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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| {
|
||||
|
|
|
@ -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 <Collection> {
|
||||
let sqlite_connection = Connection :: open ("zoodex.sqlite") ? ;
|
||||
pub async fn get_collection_from_file () -> Result <Collection> {
|
||||
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 <String> > (5) ?
|
||||
. map ( PathBuf :: from ) ;
|
||||
let video_file_path = row . get :: < _ , Option <String> > (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 <String> > (5) ?
|
||||
. map ( PathBuf :: from ) ;
|
||||
let video_file_path = row . get :: < _ , Option <String> > (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 <String> > (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 <String> > (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 <Error> for ZoodexError {
|
||||
|
@ -62,3 +70,7 @@ impl From <Error> for ZoodexError {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From <AlreadyClosed> for ZoodexError {
|
||||
fn from ( _ : AlreadyClosed ) -> Self { CollectionFileError }
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue