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