Home | History | Annotate | Download | only in leveldb
      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