Reads cache entry from the drive.
This commit is contained in:
parent
1403aaa935
commit
3164da0f4c
@ -1,13 +1,13 @@
|
|||||||
pub mod error;
|
pub mod error;
|
||||||
|
|
||||||
use async_std::{
|
use async_std::{
|
||||||
fs::{create_dir, write},
|
fs::{create_dir, read, write},
|
||||||
path::Path,
|
path::Path,
|
||||||
sync::{Arc, Mutex},
|
sync::{Arc, Mutex},
|
||||||
};
|
};
|
||||||
use error::DBError;
|
use error::DBError;
|
||||||
use rand::{distributions::Alphanumeric, thread_rng, Rng};
|
use rand::{distributions::Alphanumeric, thread_rng, Rng};
|
||||||
use std::{collections::HashMap, fmt};
|
use std::{collections::HashMap, fmt, str};
|
||||||
|
|
||||||
const DATA: &str = "data";
|
const DATA: &str = "data";
|
||||||
|
|
||||||
@ -31,6 +31,19 @@ impl CacheEntry {
|
|||||||
}
|
}
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn from_bytes(data: Vec<u8>) -> CacheEntry {
|
||||||
|
let mut data_iter = data.iter();
|
||||||
|
let mut holder: u8 = *data_iter.next().unwrap();
|
||||||
|
while holder != 0 {
|
||||||
|
holder = *data_iter.next().unwrap();
|
||||||
|
}
|
||||||
|
let mut output: Vec<u8> = Vec::new();
|
||||||
|
for letter in data_iter {
|
||||||
|
output.push(letter.clone());
|
||||||
|
}
|
||||||
|
CacheEntry::Raw(str::from_utf8(&output).unwrap().to_string())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for CacheEntry {
|
impl fmt::Display for CacheEntry {
|
||||||
@ -90,7 +103,10 @@ impl MoreThanText {
|
|||||||
let cache = self.cache.lock().await;
|
let cache = self.cache.lock().await;
|
||||||
match cache.get(id) {
|
match cache.get(id) {
|
||||||
Some(id) => Ok(id.clone()),
|
Some(id) => Ok(id.clone()),
|
||||||
None => Err(DBError::new("cache entry not found")),
|
None => match read(Path::new(&self.dir).join(&id)).await {
|
||||||
|
Ok(content) => Ok(CacheEntry::from_bytes(content)),
|
||||||
|
Err(_) => Err(DBError::new("cache entry not found")),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,6 +229,18 @@ mod cache {
|
|||||||
assert_eq!(content, expected.to_bytes());
|
assert_eq!(content, expected.to_bytes());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[async_std::test]
|
||||||
|
async fn retrieve_from_disk() {
|
||||||
|
let mtt = MTT::new().await;
|
||||||
|
let id = "someid";
|
||||||
|
let data = CacheEntry::Raw("stored".to_string());
|
||||||
|
write(mtt.dir.path().join(DATA).join(id), data.to_bytes())
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
let output = mtt.db.get_entry(id).await.unwrap();
|
||||||
|
assert_eq!(output.to_string(), data.to_string());
|
||||||
|
}
|
||||||
|
|
||||||
#[async_std::test]
|
#[async_std::test]
|
||||||
async fn store_bad_file() {
|
async fn store_bad_file() {
|
||||||
let mtt = MTT::new().await;
|
let mtt = MTT::new().await;
|
||||||
@ -314,4 +342,12 @@ mod cache_entry {
|
|||||||
let output = holder.to_bytes();
|
let output = holder.to_bytes();
|
||||||
assert_eq!(output, expected);
|
assert_eq!(output, expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn raw_from_bytes() {
|
||||||
|
let holder = CacheEntry::Raw("stored item".to_string());
|
||||||
|
let data = holder.to_bytes();
|
||||||
|
let output = CacheEntry::from_bytes(data);
|
||||||
|
assert_eq!(output.to_string(), holder.to_string());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user