@ -25,7 +25,7 @@ namespace rocksdb {
class Status {
public :
// Create a success status.
Status ( ) : code_ ( kOk ) , state_ ( nullptr ) { }
Status ( ) : code_ ( kOk ) , subcode_ ( kNone ) , s tate_ ( nullptr ) { }
~ Status ( ) { delete [ ] state_ ; }
// Copy the specified status.
@ -34,6 +34,35 @@ class Status {
bool operator = = ( const Status & rhs ) const ;
bool operator ! = ( const Status & rhs ) const ;
enum Code {
kOk = 0 ,
kNotFound = 1 ,
kCorruption = 2 ,
kNotSupported = 3 ,
kInvalidArgument = 4 ,
kIOError = 5 ,
kMergeInProgress = 6 ,
kIncomplete = 7 ,
kShutdownInProgress = 8 ,
kTimedOut = 9 ,
kAborted = 10 ,
kBusy = 11 ,
kExpired = 12 ,
kTryAgain = 13
} ;
Code code ( ) const { return code_ ; }
enum SubCode {
kNone = 0 ,
kMutexTimeout = 1 ,
kLockTimeout = 2 ,
kLockLimit = 3 ,
kMaxSubCode
} ;
SubCode subcode ( ) const { return subcode_ ; }
// Return a success status.
static Status OK ( ) { return Status ( ) ; }
@ -42,51 +71,76 @@ class Status {
return Status ( kNotFound , msg , msg2 ) ;
}
// Fast path for not found without malloc;
static Status NotFound ( ) {
return Status ( kNotFound ) ;
}
static Status NotFound ( SubCode msg = kNone ) { return Status ( kNotFound , msg ) ; }
static Status Corruption ( const Slice & msg , const Slice & msg2 = Slice ( ) ) {
return Status ( kCorruption , msg , msg2 ) ;
}
static Status Corruption ( SubCode msg = kNone ) {
return Status ( kCorruption , msg ) ;
}
static Status NotSupported ( const Slice & msg , const Slice & msg2 = Slice ( ) ) {
return Status ( kNotSupported , msg , msg2 ) ;
}
static Status NotSupported ( SubCode msg = kNone ) {
return Status ( kNotSupported , msg ) ;
}
static Status InvalidArgument ( const Slice & msg , const Slice & msg2 = Slice ( ) ) {
return Status ( kInvalidArgument , msg , msg2 ) ;
}
static Status InvalidArgument ( SubCode msg = kNone ) {
return Status ( kInvalidArgument , msg ) ;
}
static Status IOError ( const Slice & msg , const Slice & msg2 = Slice ( ) ) {
return Status ( kIOError , msg , msg2 ) ;
}
static Status MergeInProgress ( ) { return Status ( kMergeInProgress ) ; }
static Status IOError ( SubCode msg = kNone ) { return Status ( kIOError , msg ) ; }
static Status MergeInProgress ( const Slice & msg , const Slice & msg2 = Slice ( ) ) {
return Status ( kMergeInProgress , msg , msg2 ) ;
}
static Status MergeInProgress ( SubCode msg = kNone ) {
return Status ( kMergeInProgress , msg ) ;
}
static Status Incomplete ( const Slice & msg , const Slice & msg2 = Slice ( ) ) {
return Status ( kIncomplete , msg , msg2 ) ;
}
static Status ShutdownInProgress ( ) {
return Status ( kShutdownInProgress ) ;
static Status Incomplete ( SubCode msg = kNone ) {
return Status ( kIncomplete , msg ) ;
}
static Status ShutdownInProgress ( SubCode msg = kNone ) {
return Status ( kShutdownInProgress , msg ) ;
}
static Status ShutdownInProgress ( const Slice & msg ,
const Slice & msg2 = Slice ( ) ) {
return Status ( kShutdownInProgress , msg , msg2 ) ;
}
static Status Aborted ( ) {
return Status ( kAborted ) ;
}
static Status Aborted ( SubCode msg = kNone ) { return Status ( kAborted , msg ) ; }
static Status Aborted ( const Slice & msg , const Slice & msg2 = Slice ( ) ) {
return Status ( kAborted , msg , msg2 ) ;
}
static Status Busy ( ) { return Status ( kBusy ) ; }
static Status Busy ( SubCode msg = kNone ) { return Status ( kBusy , msg ) ; }
static Status Busy ( const Slice & msg , const Slice & msg2 = Slice ( ) ) {
return Status ( kBusy , msg , msg2 ) ;
}
static Status TimedOut ( ) { return Status ( kTimedOut ) ; }
static Status TimedOut ( SubCode msg = kNone ) { return Status ( kTimedOut , msg ) ; }
static Status TimedOut ( const Slice & msg , const Slice & msg2 = Slice ( ) ) {
return Status ( kTimedOut , msg , msg2 ) ;
}
static Status Expired ( ) { return Status ( kExpired ) ; }
static Status Expired ( SubCode msg = kNone ) { return Status ( kExpired , msg ) ; }
static Status Expired ( const Slice & msg , const Slice & msg2 = Slice ( ) ) {
return Status ( kExpired , msg , msg2 ) ;
}
static Status TryAgain ( ) { return Status ( kTryAgain ) ; }
static Status TryAgain ( SubCode msg = kNone ) { return Status ( kTryAgain , msg ) ; }
static Status TryAgain ( const Slice & msg , const Slice & msg2 = Slice ( ) ) {
return Status ( kTryAgain , msg , msg2 ) ;
}
@ -138,26 +192,6 @@ class Status {
// Returns the string "OK" for success.
std : : string ToString ( ) const ;
enum Code {
kOk = 0 ,
kNotFound = 1 ,
kCorruption = 2 ,
kNotSupported = 3 ,
kInvalidArgument = 4 ,
kIOError = 5 ,
kMergeInProgress = 6 ,
kIncomplete = 7 ,
kShutdownInProgress = 8 ,
kTimedOut = 9 ,
kAborted = 10 ,
kBusy = 11 ,
kExpired = 12 ,
kTryAgain = 13
} ;
Code code ( ) const {
return code_ ;
}
private :
// A nullptr state_ (which is always the case for OK) means the message
// is empty.
@ -165,21 +199,26 @@ class Status {
// state_[0..3] == length of message
// state_[4..] == message
Code code_ ;
SubCode subcode_ ;
const char * state_ ;
explicit Status ( Code _code ) : code_ ( _code ) , state_ ( nullptr ) { }
static const char * msgs [ static_cast < int > ( kMaxSubCode ) ] ;
explicit Status ( Code _code , SubCode _subcode = kNone )
: code_ ( _code ) , subcode_ ( _subcode ) , state_ ( nullptr ) { }
Status ( Code _code , const Slice & msg , const Slice & msg2 ) ;
static const char * CopyState ( const char * s ) ;
} ;
inline Status : : Status ( const Status & s ) {
code_ = s . code_ ;
inline Status : : Status ( const Status & s ) : code_ ( s . code_ ) , subcode_ ( s . subcode_ ) {
state_ = ( s . state_ = = nullptr ) ? nullptr : CopyState ( s . state_ ) ;
}
inline void Status : : operator = ( const Status & s ) {
// The following condition catches both aliasing (when this == &s),
// and the common case where both s and *this are ok.
code_ = s . code_ ;
subcode_ = s . subcode_ ;
if ( state_ ! = s . state_ ) {
delete [ ] state_ ;
state_ = ( s . state_ = = nullptr ) ? nullptr : CopyState ( s . state_ ) ;