Extend DHT scheme

This commit is contained in:
Ultradesu
2026-07-20 16:28:45 +03:00
parent fdbc0e2ad0
commit a897737978
8 changed files with 234 additions and 47 deletions
+40 -13
View File
@@ -210,10 +210,13 @@ impl Database {
"SELECT payload
FROM local_items ORDER BY normalized_name",
)?;
let rows = stmt.query_map([], item_from_row)?;
let rows = stmt.query_map([], |row| row.get::<_, Vec<u8>>(0))?;
let mut result = Vec::new();
for row in rows {
let item = row?;
let payload = row?;
let Ok(item) = postcard::from_bytes::<LibraryItem>(&payload) else {
continue;
};
if include_deleted || !item.deleted {
result.push(item);
}
@@ -458,17 +461,6 @@ impl MusicDhtStorage for Database {
}
}
fn item_from_row(row: &rusqlite::Row<'_>) -> rusqlite::Result<LibraryItem> {
let payload: Vec<u8> = row.get(0)?;
postcard::from_bytes(&payload).map_err(|err| {
rusqlite::Error::FromSqlConversionFailure(
0,
rusqlite::types::Type::Blob,
format!("undecodable local item payload: {err}").into(),
)
})
}
#[cfg(test)]
mod tests {
use super::*;
@@ -486,8 +478,12 @@ mod tests {
name: name.to_string(),
normalized_name: crate::normalization::normalize_name(name),
artist_names: Vec::new(),
featured_artist_names: Vec::new(),
year: None,
release_type: None,
release_title: None,
track_number: None,
disc_number: None,
duration_seconds: None,
revision,
deleted,
@@ -522,6 +518,37 @@ mod tests {
assert!(none.is_empty());
}
#[tokio::test]
async fn undecodable_local_item_payload_is_skipped() {
let (_dir, db) = open_temp().await;
db.call(|conn| {
conn.execute(
"INSERT INTO local_items
(id, normalized_name, revision, deleted, updated_at_ms, payload)
VALUES (?1, ?2, ?3, ?4, ?5, ?6)",
params![
&[1u8; 32],
"legacy",
1_i64,
0_i64,
0_i64,
vec![0xff_u8, 0xff],
],
)?;
Ok(())
})
.await
.expect("insert corrupt row");
assert!(db.list_local_items(true).await.expect("list").is_empty());
assert!(
db.search_local("legacy".into())
.await
.expect("search")
.is_empty()
);
}
#[tokio::test]
async fn local_search_uses_artist_names() {
let (_dir, db) = open_temp().await;