]> git.proxmox.com Git - proxmox-backup.git/commitdiff
start implementing DataStore
authorDietmar Maurer <dietmar@proxmox.com>
Mon, 17 Dec 2018 12:00:39 +0000 (13:00 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Mon, 17 Dec 2018 12:00:39 +0000 (13:00 +0100)
src/backup/datastore.rs [new file with mode: 0644]
src/bin/backup-client.rs
src/lib.rs

diff --git a/src/backup/datastore.rs b/src/backup/datastore.rs
new file mode 100644 (file)
index 0000000..3c6c5b7
--- /dev/null
@@ -0,0 +1,43 @@
+use failure::*;
+
+use std::path::Path;
+
+use crate::config::datastore;
+use super::chunk_store::*;
+use super::image_index::*;
+
+pub struct DataStore {
+    chunk_store: ChunkStore,
+}
+
+impl DataStore {
+
+    pub fn open(store_name: &str) -> Result<Self, Error> {
+
+        let config = datastore::config()?;
+        let (_, store_config) = config.sections.get(store_name)
+            .ok_or(format_err!("no such datastore '{}'", store_name))?;
+
+        let path = store_config["path"].as_str().unwrap();
+
+        let chunk_store = ChunkStore::open(path)?;
+
+        Ok(Self {
+            chunk_store: chunk_store,
+        })
+    }
+
+    pub fn create_image_writer<P: AsRef<Path>>(&mut self, filename: P, size: usize) -> Result<ImageIndexWriter, Error> {
+
+        let index = ImageIndexWriter::create(&mut self.chunk_store, filename.as_ref(), size)?;
+
+        Ok(index)
+    }
+
+    pub fn open_image_reader<P: AsRef<Path>>(&mut self, filename: P) -> Result<ImageIndexReader, Error> {
+
+        let index = ImageIndexReader::open(&mut self.chunk_store, filename.as_ref())?;
+
+        Ok(index)
+    }
+}
index e46067223017e4ed3769e14d2d665638a1f97261..e080f2ec0d8be2a6201aa0355674148c32b10cf2 100644 (file)
@@ -9,6 +9,7 @@ use apitest::api::schema::*;
 use apitest::api::router::*;
 use apitest::backup::chunk_store::*;
 use apitest::backup::image_index::*;
+use apitest::backup::datastore::*;
 use serde_json::{Value};
 
 use apitest::config::datastore;
@@ -23,13 +24,7 @@ fn backup_file(param: Value, _info: &ApiMethod) -> Result<Value, Error> {
     let filename = required_string_param(&param, "filename");
     let store = required_string_param(&param, "store");
 
-    let config = datastore::config()?;
-    let (_, store_config) = config.sections.get(store)
-        .ok_or(format_err!("no such datastore '{}'", store))?;
-
-    let path = store_config["path"].as_str().unwrap();
-
-    let mut chunk_store = ChunkStore::open(path)?;
+    let mut datastore = DataStore::open(store)?;
 
     println!("Backup file '{}' to '{}'", filename, store);
 
@@ -41,7 +36,7 @@ fn backup_file(param: Value, _info: &ApiMethod) -> Result<Value, Error> {
         if stat.st_size <= 0 { bail!("got strange file size '{}'", stat.st_size); }
         let size = stat.st_size as usize;
 
-        let mut index = ImageIndexWriter::create(&mut chunk_store, target.as_ref(), size)?;
+        let mut index = datastore.create_image_writer(target, size)?;
 
         tools::file_chunker(file, 64*1024, |pos, chunk| {
             index.add_chunk(pos, chunk)?;
@@ -51,7 +46,7 @@ fn backup_file(param: Value, _info: &ApiMethod) -> Result<Value, Error> {
         index.close()?; // commit changes
     }
 
-    let idx = ImageIndexReader::open(&mut chunk_store, target.as_ref())?;
+    let idx = datastore.open_image_reader(target)?;
     idx.print_info();
 
     Ok(Value::Null)
index 011232fccb35ddcff1c341e1f9c453ddf205d6d5..cbf90d395a8d41ff2a70e840300f90d236529948 100644 (file)
@@ -36,6 +36,7 @@ pub mod backup {
 
     pub mod chunk_store;
     pub mod image_index;
+    pub mod datastore;
 }
 
 pub mod config {