在 leveldb 中使用 C++ protobuf 格式化结构。 set/get 操作

Using C++ protobuf formatted structure in leveldb. set/get operations

我想制作一个使用 leveldb 的 POC,以便以 protobuf 格式存储不同数据类型的键值 table。

到目前为止我能够打开数据库文件,我还看到了具有以下签名的 get 函数:

virtual Status Get(const ReadOptions& options, const Slice& key, std::string* value)=0

我知道这个值实际上是指像向量这样的二进制字符串,而不是常规的字母数字字符串,所以我猜它可以适合多类型基元,如字符串、uint、枚举)但它如何支持 struct/class 表示 c++ 中的 protobuf 布局 ?

所以这是我想存储在 leveldb 中的原型文件:

message agentStatus {
    string ip = 1;
    uint32 port = 2;
    string url = 3;
    google.protobuf.Timestamp last_seen = 4;
    google.protobuf.Timestamp last_keepalive = 5;
    bool status = 6;
}

这是我当前的 POC 代码。如何使用 get 方法访问上面 table 中的任何变量?

#include <leveldb/db.h>


void main () { 

  std::string db_file_path = "/tmp/data.db";
  leveldb::DB* db;
  leveldb::Status status;

  leveldb::Options options;
  options.create_if_missing = false;
  status_ = leveldb::DB::Open(options, db_file_path, &db);
  if (!status_.ok()) {
    throw std::logic_error("unable to open db");
  }

谢谢!

  1. 需要将protobuf消息序列化为二进制字符串,即SerilaizeToString,并使用Put方法将二进制字符串以key写入LevelDB。

  2. 然后可以使用Get方法通过给定的key获取二进制值,并将二进制字符串解析为protobuf消息,即ParseFromString.

  3. 终于可以得到消息的字段了