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 // Returns true iff the status indicates a NotSupportedError.
IsNotSupportedError()64 bool IsNotSupportedError() const { return code() == kNotSupported; }
65
66 // Returns true iff the status indicates an InvalidArgument.
IsInvalidArgument()67 bool IsInvalidArgument() const { return code() == kInvalidArgument; }
68
69 // Return a string representation of this status suitable for printing.
70 // Returns the string "OK" for success.
71 std::string ToString() const;
72
73 private:
74 // OK status has a NULL state_. Otherwise, state_ is a new[] array
75 // of the following form:
76 // state_[0..3] == length of message
77 // state_[4] == code
78 // state_[5..] == message
79 const char* state_;
80
81 enum Code {
82 kOk = 0,
83 kNotFound = 1,
84 kCorruption = 2,
85 kNotSupported = 3,
86 kInvalidArgument = 4,
87 kIOError = 5
88 };
89
code()90 Code code() const {
91 return (state_ == NULL) ? kOk : static_cast<Code>(state_[4]);
92 }
93
94 Status(Code code, const Slice& msg, const Slice& msg2);
95 static const char* CopyState(const char* s);
96 };
97
Status(const Status & s)98 inline Status::Status(const Status& s) {
99 state_ = (s.state_ == NULL) ? NULL : CopyState(s.state_);
100 }
101 inline void Status::operator=(const Status& s) {
102 // The following condition catches both aliasing (when this == &s),
103 // and the common case where both s and *this are ok.
104 if (state_ != s.state_) {
105 delete[] state_;
106 state_ = (s.state_ == NULL) ? NULL : CopyState(s.state_);
107 }
108 }
109
110 } // namespace leveldb
111
112 #endif // STORAGE_LEVELDB_INCLUDE_STATUS_H_
113