1#![warn(missing_docs)]
20#![warn(clippy::all)]
21
22pub mod error;
23pub mod index;
24pub mod query;
26pub mod storage;
27pub mod transaction;
28
29#[cfg(test)]
30mod transaction_tests;
31
32pub use error::{Error, Result};
33
34use std::collections::HashMap;
35use std::sync::{Arc, RwLock};
36
37#[derive(Clone)]
42pub struct Database {
43 inner: Arc<DatabaseInner>,
44}
45
46struct DatabaseInner {
47 store: RwLock<HashMap<Vec<u8>, Vec<u8>>>,
50}
51
52impl Database {
53 pub fn new() -> Result<Self> {
55 Ok(Database {
56 inner: Arc::new(DatabaseInner {
57 store: RwLock::new(HashMap::new()),
58 }),
59 })
60 }
61
62 pub fn put(&self, key: &[u8], value: &[u8]) -> Result<()> {
64 let mut store = self.inner.store.write().map_err(|_| Error::LockPoisoned)?;
65 store.insert(key.to_vec(), value.to_vec());
66 Ok(())
67 }
68
69 pub fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>> {
71 let store = self.inner.store.read().map_err(|_| Error::LockPoisoned)?;
72 Ok(store.get(key).cloned())
73 }
74
75 pub fn delete(&self, key: &[u8]) -> Result<bool> {
77 let mut store = self.inner.store.write().map_err(|_| Error::LockPoisoned)?;
78 Ok(store.remove(key).is_some())
79 }
80}
81
82impl Default for Database {
83 fn default() -> Self {
84 Self::new().expect("Failed to create default database")
85 }
86}