1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
//! # cdb64
//!
//! `cdb64` is a Rust implementation of D. J. Bernstein's cdb (constant database) format,
//! specifically designed to handle large database files efficiently using 64-bit hash values and offsets.
//!
//! This library provides `CdbWriter` for creating cdb files and `Cdb` for reading existing cdb files.
//! It also includes `CdbIterator` for iterating over all key-value pairs within a database.
//!
//! ## Features
//!
//! - CDB file creation (`CdbWriter`)
//! - CDB file reading and key lookups (`Cdb`)
//! - Database iteration (`CdbIterator`)
//! - Support for custom hash functions (defaults to CDB hash)
//!
//! ## Usage Examples
//!
//! ### Creating and Reading a CDB File
//!
//! ```rust
//! use cdb64::{CdbWriter, Cdb, Error, CdbHash};
//! use tempfile::NamedTempFile;
//! use std::fs::File;
//!
//! fn main() -> Result<(), Error> {
//! let temp_file = NamedTempFile::new().expect("Failed to create temp file");
//! let path = temp_file.path();
//!
//! // Create a CDB file
//! let mut writer = CdbWriter::<File, CdbHash>::create(path)?;
//! writer.put(b"hello", b"world")?;
//! writer.put(b"rust", b"is awesome")?;
//! writer.finalize()?; // After finalize, writer can still be used (but put is blocked by is_finalized)
//!
//! // Open the CDB file
//! let cdb = Cdb::<File, CdbHash>::open(path)?;
//!
//! // Retrieve a value by key
//! if let Some(value) = cdb.get(b"hello")? {
//! println!("Found value: {}", String::from_utf8_lossy(&value));
//! }
//!
//! // Search for a non-existent key
//! assert!(cdb.get(b"nonexistent")?.is_none());
//!
//! Ok(())
//! }
//! ```
//!
//! ### Using the Iterator
//!
//! ```rust
//! use cdb64::{CdbWriter, Cdb, CdbIterator, Error, CdbHash};
//! use tempfile::NamedTempFile;
//! use std::collections::HashMap;
//! use std::fs::File;
//!
//! fn main() -> Result<(), Error> {
//! let temp_file = NamedTempFile::new().expect("Failed to create temp file");
//! let path = temp_file.path();
//!
//! let mut data = HashMap::new();
//! data.insert(b"key1".to_vec(), b"value1".to_vec());
//! data.insert(b"key2".to_vec(), b"value2".to_vec());
//!
//! let mut writer = CdbWriter::<File, CdbHash>::create(path)?;
//! for (k, v) in &data {
//! writer.put(k, v)?;
//! }
//! writer.finalize()?;
//!
//! let cdb: Cdb<_, CdbHash> = Cdb::open(path)?;
//! let iter = cdb.iter();
//!
//! let mut retrieved_count = 0;
//! for result in iter {
//! let (key, value) = result?;
//! println!("Key: {}, Value: {}",
//! String::from_utf8_lossy(&key),
//! String::from_utf8_lossy(&value)
//! );
//! assert_eq!(data.get(&key).unwrap(), &value);
//! retrieved_count += 1;
//! }
//! assert_eq!(retrieved_count, data.len());
//!
//! Ok(())
//! }
//! ```
// re-exports
pub use Cdb;
pub use CdbHash;
pub use CdbIterator;
pub use ReaderAt;
pub use CdbWriter;