crepedb_redb/
db.rs

1use std::path::Path;
2
3use crepedb_core::backend::Backend;
4use redb::{backends::InMemoryBackend, Builder, Database, Error, ReadableDatabase};
5
6use crate::{RedbReadTxn, RedbWriteTxn};
7
8/// A CrepeDB backend implementation using redb.
9///
10/// This struct wraps a redb `Database` and implements the CrepeDB `Backend` trait,
11/// allowing redb to be used as the storage engine for CrepeDB.
12pub struct RedbDatabase {
13    inner: Database,
14}
15
16impl RedbDatabase {
17    /// Open or create a persistent redb database at the specified path.
18    ///
19    /// If the database doesn't exist, it will be created. If it exists, it will be opened.
20    ///
21    /// # Arguments
22    ///
23    /// * `path` - The file path where the database should be stored
24    ///
25    /// # Errors
26    ///
27    /// Returns an error if the database cannot be created or opened.
28    ///
29    /// # Example
30    ///
31    /// ```ignore
32    /// let db = RedbDatabase::open_or_create("mydb.redb")?;
33    /// ```
34    pub fn open_or_create(path: impl AsRef<Path>) -> Result<Self, Error> {
35        let db = Database::create(path)?;
36        Ok(Self { inner: db })
37    }
38
39    /// Create an in-memory redb database.
40    ///
41    /// The database exists only in memory and will be lost when dropped.
42    /// This is useful for testing or temporary storage.
43    ///
44    /// # Errors
45    ///
46    /// Returns an error if the database cannot be created.
47    ///
48    /// # Example
49    ///
50    /// ```ignore
51    /// let db = RedbDatabase::memory()?;
52    /// ```
53    pub fn memory() -> Result<Self, Error> {
54        let backend = InMemoryBackend::new();
55
56        let db = Builder::new().create_with_backend(backend)?;
57        Ok(Self { inner: db })
58    }
59
60    /// Get a reference to the underlying redb database.
61    pub fn inner(&self) -> &Database {
62        &self.inner
63    }
64
65    /// Consume the database and return the underlying redb database.
66    pub fn into_inner(self) -> Database {
67        self.inner
68    }
69}
70
71impl Backend for RedbDatabase {
72    type Error = Error;
73
74    type ReadTxn<'a> = RedbReadTxn;
75
76    type WriteTxn<'a> = RedbWriteTxn;
77
78    fn read_txn(&self) -> Result<Self::ReadTxn<'_>, Self::Error> {
79        let txn = self.inner.begin_read()?;
80
81        Ok(RedbReadTxn { inner: txn })
82    }
83
84    fn write_txn(&self) -> Result<Self::WriteTxn<'_>, Self::Error> {
85        let txn = self.inner.begin_write()?;
86
87        Ok(RedbWriteTxn { inner: txn })
88    }
89}