1 // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. See the AUTHORS file for names of contributors.
4 //
5 // A Status encapsulates the result of an operation. It may indicate success,
6 // or it may indicate an error with an associated error message.
7 //
8 // Multiple threads can invoke const methods on a Status without
9 // external synchronization, but if any of the threads may call a
10 // non-const method, all threads accessing the same Status must use
11 // external synchronization.
12
13 #ifndef STORAGE_LEVELDB_INCLUDE_STATUS_H_
14 #define STORAGE_LEVELDB_INCLUDE_STATUS_H_
15
16 #include <string>
17 #include "leveldb/slice.h"
18
19 namespace leveldb {
20
21 class Status {
22 public:
23 // Create a success status.
Status()24 Status() : state_(NULL) { }
~Status()25 ~Status() { delete[] state_; }
26
27 // Copy the specified status.
28 Status(const Status& s);
29 void operator=(const Status& s);
30
31 // Return a success status.
OK()32 static Status OK() { return Status(); }
33
34 // Return error status of an appropriate type.
35 static Status NotFound(const Slice& msg, const Slice& msg2 = Slice()) {
36 return Status(kNotFound, msg, msg2);
37 }
38 static Status Corruption(const Slice& msg, const Slice& msg2 = Slice()) {
39 return Status(kCorruption, msg, msg2);
40 }
41 static Status NotSupported(const Slice& msg, const Slice& msg2 = Slice()) {
42 return Status(kNotSupported, msg, msg2);
43 }
44 static Status InvalidArgument(const Slice& msg, const Slice& msg2 = Slice()) {
45 return Status(kInvalidArgument, msg, msg2);
46 }
47 static Status IOError(const Slice& msg, const Slice& msg2 = Slice()) {
48 return Status(kIOError, msg, msg2);
49 }
50
51 // Returns true iff the status indicates success.
ok()52 bool ok() const { return (state_ == NULL); }
53
54 // Returns true iff the status indicates a NotFound error.
IsNotFound()55 bool IsNotFound() const { return code() == kNotFound; }
56
57 // Returns true iff the status indicates a Corruption error.
IsCorruption()58 bool IsCorruption() const { return code() == kCorruption; }
59
60 // Returns true iff the status indicates an IOError.
IsIOError()61 bool IsIOError() const { return code() == kIOError; }
62
63 // Return a string representation of this status suitable for printing.
64 // Returns the string "OK" for success.
65 std::string ToString() const;
66
67 private:
68 // OK status has a NULL state_. Otherwise, state_ is a new[] array
69 // of the following form:
70 // state_[0..3] == length of message
71 // state_[4] == code
72 // state_[5..] == message
73 const char* state_;
74
75 enum Code {
76 kOk = 0,
77 kNotFound = 1,
78 kCorruption = 2,
79 kNotSupported = 3,
80 kInvalidArgument = 4,
81 kIOError = 5
82 };
83
code()84 Code code() const {
85 return (state_ == NULL) ? kOk : static_cast<Code>(state_[4]);
86 }
87
88 Status(Code code, const Slice& msg, const Slice& msg2);
89 static const char* CopyState(const char* s);
90 };
91
Status(const Status & s)92 inline Status::Status(const Status& s) {
93 state_ = (s.state_ == NULL) ? NULL : CopyState(s.state_);
94 }
95 inline void Status::operator=(const Status& s) {
96 // The following condition catches both aliasing (when this == &s),
97 // and the common case where both s and *this are ok.
98 if (state_ != s.state_) {
99 delete[] state_;
100 state_ = (s.state_ == NULL) ? NULL : CopyState(s.state_);
101 }
102 }
103
104 } // namespace leveldb
105
106 #endif // STORAGE_LEVELDB_INCLUDE_STATUS_H_
107