rusnapshot/src/database.rs
2021-04-15 21:12:08 -05:00

98 lines
3.4 KiB
Rust

use {
crate::{
errors::*,
structs::{Args, Database},
},
sqlite::{Connection, State},
};
pub fn test_database(connection_str: &str) -> Result<()> {
let connection = sqlite::open(&connection_str)?;
drop(connection);
Ok(())
}
pub fn setup_initial_database(connection: &Connection) -> Result<()> {
connection.execute("CREATE TABLE IF NOT EXISTS snapshots (name TEXT NOT NULL, snap_id TEXT NOT NULL, source TEXT NOT NULL, destination TEXT NOT NULL, date TEXT DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY(name, snap_id))")?;
Ok(())
}
pub fn commit_to_database(connection: &Connection, args: &Args) -> Result<()> {
let statement = format!(
"INSERT INTO snapshots (name, snap_id, source, destination) VALUES ('{}', '{}', '{}', '{}')",
args.snapshot_name, args.snapshot_id, args.source_dir, args.dest_dir
);
connection.execute(&statement)?;
Ok(())
}
pub fn delete_from_database(connection: &Connection, args: &Args) -> Result<()> {
let statement = format!(
"DELETE FROM snapshots WHERE name = '{}' OR snap_id = '{}'",
args.snapshot_id, args.snapshot_id
);
connection.execute(&statement)?;
Ok(())
}
pub fn return_snapshot_data(connection: &Connection, args: &Args) -> Result<Database> {
let mut statement = connection.prepare(format!(
"SELECT * FROM snapshots WHERE name = '{}' OR snap_id = '{}'",
args.snapshot_id, args.snapshot_id
))?;
let mut snap_data = Database::default();
while let State::Row = statement.next()? {
snap_data.name = statement.read::<String>(0).unwrap();
snap_data.snap_id = statement.read::<String>(1).unwrap();
snap_data.source = statement.read::<String>(2).unwrap();
snap_data.destination = statement.read::<String>(3).unwrap();
snap_data.date = statement.read::<String>(4).unwrap();
}
Ok(snap_data)
}
pub fn return_all_data(connection: &Connection) -> Result<Vec<Database>> {
let mut snapshots_data: Vec<Database> = Vec::new();
let mut statement = connection.prepare("SELECT * FROM snapshots ORDER BY date DESC")?;
while let State::Row = statement.next()? {
let mut db_struct = Database::default();
db_struct.name = statement.read::<String>(0).unwrap();
db_struct.snap_id = statement.read::<String>(1).unwrap();
db_struct.source = statement.read::<String>(2).unwrap();
db_struct.destination = statement.read::<String>(3).unwrap();
db_struct.date = statement.read::<String>(4).unwrap();
snapshots_data.push(db_struct);
}
Ok(snapshots_data)
}
pub fn return_only_x_items(connection: &Connection, args: &Args) -> Result<Vec<Database>> {
let mut snapshots_data: Vec<Database> = Vec::new();
let mut statement = connection.prepare(&format!("SELECT name,snap_id,source,destination,date FROM (SELECT row_number() over(ORDER BY date DESC) n,* from snapshots) WHERE n > {} AND name LIKE '{}%'", args.keep_only, args.snapshot_prefix))?;
while let State::Row = statement.next()? {
let mut db_struct = Database::default();
db_struct.name = statement.read::<String>(0).unwrap();
db_struct.snap_id = statement.read::<String>(1).unwrap();
db_struct.source = statement.read::<String>(2).unwrap();
db_struct.destination = statement.read::<String>(3).unwrap();
db_struct.date = statement.read::<String>(4).unwrap();
snapshots_data.push(db_struct);
}
Ok(snapshots_data)
}