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}