use super::{Error, Store};
use parking_lot::RwLock;
use std::collections::{hash_map::DefaultHasher, HashMap};
use std::hash::{Hash, Hasher};
#[derive(Debug, Default)]
pub struct MemoryDB {
db: RwLock<HashMap<u64, Vec<u8>>>,
}
impl MemoryDB {
fn db_index<K>(key: K) -> u64
where
K: AsRef<[u8]>,
{
let mut hasher = DefaultHasher::new();
key.as_ref().hash::<DefaultHasher>(&mut hasher);
hasher.finish()
}
}
impl Clone for MemoryDB {
fn clone(&self) -> Self {
Self {
db: RwLock::new(self.db.read().clone()),
}
}
}
impl Store for MemoryDB {
fn write<K, V>(&self, key: K, value: V) -> Result<(), Error>
where
K: AsRef<[u8]>,
V: AsRef<[u8]>,
{
self.db
.write()
.insert(Self::db_index(key), value.as_ref().to_vec());
Ok(())
}
fn delete<K>(&self, key: K) -> Result<(), Error>
where
K: AsRef<[u8]>,
{
self.db.write().remove(&Self::db_index(key));
Ok(())
}
fn read<K>(&self, key: K) -> Result<Option<Vec<u8>>, Error>
where
K: AsRef<[u8]>,
{
Ok(self.db.read().get(&Self::db_index(key)).cloned())
}
fn exists<K>(&self, key: K) -> Result<bool, Error>
where
K: AsRef<[u8]>,
{
Ok(self.db.read().contains_key(&Self::db_index(key)))
}
}