breez_sdk_liquid/persist/
backup.rs

1use std::path::{Path, PathBuf};
2
3use anyhow::Result;
4use rusqlite::{backup::Backup, Connection};
5
6use super::Persister;
7use crate::model::LiquidNetwork;
8
9impl Persister {
10    pub(crate) fn get_default_backup_path(&self) -> PathBuf {
11        self.main_db_dir.join(match self.network {
12            LiquidNetwork::Mainnet => "backup.sql",
13            LiquidNetwork::Testnet => "backup-testnet.sql",
14            LiquidNetwork::Regtest => "backup-regtest.sql",
15        })
16    }
17
18    pub(crate) fn backup(&self, backup_path: PathBuf) -> Result<()> {
19        let con = self.get_connection()?;
20        con.backup(rusqlite::DatabaseName::Main, backup_path, None)?;
21        Ok(())
22    }
23
24    pub(crate) fn restore_from_backup<P>(&self, backup_path: P) -> Result<()>
25    where
26        P: AsRef<Path>,
27    {
28        let src_con = Connection::open(backup_path)?;
29        let mut dst_con = self.get_connection()?;
30
31        let backup = Backup::new(&src_con, &mut dst_con)?;
32        backup.run_to_completion(5, std::time::Duration::from_millis(250), None)?;
33
34        Ok(())
35    }
36}
37
38#[cfg(test)]
39#[cfg(not(all(target_family = "wasm", target_os = "unknown")))]
40mod tests {
41    use anyhow::Result;
42
43    use crate::{
44        model::PaymentState,
45        test_utils::persist::{create_persister, new_receive_swap, new_send_swap},
46    };
47
48    #[sdk_macros::test_not_wasm]
49    fn test_backup_and_restore() -> Result<()> {
50        create_persister!(local);
51
52        local.insert_or_update_send_swap(&new_send_swap(Some(PaymentState::Pending), None))?;
53        local
54            .insert_or_update_receive_swap(&new_receive_swap(Some(PaymentState::Pending), None))?;
55        assert_eq!(local.list_ongoing_swaps()?.len(), 2);
56
57        let backup_path = local.get_default_backup_path();
58        local.backup(backup_path.clone())?;
59        assert!(backup_path.exists());
60
61        create_persister!(remote);
62
63        remote.restore_from_backup(backup_path)?;
64        assert_eq!(remote.list_ongoing_swaps()?.len(), 2);
65
66        Ok(())
67    }
68}