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
use std::io;
use thiserror::Error;
/// Bolt database errors
#[derive(Error, Debug)]
pub enum Error {
// These errors can be returned when opening or calling methods on a DB.
/// DatabaseNotOpen is returned when a DB instance is accessed before it
/// is opened or after it is closed.
#[error("database not open")]
DatabaseNotOpen,
/// DatabaseOpen is returned when opening a database that is
/// already open.
#[error("database already open")]
DatabaseOpen,
/// InvalidDatabase is returned when both meta pages on a database are invalid.
/// This typically occurs when a file is not a bolt database.
#[error("invalid database - meta_can_read: `{0}`")]
InvalidDatabase(bool),
/// InvalidMapping is returned when the database file fails to get mapped.
#[error("database isn't correctly mapped")]
InvalidMapping,
/// ErrVersionMismatch is returned when the data file was created with a
/// different version of Bolt.
#[error("version mismatch")]
VersionMismatch,
/// Checksum is returned when either meta page checksum does not match.
#[error("checksum mismatch")]
ChecksumMismatch,
/// File size is below the minimum size a Bolt database could be
#[error("file size too small: `{0}`")]
FileSizeTooSmall(u64),
/// Timeout is returned when a database cannot obtain an exclusive lock
/// on the data file after the timeout passed to Open().
#[error("timeout")]
Timeout,
/// FreePagesNotLoaded is returned when a readonly transaction without
/// preloading the free pages is trying to access the free pages.
#[error("free pages are not pre-loaded")]
FreePagesNotLoaded,
// These errors can occur when putting or deleting a value or a bucket.
/// BucketNotFound is returned when trying to access a bucket that has
/// not been created yet.
#[error("bucket not found")]
BucketNotFound,
/// BucketExists is returned when creating a bucket that already exists.
#[error("bucket already exists")]
BucketExists,
/// BucketNameRequired is returned when creating a bucket with a blank name.
#[error("bucket name required")]
BucketNameRequired,
/// KeyRequired is returned when inserting a zero-length key.
#[error("key required")]
KeyRequired,
/// KeyTooLarge is returned when inserting a key that is larger than MaxKeySize.
#[error("key too large")]
KeyTooLarge,
/// ValueTooLarge is returned when inserting a value that is larger than MaxValueSize.
#[error("value too large")]
ValueTooLarge,
/// IncompatibleValue is returned when trying to create or delete a bucket
/// on an existing non-bucket key or when trying to create or delete a
/// non-bucket key on an existing bucket key.
#[error("incompatible value")]
IncompatibleValue,
/// File size is below the minimum size a Bolt database could be
#[error("mmap too small: `{0}`")]
MMapTooSmall(u64),
/// File size is larger than the maximum size a Bolt database could be
#[error("mmap too large")]
MMapTooLarge,
/// Batch call failed. Try again without batch
#[error("try function without batch call")]
TrySolo,
/// Batch is disabled
#[error("max batch delay or length is set to 0")]
BatchDisabled,
/// Chained errors from other sources
#[error(transparent)]
IO(#[from] io::Error),
/// User defined error
#[error(transparent)]
Other(#[from] anyhow::Error),
}
impl PartialEq for Error {
fn eq(&self, other: &Self) -> bool {
matches!(
(self, other),
(&Error::DatabaseNotOpen, &Error::DatabaseNotOpen)
| (Error::DatabaseOpen, Error::DatabaseOpen)
| (Error::InvalidDatabase(_), Error::InvalidDatabase(_))
| (Error::InvalidMapping, Error::InvalidMapping)
| (Error::VersionMismatch, Error::VersionMismatch)
| (Error::ChecksumMismatch, Error::ChecksumMismatch)
| (Error::FileSizeTooSmall(_), Error::FileSizeTooSmall(_))
| (Error::Timeout, Error::Timeout)
| (Error::FreePagesNotLoaded, Error::FreePagesNotLoaded)
| (Error::BucketNotFound, Error::BucketNotFound)
| (Error::BucketExists, Error::BucketExists)
| (Error::BucketNameRequired, Error::BucketNameRequired)
| (Error::KeyRequired, Error::KeyRequired)
| (Error::KeyTooLarge, Error::KeyTooLarge)
| (Error::ValueTooLarge, Error::ValueTooLarge)
| (Error::IncompatibleValue, Error::IncompatibleValue)
| (Error::MMapTooSmall(_), Error::MMapTooSmall(_))
| (Error::MMapTooLarge, Error::MMapTooLarge)
| (Error::TrySolo, Error::TrySolo)
| (Error::BatchDisabled, Error::BatchDisabled)
)
}
}
impl Eq for Error {}
pub type Result<T, E = Error> = std::result::Result<T, E>;