本文主要是介绍leveldb阅读-Status,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
LevelDB中,使用Status用来统一处理返回状态,其设计业是遵循了之前的一贯设计风格,简单明了。为了节省空间,Status采用了const char* state_;来存储数据,利用 state_[0..3] == length of message来表示状态的长度,state_[4] == code表示状态的类型,state_[5..] == message表示详细信息;
Status的定义文件如下:
// 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.
//
// Multiple threads can invoke const methods on a Status without
// external synchronization, but if any of the threads may call a
// non-const method, all threads accessing the same Status must use
// external synchronization.#ifndef STORAGE_LEVELDB_INCLUDE_STATUS_H_
#define STORAGE_LEVELDB_INCLUDE_STATUS_H_#include <string>
#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, msg2);}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; }// Returns true iff the status indicates a Corruption error.bool IsCorruption() const { return code() == kCorruption; }// Returns true iff the status indicates an IOError.bool IsIOError() const { return code() == kIOError; }// Return a string representation of this status suitable for printing.// Returns the string "OK" for success.std::string ToString() const;private://state_数组表示状态,第一部分表示消息的长度,第二部分表示消息的类型//第三部分就是消息的具体信息了;// OK status has a NULL state_. Otherwise, state_ is a new[] array// of the following form:// state_[0..3] == length of message// state_[4] == code// state_[5..] == messageconst char* state_;enum Code {kOk = 0,kNotFound = 1,kCorruption = 2,kNotSupported = 3,kInvalidArgument = 4,kIOError = 5};Code code() const {return (state_ == NULL) ? kOk : static_cast<Code>(state_[4]);}//构造消息Status(Code code, const Slice& msg, const Slice& msg2);static const char* CopyState(const char* s);
};inline Status::Status(const Status& s) {state_ = (s.state_ == NULL) ? NULL : 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.if (state_ != s.state_) {delete[] state_;state_ = (s.state_ == NULL) ? NULL : CopyState(s.state_);}
}} // namespace leveldb#endif // STORAGE_LEVELDB_INCLUDE_STATUS_H_
Status 具体的部分实现源码,通过提供简单的一些接口,能够快速处理消息的管理~
// 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.#include <stdio.h>
#include "port/port.h"
#include "leveldb/status.h"namespace leveldb {//复制消息,消息的内容只读;
const char* Status::CopyState(const char* state) {uint32_t size;memcpy(&size, state, sizeof(size));//前面四个字节表示消息的大小char* result = new char[size + 5];//消息的大小还需要加上5个字节,才是完整的消息部分memcpy(result, state, size + 5);return result;
}//构造消息,格式为msg: msg2
Status::Status(Code code, const Slice& msg, const Slice& msg2) {assert(code != kOk);const uint32_t len1 = msg.size();const uint32_t len2 = msg2.size();const uint32_t size = len1 + (len2 ? (2 + len2) : 0);char* result = new char[size + 5];memcpy(result, &size, sizeof(size));result[4] = static_cast<char>(code);memcpy(result + 5, msg.data(), len1);if (len2) {result[5 + len1] = ':';result[6 + len1] = ' ';memcpy(result + 7 + len1, msg2.data(), len2);}state_ = result;
}//消息转换成string~
std::string Status::ToString() const {if (state_ == NULL) {return "OK";} else {char tmp[30];const char* type;switch (code()) {case kOk:type = "OK";break;case kNotFound:type = "NotFound: ";break;case kCorruption:type = "Corruption: ";break;case kNotSupported:type = "Not implemented: ";break;case kInvalidArgument:type = "Invalid argument: ";break;case kIOError:type = "IO error: ";break;default:snprintf(tmp, sizeof(tmp), "Unknown code(%d): ",static_cast<int>(code()));type = tmp;break;}std::string result(type);uint32_t length;memcpy(&length, state_, sizeof(length));result.append(state_ + 5, length);return result;}
}} // namespace leveldb
这篇关于leveldb阅读-Status的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!