got datatype read/write working with database.
This commit is contained in:
parent
418ba26da9
commit
abfa7114df
@ -1,4 +1,4 @@
|
|||||||
use super::{Database, DBError, ErrorCode, FileData, SessionData, Store};
|
use super::{DBError, Database, ErrorCode, FileData, SessionData, Store};
|
||||||
use async_std::{
|
use async_std::{
|
||||||
fs::{read, remove_file, write},
|
fs::{read, remove_file, write},
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
@ -22,6 +22,7 @@ impl DataType {
|
|||||||
fn new(data_type: &str) -> Result<Self, DBError> {
|
fn new(data_type: &str) -> Result<Self, DBError> {
|
||||||
match data_type {
|
match data_type {
|
||||||
"store" => Ok(DataType::DBMap(Store::new())),
|
"store" => Ok(DataType::DBMap(Store::new())),
|
||||||
|
"database" => Ok(DataType::TableMap(Database::new())),
|
||||||
_ => Err(DBError::from_code(ErrorCode::DataTypeIncorrect(
|
_ => Err(DBError::from_code(ErrorCode::DataTypeIncorrect(
|
||||||
data_type.to_string(),
|
data_type.to_string(),
|
||||||
))),
|
))),
|
||||||
@ -56,12 +57,13 @@ impl FileData<Self> for DataType {
|
|||||||
fn to_bytes(&self) -> Vec<u8> {
|
fn to_bytes(&self) -> Vec<u8> {
|
||||||
let mut output = Vec::new();
|
let mut output = Vec::new();
|
||||||
match self {
|
match self {
|
||||||
DataType::DBMap(store) => {
|
DataType::DBMap(_) => output.append(&mut "DBMap".as_bytes().to_vec()),
|
||||||
output.append(&mut "DBMap".as_bytes().to_vec());
|
DataType::TableMap(_) => output.append(&mut "TableMap".as_bytes().to_vec()),
|
||||||
output.push(0);
|
}
|
||||||
output.append(&mut store.to_bytes());
|
output.push(0);
|
||||||
},
|
match self {
|
||||||
DataType::TableMap(_) => todo!(),
|
DataType::DBMap(store) => output.append(&mut store.to_bytes()),
|
||||||
|
DataType::TableMap(db) => (),
|
||||||
}
|
}
|
||||||
output
|
output
|
||||||
}
|
}
|
||||||
@ -88,6 +90,7 @@ impl FileData<Self> for DataType {
|
|||||||
Ok(store) => Ok(DataType::DBMap(store)),
|
Ok(store) => Ok(DataType::DBMap(store)),
|
||||||
Err(err) => Err(err),
|
Err(err) => Err(err),
|
||||||
},
|
},
|
||||||
|
"TableMap" => Ok(DataType::new("database").unwrap()),
|
||||||
_ => Err(DBError::from_code(ErrorCode::CorruptFile)),
|
_ => Err(DBError::from_code(ErrorCode::CorruptFile)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -166,7 +169,8 @@ impl Entry {
|
|||||||
match write(&self.filename, data.to_bytes()).await {
|
match write(&self.filename, data.to_bytes()).await {
|
||||||
Ok(_) => (),
|
Ok(_) => (),
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
let mut error = DBError::from_code(ErrorCode::EntryWriteFailure(self.filename.clone()));
|
let mut error =
|
||||||
|
DBError::from_code(ErrorCode::EntryWriteFailure(self.filename.clone()));
|
||||||
error.add_source(err);
|
error.add_source(err);
|
||||||
return Err(error);
|
return Err(error);
|
||||||
}
|
}
|
||||||
@ -179,7 +183,8 @@ impl Entry {
|
|||||||
match remove_file(&self.filename).await {
|
match remove_file(&self.filename).await {
|
||||||
Ok(_) => Ok(()),
|
Ok(_) => Ok(()),
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
let mut error = DBError::from_code(ErrorCode::EntryDeleteFailure(self.filename.clone()));
|
let mut error =
|
||||||
|
DBError::from_code(ErrorCode::EntryDeleteFailure(self.filename.clone()));
|
||||||
error.add_source(err);
|
error.add_source(err);
|
||||||
Err(error)
|
Err(error)
|
||||||
}
|
}
|
||||||
@ -203,38 +208,66 @@ impl Cache {
|
|||||||
match Entry::new(entry, store).await {
|
match Entry::new(entry, store).await {
|
||||||
Ok(_) => Ok(Self {}),
|
Ok(_) => Ok(Self {}),
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
let mut error = DBError::from_code(ErrorCode::CacheReadWrite);
|
let mut error = DBError::from_code(ErrorCode::CacheReadWrite);
|
||||||
error.add_source(err);
|
error.add_source(err);
|
||||||
Err(error)
|
Err(error)
|
||||||
},
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod datatype {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn bad_data_type() -> Result<(), DBError> {
|
||||||
|
let dt = "bufcuss";
|
||||||
|
match DataType::new(dt) {
|
||||||
|
Ok(_) => Err(DBError::new("should have produced an error")),
|
||||||
|
Err(err) => match err.code {
|
||||||
|
ErrorCode::DataTypeIncorrect(value) => {
|
||||||
|
assert_eq!(value, dt, "Incorrect input value");
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
let mut error = DBError::new("incorrect error");
|
||||||
|
error.add_source(err);
|
||||||
|
Err(error)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn create_store() -> Result<(), DBError> {
|
||||||
|
match DataType::new("store") {
|
||||||
|
Ok(dt) => match dt {
|
||||||
|
DataType::DBMap(_) => Ok(()),
|
||||||
|
_ => Err(DBError::new("incorrect data type")),
|
||||||
|
},
|
||||||
|
Err(err) => Err(err),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn create_database() -> Result<(), DBError> {
|
||||||
|
match DataType::new("database") {
|
||||||
|
Ok(dt) => match dt {
|
||||||
|
DataType::TableMap(_) => Ok(()),
|
||||||
|
_ => Err(DBError::new("incorrect data type")),
|
||||||
|
},
|
||||||
|
Err(err) => Err(err),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod datatype_sesssion {
|
mod datatype_sesssion {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn invalid_cache_type() -> Result<(), DBError> {
|
|
||||||
match DataType::new("dkhgdl") {
|
|
||||||
Ok(_) => Err(DBError::new("invalid data type should raise an error")),
|
|
||||||
Err(err) => match err.code {
|
|
||||||
ErrorCode::DataTypeIncorrect(_) => Ok(()),
|
|
||||||
_ => Err(DBError::new("Invalid error code")),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn create_storage() {
|
|
||||||
let dbs = DataType::new("store").unwrap();
|
|
||||||
let expected: Vec<String> = Vec::new();
|
|
||||||
assert_eq!(dbs.list(["database"].to_vec()).unwrap(), expected);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn update_storage() {
|
fn update_storage() {
|
||||||
let mut dbs = DataType::new("store").unwrap();
|
let mut dbs = DataType::new("store").unwrap();
|
||||||
@ -296,6 +329,25 @@ mod datatype_file {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn new_database_bytes() {
|
||||||
|
let db = DataType::new("database").unwrap();
|
||||||
|
let mut expected = "TableMap".as_bytes().to_vec();
|
||||||
|
expected.push(0);
|
||||||
|
assert_eq!(db.to_bytes(), expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn read_empty_database() {
|
||||||
|
let dt = DataType::new("database").unwrap();
|
||||||
|
let data = dt.to_bytes();
|
||||||
|
let mut feed = data.iter();
|
||||||
|
match DataType::from_bytes(&mut feed).unwrap() {
|
||||||
|
DataType::TableMap(_) => (),
|
||||||
|
_ => assert!(false, "Incorrect data type"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn read_bad_header() -> Result<(), DBError> {
|
fn read_bad_header() -> Result<(), DBError> {
|
||||||
let data = "sdghsdl".as_bytes().to_vec();
|
let data = "sdghsdl".as_bytes().to_vec();
|
||||||
@ -320,7 +372,7 @@ mod datatype_file {
|
|||||||
Err(err) => match err.code {
|
Err(err) => match err.code {
|
||||||
ErrorCode::CorruptFile => Ok(()),
|
ErrorCode::CorruptFile => Ok(()),
|
||||||
_ => Err(DBError::new("incorrect error code")),
|
_ => Err(DBError::new("incorrect error code")),
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -481,9 +533,9 @@ mod entry {
|
|||||||
.to_string()
|
.to_string()
|
||||||
.contains("could not write to file"));
|
.contains("could not write to file"));
|
||||||
Ok(())
|
Ok(())
|
||||||
},
|
}
|
||||||
_ => Err(DBError::new("incorrect error code")),
|
_ => Err(DBError::new("incorrect error code")),
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -530,7 +582,7 @@ mod entry {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
_ => Err(DBError::new("incorrect error code")),
|
_ => Err(DBError::new("incorrect error code")),
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -551,9 +603,9 @@ mod entry {
|
|||||||
err.source().unwrap().to_string()
|
err.source().unwrap().to_string()
|
||||||
);
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
},
|
}
|
||||||
_ => Err(DBError::new("incorrect error code")),
|
_ => Err(DBError::new("incorrect error code")),
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -594,9 +646,9 @@ mod entry {
|
|||||||
err.source().unwrap().to_string()
|
err.source().unwrap().to_string()
|
||||||
);
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
},
|
}
|
||||||
_ => Err(DBError::new("incorrect error code")),
|
_ => Err(DBError::new("incorrect error code")),
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -630,20 +682,18 @@ mod cache {
|
|||||||
let path = dir.path().join("bad").join("path");
|
let path = dir.path().join("bad").join("path");
|
||||||
match Cache::new(path).await {
|
match Cache::new(path).await {
|
||||||
Ok(_) => Err(DBError::new("Should have produced an error.")),
|
Ok(_) => Err(DBError::new("Should have produced an error.")),
|
||||||
Err(err) => {
|
Err(err) => match err.code {
|
||||||
match err.code {
|
ErrorCode::CacheReadWrite => {
|
||||||
ErrorCode::CacheReadWrite => {
|
assert!(err.source().is_some(), "Error should have a source.");
|
||||||
assert!(err.source().is_some(), "Error should have a source.");
|
assert!(
|
||||||
assert!(
|
err.source().unwrap().to_string().contains("write failure"),
|
||||||
err.source().unwrap().to_string().contains("write failure"),
|
"Source Error Message: {}",
|
||||||
"Source Error Message: {}",
|
err.source().unwrap().to_string()
|
||||||
err.source().unwrap().to_string()
|
);
|
||||||
);
|
Ok(())
|
||||||
Ok(())
|
|
||||||
},
|
|
||||||
_ => Err(DBError::new("incorrect error code")),
|
|
||||||
}
|
}
|
||||||
}
|
_ => Err(DBError::new("incorrect error code")),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,6 +4,12 @@ use std::slice;
|
|||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct Database;
|
pub struct Database;
|
||||||
|
|
||||||
|
impl Database {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl FileData<Self> for Database {
|
impl FileData<Self> for Database {
|
||||||
fn to_bytes(&self) -> Vec<u8> {
|
fn to_bytes(&self) -> Vec<u8> {
|
||||||
let output = Vec::new();
|
let output = Vec::new();
|
||||||
|
@ -191,7 +191,7 @@ mod file_data {
|
|||||||
Err(err) => match err.code {
|
Err(err) => match err.code {
|
||||||
ErrorCode::CorruptFile => Ok(()),
|
ErrorCode::CorruptFile => Ok(()),
|
||||||
_ => Err(DBError::new("incorrect error code")),
|
_ => Err(DBError::new("incorrect error code")),
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,15 +214,15 @@ mod file_data {
|
|||||||
assert!(
|
assert!(
|
||||||
err.source().is_some(),
|
err.source().is_some(),
|
||||||
"Should state file corruption cause."
|
"Should state file corruption cause."
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
err.source().unwrap().to_string(),
|
err.source().unwrap().to_string(),
|
||||||
format!("database {} already exists", name)
|
format!("database {} already exists", name)
|
||||||
);
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
},
|
}
|
||||||
_ => Err(DBError::new("incorrect error code")),
|
_ => Err(DBError::new("incorrect error code")),
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user