dbtest program argument now clear the database.
authorGreg Burri <greg.burri@gmail.com>
Wed, 14 Dec 2022 21:01:44 +0000 (22:01 +0100)
committerGreg Burri <greg.burri@gmail.com>
Wed, 14 Dec 2022 21:01:44 +0000 (22:01 +0100)
It does a backup prior clearing.

backend/src/main.rs

index 0d34341..951fd78 100644 (file)
@@ -1,8 +1,9 @@
+use std::path::Path;
+
 use actix_files as fs;
 use actix_web::{middleware, web, App, HttpServer};
 use chrono::prelude::*;
 use clap::Parser;
-use log::error;
 
 use data::db;
 
@@ -60,6 +61,7 @@ async fn main() -> std::io::Result<()> {
 
 #[derive(Parser, Debug)]
 struct Args {
+    /// Will clear the database and insert some test data. (A backup is made first).
     #[arg(long)]
     dbtest: bool,
 }
@@ -68,6 +70,27 @@ fn process_args() -> bool {
     let args = Args::parse();
 
     if args.dbtest {
+        // Make a backup of the database.
+        let db_path = Path::new(consts::DB_DIRECTORY).join(consts::DB_FILENAME);
+        if db_path.exists() {
+            let db_path_bckup = (1..)
+                .find_map(|n| {
+                    let p = db_path.with_extension(format!("sqlite.bckup{:03}", n));
+                    if p.exists() {
+                        None
+                    } else {
+                        Some(p)
+                    }
+                })
+                .unwrap();
+            std::fs::copy(&db_path, &db_path_bckup).expect(&format!(
+                "Unable to make backup of {:?} to {:?}",
+                &db_path, &db_path_bckup
+            ));
+            std::fs::remove_file(&db_path)
+                .expect(&format!("Unable to remove db file: {:?}", &db_path));
+        }
+
         match db::Connection::new() {
             Ok(con) => {
                 if let Err(error) = con.execute_file("sql/data_test.sql") {