// Copyright (c) 2011 The LevelDB Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. See the AUTHORS file for names of contributors. // // A Status encapsulates the result of an operation. It may indicate success, // or it may indicate an error with an associated error message. #ifndef STORAGE_LEVELDB_INCLUDE_STATUS_H_ #define STORAGE_LEVELDB_INCLUDE_STATUS_H_ #include #include #include "leveldb/slice.h" namespace leveldb { class Status { public: // Create a success status. Status() : state_(NULL) { } ~Status() { delete state_; } // Copy the specified status. Status(const Status& s); void operator=(const Status& s); // Return a success status. static Status OK() { return Status(); } // Return error status of an appropriate type. static Status NotFound(const Slice& msg, const Slice& msg2 = Slice()) { return Status(kNotFound, msg, Slice()); } static Status Corruption(const Slice& msg, const Slice& msg2 = Slice()) { return Status(kCorruption, msg, msg2); } static Status NotSupported(const Slice& msg, const Slice& msg2 = Slice()) { return Status(kNotSupported, msg, msg2); } static Status InvalidArgument(const Slice& msg, const Slice& msg2 = Slice()) { return Status(kInvalidArgument, msg, msg2); } static Status IOError(const Slice& msg, const Slice& msg2 = Slice()) { return Status(kIOError, msg, msg2); } // Returns true iff the status indicates success. bool ok() const { return (state_ == NULL); } // Returns true iff the status indicates a NotFound error. bool IsNotFound() const { return code() == kNotFound; } // Return a string representation of this status suitable for printing. // Returns the string "OK" for success. std::string ToString() const; private: enum Code { kOk = 0, kNotFound = 1, kCorruption = 2, kNotSupported = 3, kInvalidArgument = 4, kIOError = 5, }; Code code() const { return (state_ == NULL) ? kOk : state_->first; } Status(Code code, const Slice& msg, const Slice& msg2); typedef std::pair State; State* state_; }; inline Status::Status(const Status& s) { state_ = (s.state_ == NULL) ? NULL : new State(*s.state_); } inline void Status::operator=(const Status& s) { if (this != &s) { delete state_; state_ = (s.state_ == NULL) ? NULL : new State(*s.state_); } } } #endif // STORAGE_LEVELDB_INCLUDE_STATUS_H_