Switch to async-sqlite library, rename CollectionFileError

This commit is contained in:
Reinout Meliesie 2024-12-23 23:20:08 +01:00
parent d267475f0d
commit c1481517bc
Signed by: zedfrigg
GPG key ID: 3AFCC06481308BC6
5 changed files with 91 additions and 73 deletions

56
Cargo.lock generated
View file

@ -15,27 +15,17 @@ dependencies = [
] ]
[[package]] [[package]]
name = "allocator-api2" name = "async-sqlite"
version = "0.2.21" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" checksum = "4e420455ac3543544cbf17c36ff308807a6e62d7952e965c749dab53d860870c"
[[package]]
name = "async-rusqlite"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7a22b15c9049bd1150f224cffdd3d8557357cf1b95d8ba2d4bcf854c0812a5d"
dependencies = [ dependencies = [
"asyncified", "crossbeam-channel",
"futures-channel",
"futures-util",
"rusqlite", "rusqlite",
] ]
[[package]]
name = "asyncified"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ddbcf3c524e7338b7e791a2b2d82c478c89930f1ecd4a64bced1211392b6ccae"
[[package]] [[package]]
name = "autocfg" name = "autocfg"
version = "1.4.0" version = "1.4.0"
@ -87,6 +77,21 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 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]] [[package]]
name = "equivalent" name = "equivalent"
version = "1.0.1" version = "1.0.1"
@ -95,9 +100,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]] [[package]]
name = "fallible-iterator" name = "fallible-iterator"
version = "0.2.0" version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649"
[[package]] [[package]]
name = "fallible-streaming-iterator" name = "fallible-streaming-iterator"
@ -433,7 +438,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
dependencies = [ dependencies = [
"ahash", "ahash",
"allocator-api2",
] ]
[[package]] [[package]]
@ -444,9 +448,9 @@ checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
[[package]] [[package]]
name = "hashlink" name = "hashlink"
version = "0.8.4" version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af"
dependencies = [ dependencies = [
"hashbrown 0.14.5", "hashbrown 0.14.5",
] ]
@ -506,9 +510,9 @@ checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
[[package]] [[package]]
name = "libsqlite3-sys" name = "libsqlite3-sys"
version = "0.26.0" version = "0.30.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326" checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149"
dependencies = [ dependencies = [
"pkg-config", "pkg-config",
"vcpkg", "vcpkg",
@ -606,9 +610,9 @@ dependencies = [
[[package]] [[package]]
name = "rusqlite" name = "rusqlite"
version = "0.29.0" version = "0.32.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "549b9d036d571d42e6e85d1c1425e2ac83491075078ca9a15be021c56b1641f2" checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e"
dependencies = [ dependencies = [
"bitflags", "bitflags",
"fallible-iterator", "fallible-iterator",
@ -871,7 +875,7 @@ dependencies = [
name = "zoodex" name = "zoodex"
version = "1.0.0" version = "1.0.0"
dependencies = [ dependencies = [
"async-rusqlite", "async-sqlite",
"fallible-iterator", "fallible-iterator",
"gtk4", "gtk4",
"libadwaita", "libadwaita",

View file

@ -10,7 +10,7 @@ license = "GPL-3.0-or-later"
lto = true lto = true
[ dependencies ] [ dependencies ]
async-rusqlite = "0.4.0" async-sqlite = { version = "0.3.1" , default-features = false }
fallible-iterator = "0.2.0" # Must match version used by async-rusqlite fallible-iterator = "0.3.0" # Must match version used by async-sqlite
gtk4 = { version = "0.9.2" , features = [ "v4_16" ] } gtk4 = { version = "0.9.2" , features = [ "v4_16" ] }
libadwaita = { version = "0.7.0" , features = [ "v1_6" ] } libadwaita = { version = "0.7.0" , features = [ "v1_6" ] }

View file

@ -3,7 +3,7 @@ use std :: { * , any :: * , future :: * } ;
# [ derive (Debug) ] pub enum ZoodexError { # [ derive (Debug) ] pub enum ZoodexError {
CollectionFileError , CollectionFileReadError ,
} }
pub type Result <Success> = result :: Result < Success , ZoodexError > ; pub type Result <Success> = result :: Result < Success , ZoodexError > ;

View file

@ -31,7 +31,7 @@ fn on_activate ( app : & Application ) {
} , } ,
|error| { |error| {
match error { match error {
CollectionFileError => eprintln ! ("Could not open collection file") , CollectionFileReadError => eprintln ! ("Could not read collection file") ,
} ; } ;
ui . close_window () ; ui . close_window () ;
} , } ,

View file

@ -1,7 +1,8 @@
use { use {
async_rusqlite :: { async_sqlite :: {
* , * ,
rusqlite :: { Error , OpenFlags , Error :: * , ffi :: ErrorCode :: * } , Error :: * ,
rusqlite :: { OpenFlags , Error :: * , ffi :: ErrorCode :: * } ,
} , } ,
fallible_iterator :: * , fallible_iterator :: * ,
std :: path :: * , std :: path :: * ,
@ -12,57 +13,74 @@ use crate :: { collection :: * , error :: { * , ZoodexError :: * } } ;
pub async fn get_collection_from_file () -> Result <Collection> { pub async fn get_collection_from_file () -> Result <Collection> {
let sqlite_connection = Connection :: builder () . open_with_flags ( let sqlite_client = ClientBuilder :: new ()
"zoodex.sqlite" , . path ("zoodex.sqlite")
OpenFlags :: SQLITE_OPEN_READ_ONLY | OpenFlags :: SQLITE_OPEN_NO_MUTEX , . flags ( OpenFlags :: SQLITE_OPEN_READ_ONLY | OpenFlags :: SQLITE_OPEN_NO_MUTEX )
) . await ? ; . open ()
. await ? ;
sqlite_connection . call ( |sqlite_connection| { let collection = sqlite_client . conn ( |sqlite_connection| {
let mut films_query = sqlite_connection let films = sqlite_connection
. prepare ("select * from films order by release_date desc") ? ; . prepare ("select * from films order by release_date desc") ?
let films = films_query . query (()) ? . map ( |row| { . query (()) ?
let uuid = row . get (0) ? ; . map ( |row| {
let name = row . get (1) ? ; let uuid = row . get (0) ? ;
let original_name = row . get (2) ? ; let name = row . get (1) ? ;
let release_date = row . get (3) ? ; let original_name = row . get (2) ? ;
let runtime_minutes = row . get (4) ? ; let release_date = row . get (3) ? ;
let poster_file_path = row . get :: < _ , Option <String> > (5) ? let runtime_minutes = row . get (4) ? ;
. map ( PathBuf :: from ) ; let poster_file_path = row . get :: < _ , Option <String> > (5) ?
let video_file_path = row . get :: < _ , Option <String> > (6) ? . map ( PathBuf :: from ) ;
. map ( PathBuf :: from ) ; let video_file_path = row . get :: < _ , Option <String> > (6) ?
. map ( PathBuf :: from ) ;
Ok ( Film { Ok ( Film {
uuid , uuid ,
name , name ,
original_name , original_name ,
release_date , release_date ,
runtime_minutes , runtime_minutes ,
poster_file_path , poster_file_path ,
video_file_path , video_file_path ,
} )
} ) } )
} ) . collect () ? ; . collect () ? ;
let mut series_query = sqlite_connection . prepare ("select * from series") ? ; let series = sqlite_connection
let series = series_query . query (()) ? . map ( |row| { . prepare ("select * from series") ?
let uuid = row . get (0) ? ; . query (()) ?
let name = row . get (1) ? ; . map ( |row| {
let original_name = row . get (2) ? ; let uuid = row . get (0) ? ;
let poster_file_path = row . get :: < _ , Option <String> > (3) ? let name = row . get (1) ? ;
. map ( PathBuf :: from ) ; 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 } ) Ok ( Series { uuid , name , original_name , poster_file_path } )
} ) . collect () ? ; } )
. collect () ? ;
Ok ( Collection { films , series } ) Ok ( Collection { films , series } )
} ) . await } ) . await ? ;
Ok (collection)
} }
impl From <Error> for ZoodexError { impl From <Error> for ZoodexError {
fn from ( error : Error ) -> Self { 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 { match error {
SqliteFailure ( error , _ ) => { SqliteFailure ( error , _ ) => {
match error . code { match error . code {
Unknown => CollectionFileError , CannotOpen => CollectionFileReadError ,
_ => panic ! () , _ => panic ! () ,
} }
} , } ,
@ -70,7 +88,3 @@ impl From <Error> for ZoodexError {
} }
} }
} }
impl From <AlreadyClosed> for ZoodexError {
fn from ( _ : AlreadyClosed ) -> Self { CollectionFileError }
}