diff --git a/src/api3/config/datastore.rs b/src/api3/config/datastore.rs index 29da88b3..aa113a09 100644 --- a/src/api3/config/datastore.rs +++ b/src/api3/config/datastore.rs @@ -32,7 +32,25 @@ pub fn post() -> ApiMethod { fn create_datastore(param: Value, _info: &ApiMethod) -> Result { println!("This is a test {}", param); - Ok(json!({})) + // fixme: locking ? + + let mut config = datastore::config()?; + + let name = param["name"].as_str().unwrap(); + + if let Some(_) = config.sections.get(name) { + bail!("datastore '{}' already exists.", name); + } + + let datastore = json!({ + "path": param["path"] + }); + + config.set_data(name, "datastore", datastore); + + datastore::save_config(&config)?; + + Ok(Value::Null) } pub fn router() -> Router { diff --git a/src/config/datastore.rs b/src/config/datastore.rs index bc377d29..6bde349a 100644 --- a/src/config/datastore.rs +++ b/src/config/datastore.rs @@ -1,7 +1,7 @@ use failure::*; use std::fs::{OpenOptions}; -use std::io::Read; +use std::io::{Read, Write}; //use std::sync::Arc; use crate::api::schema::*; @@ -52,4 +52,28 @@ pub fn config() -> Result { CONFIG.parse(DATASTORE_CFG_FILENAME, &contents) } +pub fn save_config(config: &SectionConfigData) -> Result<(), Error> { + let raw = CONFIG.write(DATASTORE_CFG_FILENAME, &config)?; + + let mut file = match OpenOptions::new() + .create(true) + .read(true) + .write(true) + .open(DATASTORE_CFG_FILENAME) { + Ok(file) => file, + Err(err) => bail!("Unable to open '{}' - {}", + DATASTORE_CFG_FILENAME, err), + }; + + let mut contents = String::new(); + file.read_to_string(&mut contents)?; + + //fixme: compute and compare digest + + //fixme: impl file_set_contents() (atomic write) + file.set_len(0)?; + file.write_all(raw.as_bytes())?; + + Ok(()) +}