crepedb_rocksdb/
lib.rs

1//! # CrepeDB RocksDB Backend
2//!
3//! This crate provides a [RocksDB](https://rocksdb.org/) backend implementation for CrepeDB.
4//!
5//! RocksDB is a high-performance embedded database for key-value data. It is a fork of LevelDB
6//! by Facebook that provides improved performance and many additional features.
7//! This backend allows CrepeDB to use RocksDB as its underlying storage engine.
8//!
9//! ## Features
10//!
11//! - **ACID Transactions**: Full transactional support via RocksDB's OptimisticTransactionDB
12//! - **Embedded**: No separate server process required
13//! - **Persistent Storage**: Data is stored on disk
14//! - **In-Memory Mode**: Support for temporary in-memory databases
15//! - **High Performance**: Optimized for fast reads and writes
16//!
17//! ## Example
18//!
19//! ```ignore
20//! use crepedb::{CrepeDB, SnapshotId, TableType};
21//! use crepedb_rocksdb::RocksdbDatabase;
22//!
23//! // Open a persistent database
24//! let backend = RocksdbDatabase::open_or_create("mydb")?;
25//! let db = CrepeDB::new(backend);
26//! ```
27
28mod db;
29pub use db::*;
30
31mod read;
32pub use read::*;
33
34mod write;
35pub use write::*;
36
37mod table;
38pub use table::*;
39
40mod range;
41pub use range::*;
42
43#[cfg(test)]
44mod tests {
45    use crate::RocksdbDatabase;
46    use std::path::PathBuf;
47
48    fn create_temp_db() -> (RocksdbDatabase, PathBuf) {
49        let timestamp = std::time::SystemTime::now()
50            .duration_since(std::time::UNIX_EPOCH)
51            .unwrap()
52            .as_nanos();
53        let temp_dir = std::env::temp_dir().join(format!(
54            "crepedb-rocksdb-test-{}-{}",
55            std::process::id(),
56            timestamp
57        ));
58        let backend = RocksdbDatabase::open_or_create(&temp_dir).unwrap();
59        (backend, temp_dir)
60    }
61
62    #[test]
63    fn test_db_10() {
64        let _ = env_logger::builder().is_test(true).try_init();
65
66        let (backend, temp_dir) = create_temp_db();
67
68        let result = crepedb_core::tests::test_db_10(backend);
69
70        // Clean up
71        let _ = std::fs::remove_dir_all(temp_dir);
72
73        result.unwrap();
74    }
75
76    #[test]
77    fn test_read() {
78        let _ = env_logger::builder().is_test(true).try_init();
79
80        let (backend, temp_dir) = create_temp_db();
81
82        let result = crepedb_core::read_tests::test_read(backend);
83
84        // Clean up
85        let _ = std::fs::remove_dir_all(temp_dir);
86
87        result.unwrap();
88    }
89
90    #[test]
91    fn test_snapshot_isolation() {
92        let _ = env_logger::builder().is_test(true).try_init();
93
94        let (backend, temp_dir) = create_temp_db();
95
96        let result = crepedb_core::read_tests::test_snapshot_isolation(backend);
97
98        // Clean up
99        let _ = std::fs::remove_dir_all(temp_dir);
100
101        result.unwrap();
102    }
103
104    #[test]
105    fn test_multiple_keys() {
106        let _ = env_logger::builder().is_test(true).try_init();
107
108        let (backend, temp_dir) = create_temp_db();
109
110        let result = crepedb_core::read_tests::test_multiple_keys(backend);
111
112        // Clean up
113        let _ = std::fs::remove_dir_all(temp_dir);
114
115        result.unwrap();
116    }
117
118    #[test]
119    fn test_error_handling() {
120        let _ = env_logger::builder().is_test(true).try_init();
121
122        let (backend, temp_dir) = create_temp_db();
123
124        let result = crepedb_core::read_tests::test_error_handling(backend);
125
126        // Clean up
127        let _ = std::fs::remove_dir_all(temp_dir);
128
129        result.unwrap();
130    }
131
132    #[test]
133    fn test_multiple_tables() {
134        let _ = env_logger::builder().is_test(true).try_init();
135
136        let (backend, temp_dir) = create_temp_db();
137
138        let result = crepedb_core::read_tests::test_multiple_tables(backend);
139
140        // Clean up
141        let _ = std::fs::remove_dir_all(temp_dir);
142
143        result.unwrap();
144    }
145
146    #[test]
147    fn test_basic_table_type() {
148        let _ = env_logger::builder().is_test(true).try_init();
149
150        let (backend, temp_dir) = create_temp_db();
151
152        let result = crepedb_core::read_tests::test_basic_table_type(backend);
153
154        // Clean up
155        let _ = std::fs::remove_dir_all(temp_dir);
156
157        result.unwrap();
158    }
159
160    #[test]
161    fn test_edge_cases() {
162        let _ = env_logger::builder().is_test(true).try_init();
163
164        let (backend, temp_dir) = create_temp_db();
165
166        let result = crepedb_core::read_tests::test_edge_cases(backend);
167
168        // Clean up
169        let _ = std::fs::remove_dir_all(temp_dir);
170
171        result.unwrap();
172    }
173
174    #[test]
175    fn test_version_chain() {
176        let _ = env_logger::builder().is_test(true).try_init();
177
178        let (backend, temp_dir) = create_temp_db();
179
180        let result = crepedb_core::read_tests::test_version_chain(backend);
181
182        // Clean up
183        let _ = std::fs::remove_dir_all(temp_dir);
184
185        result.unwrap();
186    }
187
188    #[test]
189    fn test_delete_operations() {
190        let _ = env_logger::builder().is_test(true).try_init();
191
192        let (backend, temp_dir) = create_temp_db();
193
194        let result = crepedb_core::read_tests::test_delete_operations(backend);
195
196        // Clean up
197        let _ = std::fs::remove_dir_all(temp_dir);
198
199        result.unwrap();
200    }
201
202    #[test]
203    fn test_root_snapshot() {
204        let _ = env_logger::builder().is_test(true).try_init();
205
206        let (backend, temp_dir) = create_temp_db();
207
208        let result = crepedb_core::read_tests::test_root_snapshot(backend);
209
210        // Clean up
211        let _ = std::fs::remove_dir_all(temp_dir);
212
213        result.unwrap();
214    }
215
216    #[test]
217    fn test_transaction_lifecycle() {
218        let _ = env_logger::builder().is_test(true).try_init();
219
220        let (backend, temp_dir) = create_temp_db();
221
222        let result = crepedb_core::read_tests::test_transaction_lifecycle(backend);
223
224        // Clean up
225        let _ = std::fs::remove_dir_all(temp_dir);
226
227        result.unwrap();
228    }
229
230    #[test]
231    fn test_mixed_operations() {
232        let _ = env_logger::builder().is_test(true).try_init();
233
234        let (backend, temp_dir) = create_temp_db();
235
236        let result = crepedb_core::read_tests::test_mixed_operations(backend);
237
238        // Clean up
239        let _ = std::fs::remove_dir_all(temp_dir);
240
241        result.unwrap();
242    }
243
244    #[test]
245    fn test_parent_child_visibility() {
246        let _ = env_logger::builder().is_test(true).try_init();
247
248        let (backend, temp_dir) = create_temp_db();
249
250        let result = crepedb_core::read_tests::test_parent_child_visibility(backend);
251
252        // Clean up
253        let _ = std::fs::remove_dir_all(temp_dir);
254
255        result.unwrap();
256    }
257
258    #[test]
259    fn test_complex_branching() {
260        let _ = env_logger::builder().is_test(true).try_init();
261
262        let (backend, temp_dir) = create_temp_db();
263
264        let result = crepedb_core::read_tests::test_complex_branching(backend);
265
266        // Clean up
267        let _ = std::fs::remove_dir_all(temp_dir);
268
269        result.unwrap();
270    }
271}