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