1#![warn(clippy::pedantic)]
66#![allow(
67 clippy::cast_possible_wrap, clippy::cast_possible_truncation, clippy::cast_sign_loss,
69 clippy::module_name_repetitions, clippy::similar_names, clippy::must_use_candidate,
71 clippy::missing_errors_doc,
74 clippy::should_panic_without_expect,
75 clippy::doc_markdown,
77 clippy::missing_safety_doc,
78 clippy::needless_pass_by_value,
79 clippy::ptr_as_ptr,
80 clippy::missing_panics_doc,
81 clippy::from_over_into,
82)]
83
84#[macro_use]
85mod ffi_util;
86
87pub mod backup;
88mod cache;
89pub mod checkpoint;
90mod column_family;
91pub mod compaction_filter;
92pub mod compaction_filter_factory;
93mod comparator;
94mod db;
95mod db_iterator;
96mod db_options;
97mod db_pinnable_slice;
98mod env;
99pub mod event_listener;
100mod iter_range;
101pub mod merge_operator;
102pub mod perf;
103mod prop_name;
104pub mod properties;
105mod slice_transform;
106mod snapshot;
107pub mod sst_file_manager;
108mod sst_file_writer;
109pub mod statistics;
110mod transactions;
111mod write_batch;
112mod write_batch_with_index;
113mod write_buffer_manager;
114
115pub use crate::{
116 cache::Cache,
117 column_family::{
118 AsColumnFamilyRef, BoundColumnFamily, ColumnFamily, ColumnFamilyDescriptor,
119 ColumnFamilyRef, ColumnFamilyTtl, DEFAULT_COLUMN_FAMILY_NAME,
120 },
121 compaction_filter::Decision as CompactionDecision,
122 db::{
123 DBAccess, DBCommon, DBWithThreadMode, LiveFile, MultiThreaded, Range, SingleThreaded,
124 ThreadMode, DB,
125 },
126 db_iterator::{
127 DBIterator, DBIteratorWithThreadMode, DBRawIterator, DBRawIteratorWithThreadMode,
128 DBWALIterator, Direction, IteratorMode,
129 },
130 db_options::{
131 BlockBasedIndexType, BlockBasedOptions, BlockBasedPinningTier, BottommostLevelCompaction,
132 ChecksumType, CompactOptions, CuckooTableOptions, DBCompactionPri, DBCompactionStyle,
133 DBCompressionType, DBPath, DBRecoveryMode, DataBlockIndexType, FifoCompactOptions,
134 FlushOptions, IngestExternalFileOptions, KeyEncodingType, LogLevel, LruCacheOptions,
135 MemtableFactory, Options, PlainTableFactoryOptions, RateLimiterMode, ReadOptions, ReadTier,
136 UniversalCompactOptions, UniversalCompactionStopStyle, WaitForCompactOptions, WriteOptions,
137 },
138 db_pinnable_slice::DBPinnableSlice,
139 env::Env,
140 ffi_util::CStrLike,
141 iter_range::{IterateBounds, PrefixRange},
142 merge_operator::MergeOperands,
143 perf::{PerfContext, PerfMetric, PerfStatsLevel},
144 slice_transform::SliceTransform,
145 snapshot::{Snapshot, SnapshotWithThreadMode},
146 sst_file_manager::SstFileManager,
147 sst_file_writer::SstFileWriter,
148 transactions::{
149 OptimisticTransactionDB, OptimisticTransactionOptions, Transaction, TransactionDB,
150 TransactionDBOptions, TransactionOptions,
151 },
152 write_batch::{
153 WriteBatch, WriteBatchIterator, WriteBatchIteratorCf, WriteBatchWithTransaction,
154 },
155 write_batch_with_index::WriteBatchWithIndex,
156 write_buffer_manager::WriteBufferManager,
157};
158
159use rust_librocksdb_sys as ffi;
160
161use std::error;
162use std::fmt;
163
164#[derive(Debug, Clone, PartialEq, Eq)]
166pub enum ErrorKind {
167 NotFound,
168 Corruption,
169 NotSupported,
170 InvalidArgument,
171 IOError,
172 MergeInProgress,
173 Incomplete,
174 ShutdownInProgress,
175 TimedOut,
176 Aborted,
177 Busy,
178 Expired,
179 TryAgain,
180 CompactionTooLarge,
181 ColumnFamilyDropped,
182 Unknown,
183}
184
185#[derive(Debug, Clone, PartialEq, Eq)]
188pub struct Error {
189 message: String,
190}
191
192impl Error {
193 fn new(message: String) -> Error {
194 Error { message }
195 }
196
197 pub fn into_string(self) -> String {
198 self.into()
199 }
200
201 pub fn kind(&self) -> ErrorKind {
203 match self.message.split(':').next().unwrap_or("") {
204 "NotFound" => ErrorKind::NotFound,
205 "Corruption" => ErrorKind::Corruption,
206 "Not implemented" => ErrorKind::NotSupported,
207 "Invalid argument" => ErrorKind::InvalidArgument,
208 "IO error" => ErrorKind::IOError,
209 "Merge in progress" => ErrorKind::MergeInProgress,
210 "Result incomplete" => ErrorKind::Incomplete,
211 "Shutdown in progress" => ErrorKind::ShutdownInProgress,
212 "Operation timed out" => ErrorKind::TimedOut,
213 "Operation aborted" => ErrorKind::Aborted,
214 "Resource busy" => ErrorKind::Busy,
215 "Operation expired" => ErrorKind::Expired,
216 "Operation failed. Try again." => ErrorKind::TryAgain,
217 "Compaction too large" => ErrorKind::CompactionTooLarge,
218 "Column family dropped" => ErrorKind::ColumnFamilyDropped,
219 _ => ErrorKind::Unknown,
220 }
221 }
222}
223
224impl AsRef<str> for Error {
225 fn as_ref(&self) -> &str {
226 &self.message
227 }
228}
229
230impl From<Error> for String {
231 fn from(e: Error) -> String {
232 e.message
233 }
234}
235
236impl error::Error for Error {
237 fn description(&self) -> &str {
238 &self.message
239 }
240}
241
242impl fmt::Display for Error {
243 fn fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error> {
244 self.message.fmt(formatter)
245 }
246}
247
248#[cfg(test)]
249mod test {
250 use crate::{
251 cache::{Cache, CacheWrapper},
252 write_buffer_manager::{WriteBufferManager, WriteBufferManagerWrapper},
253 OptimisticTransactionDB, OptimisticTransactionOptions, Transaction, TransactionDB,
254 TransactionDBOptions, TransactionOptions,
255 };
256
257 use super::{
258 column_family::UnboundColumnFamily,
259 env::{Env, EnvWrapper},
260 BlockBasedOptions, BoundColumnFamily, ColumnFamily, ColumnFamilyDescriptor, DBIterator,
261 DBRawIterator, IngestExternalFileOptions, Options, PlainTableFactoryOptions, ReadOptions,
262 Snapshot, SstFileWriter, WriteBatch, WriteOptions, DB,
263 };
264
265 #[test]
266 fn is_send() {
267 fn is_send<T: Send>() {
271 }
273
274 is_send::<DB>();
275 is_send::<DBIterator<'_>>();
276 is_send::<DBRawIterator<'_>>();
277 is_send::<Snapshot>();
278 is_send::<Options>();
279 is_send::<ReadOptions>();
280 is_send::<WriteOptions>();
281 is_send::<IngestExternalFileOptions>();
282 is_send::<BlockBasedOptions>();
283 is_send::<PlainTableFactoryOptions>();
284 is_send::<ColumnFamilyDescriptor>();
285 is_send::<ColumnFamily>();
286 is_send::<BoundColumnFamily<'_>>();
287 is_send::<UnboundColumnFamily>();
288 is_send::<SstFileWriter>();
289 is_send::<WriteBatch>();
290 is_send::<Cache>();
291 is_send::<CacheWrapper>();
292 is_send::<Env>();
293 is_send::<EnvWrapper>();
294 is_send::<TransactionDB>();
295 is_send::<OptimisticTransactionDB>();
296 is_send::<Transaction<'_, TransactionDB>>();
297 is_send::<TransactionDBOptions>();
298 is_send::<OptimisticTransactionOptions>();
299 is_send::<TransactionOptions>();
300 is_send::<WriteBufferManager>();
301 is_send::<WriteBufferManagerWrapper>();
302 }
303
304 #[test]
305 fn is_sync() {
306 fn is_sync<T: Sync>() {
309 }
311
312 is_sync::<DB>();
313 is_sync::<Snapshot>();
314 is_sync::<Options>();
315 is_sync::<ReadOptions>();
316 is_sync::<WriteOptions>();
317 is_sync::<IngestExternalFileOptions>();
318 is_sync::<BlockBasedOptions>();
319 is_sync::<PlainTableFactoryOptions>();
320 is_sync::<UnboundColumnFamily>();
321 is_sync::<ColumnFamilyDescriptor>();
322 is_sync::<ColumnFamily>();
323 is_sync::<SstFileWriter>();
324 is_sync::<Cache>();
325 is_sync::<CacheWrapper>();
326 is_sync::<Env>();
327 is_sync::<EnvWrapper>();
328 is_sync::<TransactionDB>();
329 is_sync::<OptimisticTransactionDB>();
330 is_sync::<TransactionDBOptions>();
331 is_sync::<OptimisticTransactionOptions>();
332 is_sync::<TransactionOptions>();
333 is_sync::<WriteBufferManager>();
334 is_sync::<WriteBufferManagerWrapper>();
335 }
336}