OSDN Git Service

Merge pull request #41 from Bytom/dev
[bytom/vapor.git] / vendor / github.com / btcsuite / btcd / database / error.go
1 // Copyright (c) 2015-2016 The btcsuite developers
2 // Use of this source code is governed by an ISC
3 // license that can be found in the LICENSE file.
4
5 package database
6
7 import "fmt"
8
9 // ErrorCode identifies a kind of error.
10 type ErrorCode int
11
12 // These constants are used to identify a specific database Error.
13 const (
14         // **************************************
15         // Errors related to driver registration.
16         // **************************************
17
18         // ErrDbTypeRegistered indicates two different database drivers
19         // attempt to register with the name database type.
20         ErrDbTypeRegistered ErrorCode = iota
21
22         // *************************************
23         // Errors related to database functions.
24         // *************************************
25
26         // ErrDbUnknownType indicates there is no driver registered for
27         // the specified database type.
28         ErrDbUnknownType
29
30         // ErrDbDoesNotExist indicates open is called for a database that
31         // does not exist.
32         ErrDbDoesNotExist
33
34         // ErrDbExists indicates create is called for a database that
35         // already exists.
36         ErrDbExists
37
38         // ErrDbNotOpen indicates a database instance is accessed before
39         // it is opened or after it is closed.
40         ErrDbNotOpen
41
42         // ErrDbAlreadyOpen indicates open was called on a database that
43         // is already open.
44         ErrDbAlreadyOpen
45
46         // ErrInvalid indicates the specified database is not valid.
47         ErrInvalid
48
49         // ErrCorruption indicates a checksum failure occurred which invariably
50         // means the database is corrupt.
51         ErrCorruption
52
53         // ****************************************
54         // Errors related to database transactions.
55         // ****************************************
56
57         // ErrTxClosed indicates an attempt was made to commit or rollback a
58         // transaction that has already had one of those operations performed.
59         ErrTxClosed
60
61         // ErrTxNotWritable indicates an operation that requires write access to
62         // the database was attempted against a read-only transaction.
63         ErrTxNotWritable
64
65         // **************************************
66         // Errors related to metadata operations.
67         // **************************************
68
69         // ErrBucketNotFound indicates an attempt to access a bucket that has
70         // not been created yet.
71         ErrBucketNotFound
72
73         // ErrBucketExists indicates an attempt to create a bucket that already
74         // exists.
75         ErrBucketExists
76
77         // ErrBucketNameRequired indicates an attempt to create a bucket with a
78         // blank name.
79         ErrBucketNameRequired
80
81         // ErrKeyRequired indicates at attempt to insert a zero-length key.
82         ErrKeyRequired
83
84         // ErrKeyTooLarge indicates an attmempt to insert a key that is larger
85         // than the max allowed key size.  The max key size depends on the
86         // specific backend driver being used.  As a general rule, key sizes
87         // should be relatively, so this should rarely be an issue.
88         ErrKeyTooLarge
89
90         // ErrValueTooLarge indicates an attmpt to insert a value that is larger
91         // than max allowed value size.  The max key size depends on the
92         // specific backend driver being used.
93         ErrValueTooLarge
94
95         // ErrIncompatibleValue indicates the value in question is invalid for
96         // the specific requested operation.  For example, trying create or
97         // delete a bucket with an existing non-bucket key, attempting to create
98         // or delete a non-bucket key with an existing bucket key, or trying to
99         // delete a value via a cursor when it points to a nested bucket.
100         ErrIncompatibleValue
101
102         // ***************************************
103         // Errors related to block I/O operations.
104         // ***************************************
105
106         // ErrBlockNotFound indicates a block with the provided hash does not
107         // exist in the database.
108         ErrBlockNotFound
109
110         // ErrBlockExists indicates a block with the provided hash already
111         // exists in the database.
112         ErrBlockExists
113
114         // ErrBlockRegionInvalid indicates a region that exceeds the bounds of
115         // the specified block was requested.  When the hash provided by the
116         // region does not correspond to an existing block, the error will be
117         // ErrBlockNotFound instead.
118         ErrBlockRegionInvalid
119
120         // ***********************************
121         // Support for driver-specific errors.
122         // ***********************************
123
124         // ErrDriverSpecific indicates the Err field is a driver-specific error.
125         // This provides a mechanism for drivers to plug-in their own custom
126         // errors for any situations which aren't already covered by the error
127         // codes provided by this package.
128         ErrDriverSpecific
129
130         // numErrorCodes is the maximum error code number used in tests.
131         numErrorCodes
132 )
133
134 // Map of ErrorCode values back to their constant names for pretty printing.
135 var errorCodeStrings = map[ErrorCode]string{
136         ErrDbTypeRegistered:   "ErrDbTypeRegistered",
137         ErrDbUnknownType:      "ErrDbUnknownType",
138         ErrDbDoesNotExist:     "ErrDbDoesNotExist",
139         ErrDbExists:           "ErrDbExists",
140         ErrDbNotOpen:          "ErrDbNotOpen",
141         ErrDbAlreadyOpen:      "ErrDbAlreadyOpen",
142         ErrInvalid:            "ErrInvalid",
143         ErrCorruption:         "ErrCorruption",
144         ErrTxClosed:           "ErrTxClosed",
145         ErrTxNotWritable:      "ErrTxNotWritable",
146         ErrBucketNotFound:     "ErrBucketNotFound",
147         ErrBucketExists:       "ErrBucketExists",
148         ErrBucketNameRequired: "ErrBucketNameRequired",
149         ErrKeyRequired:        "ErrKeyRequired",
150         ErrKeyTooLarge:        "ErrKeyTooLarge",
151         ErrValueTooLarge:      "ErrValueTooLarge",
152         ErrIncompatibleValue:  "ErrIncompatibleValue",
153         ErrBlockNotFound:      "ErrBlockNotFound",
154         ErrBlockExists:        "ErrBlockExists",
155         ErrBlockRegionInvalid: "ErrBlockRegionInvalid",
156         ErrDriverSpecific:     "ErrDriverSpecific",
157 }
158
159 // String returns the ErrorCode as a human-readable name.
160 func (e ErrorCode) String() string {
161         if s := errorCodeStrings[e]; s != "" {
162                 return s
163         }
164         return fmt.Sprintf("Unknown ErrorCode (%d)", int(e))
165 }
166
167 // Error provides a single type for errors that can happen during database
168 // operation.  It is used to indicate several types of failures including errors
169 // with caller requests such as specifying invalid block regions or attempting
170 // to access data against closed database transactions, driver errors, errors
171 // retrieving data, and errors communicating with database servers.
172 //
173 // The caller can use type assertions to determine if an error is an Error and
174 // access the ErrorCode field to ascertain the specific reason for the failure.
175 //
176 // The ErrDriverSpecific error code will also have the Err field set with the
177 // underlying error.  Depending on the backend driver, the Err field might be
178 // set to the underlying error for other error codes as well.
179 type Error struct {
180         ErrorCode   ErrorCode // Describes the kind of error
181         Description string    // Human readable description of the issue
182         Err         error     // Underlying error
183 }
184
185 // Error satisfies the error interface and prints human-readable errors.
186 func (e Error) Error() string {
187         if e.Err != nil {
188                 return e.Description + ": " + e.Err.Error()
189         }
190         return e.Description
191 }
192
193 // makeError creates an Error given a set of arguments.  The error code must
194 // be one of the error codes provided by this package.
195 func makeError(c ErrorCode, desc string, err error) Error {
196         return Error{ErrorCode: c, Description: desc, Err: err}
197 }