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, ExportImportFilesMetaData, LiveFile, MultiThreaded,
124 PrefixProber, Range, SingleThreaded, 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, ImportColumnFamilyOptions, IngestExternalFileOptions, KeyEncodingType,
135 LogLevel, LruCacheOptions, MemtableFactory, Options, PlainTableFactoryOptions,
136 RateLimiterMode, ReadOptions, ReadTier, UniversalCompactOptions,
137 UniversalCompactionStopStyle, WaitForCompactOptions, WriteOptions,
138 },
139 db_pinnable_slice::DBPinnableSlice,
140 env::Env,
141 ffi_util::CStrLike,
142 iter_range::{IterateBounds, PrefixRange},
143 merge_operator::MergeOperands,
144 perf::{PerfContext, PerfMetric, PerfStatsLevel},
145 slice_transform::SliceTransform,
146 snapshot::{Snapshot, SnapshotWithThreadMode},
147 sst_file_manager::SstFileManager,
148 sst_file_writer::SstFileWriter,
149 transactions::{
150 OptimisticTransactionDB, OptimisticTransactionOptions, Transaction, TransactionDB,
151 TransactionDBOptions, TransactionOptions,
152 },
153 write_batch::{
154 WriteBatch, WriteBatchIterator, WriteBatchIteratorCf, WriteBatchWithTransaction,
155 },
156 write_batch_with_index::WriteBatchWithIndex,
157 write_buffer_manager::WriteBufferManager,
158};
159
160use rust_librocksdb_sys as ffi;
161
162use std::error;
163use std::fmt;
164
165#[derive(Debug, Clone, PartialEq, Eq)]
167pub enum ErrorKind {
168 NotFound,
169 Corruption,
170 NotSupported,
171 InvalidArgument,
172 IOError,
173 MergeInProgress,
174 Incomplete,
175 ShutdownInProgress,
176 TimedOut,
177 Aborted,
178 Busy,
179 Expired,
180 TryAgain,
181 CompactionTooLarge,
182 ColumnFamilyDropped,
183 Unknown,
184}
185
186#[derive(Debug, Clone, PartialEq, Eq)]
189pub struct Error {
190 message: String,
191}
192
193impl Error {
194 fn new(message: String) -> Error {
195 Error { message }
196 }
197
198 pub fn into_string(self) -> String {
199 self.into()
200 }
201
202 pub fn kind(&self) -> ErrorKind {
204 match self.message.split(':').next().unwrap_or("") {
205 "NotFound" => ErrorKind::NotFound,
206 "Corruption" => ErrorKind::Corruption,
207 "Not implemented" => ErrorKind::NotSupported,
208 "Invalid argument" => ErrorKind::InvalidArgument,
209 "IO error" => ErrorKind::IOError,
210 "Merge in progress" => ErrorKind::MergeInProgress,
211 "Result incomplete" => ErrorKind::Incomplete,
212 "Shutdown in progress" => ErrorKind::ShutdownInProgress,
213 "Operation timed out" => ErrorKind::TimedOut,
214 "Operation aborted" => ErrorKind::Aborted,
215 "Resource busy" => ErrorKind::Busy,
216 "Operation expired" => ErrorKind::Expired,
217 "Operation failed. Try again." => ErrorKind::TryAgain,
218 "Compaction too large" => ErrorKind::CompactionTooLarge,
219 "Column family dropped" => ErrorKind::ColumnFamilyDropped,
220 _ => ErrorKind::Unknown,
221 }
222 }
223}
224
225impl AsRef<str> for Error {
226 fn as_ref(&self) -> &str {
227 &self.message
228 }
229}
230
231impl From<Error> for String {
232 fn from(e: Error) -> String {
233 e.message
234 }
235}
236
237impl error::Error for Error {
238 fn description(&self) -> &str {
239 &self.message
240 }
241}
242
243impl fmt::Display for Error {
244 fn fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error> {
245 self.message.fmt(formatter)
246 }
247}
248
249#[cfg(test)]
250mod test {
251 use crate::{
252 cache::{Cache, CacheWrapper},
253 write_buffer_manager::{WriteBufferManager, WriteBufferManagerWrapper},
254 OptimisticTransactionDB, OptimisticTransactionOptions, Transaction, TransactionDB,
255 TransactionDBOptions, TransactionOptions,
256 };
257
258 use super::{
259 column_family::UnboundColumnFamily,
260 env::{Env, EnvWrapper},
261 BlockBasedOptions, BoundColumnFamily, ColumnFamily, ColumnFamilyDescriptor, DBIterator,
262 DBRawIterator, IngestExternalFileOptions, Options, PlainTableFactoryOptions, ReadOptions,
263 Snapshot, SstFileWriter, WriteBatch, WriteOptions, DB,
264 };
265
266 #[test]
267 fn is_send() {
268 fn is_send<T: Send>() {
272 }
274
275 is_send::<DB>();
276 is_send::<DBIterator<'_>>();
277 is_send::<DBRawIterator<'_>>();
278 is_send::<Snapshot>();
279 is_send::<Options>();
280 is_send::<ReadOptions>();
281 is_send::<WriteOptions>();
282 is_send::<IngestExternalFileOptions>();
283 is_send::<BlockBasedOptions>();
284 is_send::<PlainTableFactoryOptions>();
285 is_send::<ColumnFamilyDescriptor>();
286 is_send::<ColumnFamily>();
287 is_send::<BoundColumnFamily<'_>>();
288 is_send::<UnboundColumnFamily>();
289 is_send::<SstFileWriter>();
290 is_send::<WriteBatch>();
291 is_send::<Cache>();
292 is_send::<CacheWrapper>();
293 is_send::<Env>();
294 is_send::<EnvWrapper>();
295 is_send::<TransactionDB>();
296 is_send::<OptimisticTransactionDB>();
297 is_send::<Transaction<'_, TransactionDB>>();
298 is_send::<TransactionDBOptions>();
299 is_send::<OptimisticTransactionOptions>();
300 is_send::<TransactionOptions>();
301 is_send::<WriteBufferManager>();
302 is_send::<WriteBufferManagerWrapper>();
303 }
304
305 #[test]
306 fn is_sync() {
307 fn is_sync<T: Sync>() {
310 }
312
313 is_sync::<DB>();
314 is_sync::<Snapshot>();
315 is_sync::<Options>();
316 is_sync::<ReadOptions>();
317 is_sync::<WriteOptions>();
318 is_sync::<IngestExternalFileOptions>();
319 is_sync::<BlockBasedOptions>();
320 is_sync::<PlainTableFactoryOptions>();
321 is_sync::<UnboundColumnFamily>();
322 is_sync::<ColumnFamilyDescriptor>();
323 is_sync::<ColumnFamily>();
324 is_sync::<SstFileWriter>();
325 is_sync::<Cache>();
326 is_sync::<CacheWrapper>();
327 is_sync::<Env>();
328 is_sync::<EnvWrapper>();
329 is_sync::<TransactionDB>();
330 is_sync::<OptimisticTransactionDB>();
331 is_sync::<TransactionDBOptions>();
332 is_sync::<OptimisticTransactionOptions>();
333 is_sync::<TransactionOptions>();
334 is_sync::<WriteBufferManager>();
335 is_sync::<WriteBufferManagerWrapper>();
336 }
337}