Migrate to native_db 0.8.1

This commit is contained in:
Antoine Gersant 2025-01-16 00:14:53 -08:00
parent f4009a7fa7
commit b1770fc17e
3 changed files with 77 additions and 46 deletions

87
Cargo.lock generated
View file

@ -26,7 +26,7 @@ dependencies = [
"cfg-if",
"once_cell",
"version_check",
"zerocopy",
"zerocopy 0.7.35",
]
[[package]]
@ -372,9 +372,9 @@ dependencies = [
[[package]]
name = "cargo-platform"
version = "0.1.8"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc"
checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea"
dependencies = [
"serde",
]
@ -602,12 +602,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "errno"
version = "0.3.9"
version = "0.3.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
dependencies = [
"libc",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]
@ -639,9 +639,9 @@ checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"
[[package]]
name = "fastrand"
version = "2.1.0"
version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
[[package]]
name = "fdeflate"
@ -842,9 +842,9 @@ checksum = "779ae4bf7e8421cf91c0b3b64e7e8b40b862fba4d393f59150042de7c4965a94"
[[package]]
name = "glob"
version = "0.3.1"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
[[package]]
name = "hashbrown"
@ -1308,9 +1308,9 @@ dependencies = [
[[package]]
name = "linux-raw-sys"
version = "0.4.14"
version = "0.4.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
[[package]]
name = "litemap"
@ -1467,13 +1467,14 @@ dependencies = [
[[package]]
name = "native_db"
version = "0.7.1"
source = "git+https://github.com/vincent-herlemont/native_db#6daae43c5461e5944f076d40b4026be6c9730107"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db7c6b50f9889052a3c1bbd3aa70cc33b76ec1761092aeb0ec0e1ac3cfdb881a"
dependencies = [
"native_db_macro",
"native_model",
"redb 1.5.1",
"redb 2.1.3",
"redb 2.4.0",
"semver",
"serde",
"skeptic",
@ -1482,8 +1483,9 @@ dependencies = [
[[package]]
name = "native_db_macro"
version = "0.7.1"
source = "git+https://github.com/vincent-herlemont/native_db#6daae43c5461e5944f076d40b4026be6c9730107"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "434acde56fc4485e0b62533bb2fbc08155ee7e47408b1358348acff556c31b3c"
dependencies = [
"proc-macro2",
"quote",
@ -1492,9 +1494,9 @@ dependencies = [
[[package]]
name = "native_model"
version = "0.4.19"
version = "0.4.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "360da481893ec9bfa71593193b796400d8616c3b2aa8145b7b72e561224e6259"
checksum = "c10f4542302b7fa69ef18b49d93106e27f20b59d695555121d9ed22fe5d716a8"
dependencies = [
"anyhow",
"bincode",
@ -1502,14 +1504,14 @@ dependencies = [
"serde",
"skeptic",
"thiserror",
"zerocopy",
"zerocopy 0.8.14",
]
[[package]]
name = "native_model_macro"
version = "0.4.19"
version = "0.4.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "35ade955118c8776435064b3c0e95b75e89867ed19eaaf6709a2f3eea9c46420"
checksum = "2f385f3d57adaea8d8868e65a0bc821bcb8ba2228bbf87a1c3c6144ac48f3791"
dependencies = [
"proc-macro2",
"quote",
@ -1835,7 +1837,7 @@ version = "0.2.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
dependencies = [
"zerocopy",
"zerocopy 0.7.35",
]
[[package]]
@ -1965,9 +1967,9 @@ dependencies = [
[[package]]
name = "redb"
version = "2.1.3"
version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e4760ad04a88ef77075ba86ba9ea79b919e6bab29c1764c5747237cd6eaedcaa"
checksum = "ea0a72cd7140de9fc3e318823b883abf819c20d478ec89ce880466dc2ef263c6"
dependencies = [
"libc",
]
@ -2097,15 +2099,15 @@ dependencies = [
[[package]]
name = "rustix"
version = "0.38.34"
version = "0.38.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6"
dependencies = [
"bitflags 2.6.0",
"errno",
"libc",
"linux-raw-sys",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]
@ -2598,15 +2600,16 @@ dependencies = [
[[package]]
name = "tempfile"
version = "3.11.0"
version = "3.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8fcd239983515c23a32fb82099f97d0b11b8c72f654ed659363a95c3dad7a53"
checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704"
dependencies = [
"cfg-if",
"fastrand",
"getrandom",
"once_cell",
"rustix",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]
@ -3365,7 +3368,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
dependencies = [
"byteorder",
"zerocopy-derive",
"zerocopy-derive 0.7.35",
]
[[package]]
name = "zerocopy"
version = "0.8.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a367f292d93d4eab890745e75a778da40909cab4d6ff8173693812f79c4a2468"
dependencies = [
"zerocopy-derive 0.8.14",
]
[[package]]
@ -3379,6 +3391,17 @@ dependencies = [
"syn 2.0.96",
]
[[package]]
name = "zerocopy-derive"
version = "0.8.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3931cb58c62c13adec22e38686b559c86a30565e16ad6e8510a337cedc611e1"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.96",
]
[[package]]
name = "zerofrom"
version = "0.1.4"

View file

@ -30,8 +30,8 @@ log = "0.4.22"
metaflac = "0.2.7"
mp3-duration = "0.1.10"
mp4ameta = "0.11.0"
native_db = { git = "https://github.com/vincent-herlemont/native_db" }
native_model = "0.4.19"
native_db = "0.8.1"
native_model = "0.4.20"
nohash-hasher = "0.2.0"
notify = { version = "6.1.1", default-features = false }
notify-debouncer-full = { version = "0.3.1", default-features = false }

View file

@ -1,5 +1,5 @@
use core::clone::Clone;
use std::collections::HashMap;
use std::collections::{BTreeMap, HashMap};
use std::path::PathBuf;
use std::time::Duration;
@ -38,13 +38,13 @@ pub mod v1 {
#[derive(Debug, Default, Serialize, Deserialize)]
#[native_model(id = 1, version = 1)]
#[native_db(primary_key(custom_id))]
#[native_db(primary_key(custom_id -> (&str, &str)))]
pub struct PlaylistModel {
#[secondary_key]
pub owner: String,
pub name: String,
pub duration: Duration,
pub num_songs_by_genre: HashMap<String, u32>,
pub num_songs_by_genre: BTreeMap<String, u32>,
pub virtual_paths: Vec<PathBuf>,
}
@ -60,7 +60,7 @@ impl From<PlaylistModel> for PlaylistHeader {
Self {
name: p.name,
duration: p.duration,
num_songs_by_genre: p.num_songs_by_genre,
num_songs_by_genre: p.num_songs_by_genre.into_iter().collect(),
}
}
}
@ -126,7 +126,7 @@ impl Manager {
.filter_map(|s| s.duration.map(|d| d as u64))
.sum();
let mut num_songs_by_genre = HashMap::<String, u32>::new();
let mut num_songs_by_genre = BTreeMap::<String, u32>::new();
for song in &songs {
for genre in &song.genres {
*num_songs_by_genre.entry(genre.clone()).or_default() += 1;
@ -158,7 +158,7 @@ impl Manager {
let name = name.to_owned();
move || {
let transaction = manager.db.r_transaction()?;
match transaction.get().primary::<PlaylistModel>((&owner, &name)) {
match transaction.get().primary::<PlaylistModel>((owner, name)) {
Ok(Some(p)) => Ok(Playlist::from(p)),
Ok(None) => Err(Error::PlaylistNotFound),
Err(e) => Err(Error::NativeDatabase(e)),
@ -175,11 +175,15 @@ impl Manager {
let name = name.to_owned();
move || {
let transaction = manager.db.rw_transaction()?;
transaction.remove::<PlaylistModel>(PlaylistModel {
name: name.to_owned(),
owner: owner.to_owned(),
..Default::default()
})?;
let playlist = match transaction
.get()
.primary::<PlaylistModel>((owner.as_str(), name.as_str()))
{
Ok(Some(p)) => Ok(p),
Ok(None) => Err(Error::PlaylistNotFound),
Err(e) => Err(Error::NativeDatabase(e)),
}?;
transaction.remove::<PlaylistModel>(playlist)?;
transaction.commit()?;
Ok(())
}
@ -278,11 +282,15 @@ mod test {
async fn delete_playlist_golden_path() {
let ctx = test::ContextBuilder::new(test_name!())
.user(TEST_USER, TEST_PASSWORD, false)
.mount(TEST_MOUNT_NAME, "test-data/small-collection")
.build()
.await;
ctx.scanner.run_scan().await.unwrap();
let songs = list_all_songs(&ctx).await;
ctx.playlist_manager
.save_playlist(TEST_PLAYLIST_NAME, TEST_USER, Vec::new())
.save_playlist(TEST_PLAYLIST_NAME, TEST_USER, songs)
.await
.unwrap();