From 35d2063217797ac84190be6ca0ec1d0abc99e860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C5=91rinc=20Serf=C5=91z=C5=91?= Date: Sat, 10 Jun 2023 16:01:54 +0200 Subject: [PATCH] Added sqlite backup --- Cargo.toml | 2 +- src/datafile/sqlite_datafile.rs | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1385277..909e4a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,4 +23,4 @@ directories-next = "2.0" serde = { version = "1.0", features = ["derive"] } toml = "0.5" dialoguer = "0.9" -rusqlite = { version = "0.28.0", features = ["bundled"] } +rusqlite = { version = "0.28.0", features = ["bundled", "backup"] } diff --git a/src/datafile/sqlite_datafile.rs b/src/datafile/sqlite_datafile.rs index c58e43d..ebbe38b 100644 --- a/src/datafile/sqlite_datafile.rs +++ b/src/datafile/sqlite_datafile.rs @@ -1,10 +1,10 @@ //! Handling SQLite habit databases. use anyhow::{bail, Context, Result}; use chrono::{NaiveDate, NaiveDateTime}; -use std::path::Path; +use std::{ffi::OsString, path::Path}; use super::DiaryDataConnection; -use rusqlite::{params, Connection}; +use rusqlite::{backup, params, Connection}; struct DiaryDataSqlite { connection: Connection, @@ -47,6 +47,18 @@ pub fn open_sqlite_datafile(path: &Path) -> Result> let data = DiaryDataSqlite { connection: Connection::open(path).context("Could not open SQLite database")?, }; + { + let mut backup_ext = OsString::from(path.extension().unwrap_or_default()); + backup_ext.push(".bak"); + let backup_path = path.with_extension(backup_ext); + let mut backup_connection = + Connection::open(backup_path).context("Could not open SQLite database for backup")?; + let backup = backup::Backup::new(&data.connection, &mut backup_connection) + .context("Could not initiate database backup")?; + backup + .run_to_completion(10, std::time::Duration::default(), None) + .context("Could not perform backup")?; + } Ok(Box::new(data)) }