Now saving torrent updates properly to the new db
This commit is contained in:
parent
f29dccf8bd
commit
d77d96bd48
6 changed files with 92 additions and 37 deletions
|
|
@ -92,24 +92,13 @@ impl JsonSessionPersistenceStore {
|
|||
fn torrent_bytes_filename(&self, info_hash: &Id20) -> PathBuf {
|
||||
self.output_folder.join(format!("{:?}.torrent", info_hash))
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl SessionPersistenceStore for JsonSessionPersistenceStore {
|
||||
async fn next_id(&self) -> anyhow::Result<TorrentId> {
|
||||
Ok(self
|
||||
.db_content
|
||||
.read()
|
||||
.await
|
||||
.torrents
|
||||
.keys()
|
||||
.copied()
|
||||
.max()
|
||||
.map(|max| max + 1)
|
||||
.unwrap_or(0))
|
||||
}
|
||||
|
||||
async fn store(&self, id: TorrentId, torrent: &ManagedTorrentHandle) -> anyhow::Result<()> {
|
||||
async fn update_db(
|
||||
&self,
|
||||
id: TorrentId,
|
||||
torrent: &ManagedTorrentHandle,
|
||||
write_torrent_file: bool,
|
||||
) -> anyhow::Result<()> {
|
||||
if !torrent
|
||||
.storage_factory
|
||||
.is_type_id(TypeId::of::<FilesystemStorageFactory>())
|
||||
|
|
@ -132,7 +121,7 @@ impl SessionPersistenceStore for JsonSessionPersistenceStore {
|
|||
output_folder: torrent.info().options.output_folder.clone(),
|
||||
};
|
||||
|
||||
if !torrent.info().torrent_bytes.is_empty() {
|
||||
if write_torrent_file && !torrent.info().torrent_bytes.is_empty() {
|
||||
let torrent_bytes_file = self.torrent_bytes_filename(&torrent.info_hash());
|
||||
match tokio::fs::OpenOptions::new()
|
||||
.create(true)
|
||||
|
|
@ -157,6 +146,22 @@ impl SessionPersistenceStore for JsonSessionPersistenceStore {
|
|||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl SessionPersistenceStore for JsonSessionPersistenceStore {
|
||||
async fn next_id(&self) -> anyhow::Result<TorrentId> {
|
||||
Ok(self
|
||||
.db_content
|
||||
.read()
|
||||
.await
|
||||
.torrents
|
||||
.keys()
|
||||
.copied()
|
||||
.max()
|
||||
.map(|max| max + 1)
|
||||
.unwrap_or(0))
|
||||
}
|
||||
|
||||
async fn delete(&self, id: TorrentId) -> anyhow::Result<()> {
|
||||
if let Some(t) = self.db_content.write().await.torrents.remove(&id) {
|
||||
|
|
@ -211,4 +216,16 @@ impl SessionPersistenceStore for JsonSessionPersistenceStore {
|
|||
.then(move |id| async move { self.get(id).await.map(move |st| (id, st)) })
|
||||
.boxed())
|
||||
}
|
||||
|
||||
async fn store(&self, id: TorrentId, torrent: &ManagedTorrentHandle) -> anyhow::Result<()> {
|
||||
self.update_db(id, torrent, true).await
|
||||
}
|
||||
|
||||
async fn update_metadata(
|
||||
&self,
|
||||
id: TorrentId,
|
||||
torrent: &ManagedTorrentHandle,
|
||||
) -> anyhow::Result<()> {
|
||||
self.update_db(id, torrent, false).await
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -59,12 +59,18 @@ impl SerializedTorrent {
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: make this info_hash first, ID-second.
|
||||
#[async_trait]
|
||||
pub trait SessionPersistenceStore: core::fmt::Debug + Send + Sync {
|
||||
async fn next_id(&self) -> anyhow::Result<TorrentId>;
|
||||
async fn store(&self, id: TorrentId, torrent: &ManagedTorrentHandle) -> anyhow::Result<()>;
|
||||
async fn delete(&self, id: TorrentId) -> anyhow::Result<()>;
|
||||
async fn get(&self, id: TorrentId) -> anyhow::Result<SerializedTorrent>;
|
||||
async fn update_metadata(
|
||||
&self,
|
||||
id: TorrentId,
|
||||
torrent: &ManagedTorrentHandle,
|
||||
) -> anyhow::Result<()>;
|
||||
async fn stream_all(
|
||||
&self,
|
||||
) -> anyhow::Result<BoxStream<'_, anyhow::Result<(TorrentId, SerializedTorrent)>>>;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue