breez_sdk_liquid/persist/
backup.rs1use 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}