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. 24 Status() : state_(NULL) { } 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. 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. 52 bool ok() const { return (state_ == NULL); } 53 54 // Returns true iff the status indicates a NotFound error. 55 bool IsNotFound() const { return code() == kNotFound; } 56 57 // Returns true iff the status indicates a Corruption error. 58 bool IsCorruption() const { return code() == kCorruption; } 59 60 // Returns true iff the status indicates an IOError. 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 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 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