前言
leveldb 是google的大佬写的一个嵌入式的KV数据库。底层是使用的LSM-Tree 索引结构。本文主要涉及levelDB的数据写入,也就是Put 操作。我是个搞java的,C或者C++是不咋会,所以边看边学,可能比较啰嗦。
Debug环境搭建
首先拉代码:
git clone github.com/google/leve…
因为源码中的third_party 包含了两个,一个是google的test,还有一个是benchmark。需要拉下来,放到third_party的目录,或者直接在目录里pull
git clone github.com/google/benc… git clone github.com/google/goog…
按照文档中,需要
mkdir -p build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build .
但是因为我的目的是在clion debug。所以暂时没有做这一步,而是在源码中新增了一个app目录,下面放我的demo代码:
#include <cassert>
#include <iostream>
#include "include/leveldb/db.h"
int main() {
leveldb::DB *db;
leveldb::Options options;
options.create_if_missing = true;
leveldb::Status status = leveldb::DB::Open(options, "/home/tuitaking/source/leveldb/file", &db);
assert(status.ok());
std::cout << "leveldb open success!" << std::endl;
std::string value;
std::string key1 = "testkey1";
leveldb::Status s = db->Get(leveldb::ReadOptions(), key1, &value);
if (s.IsNotFound()) {
std::cout << "can not found for key:" << key1 << std::endl;
db->Put(leveldb::WriteOptions(), key1, "testvalue1");
}
s = db->Get(leveldb::ReadOptions(), key1, &value);
if (s.ok()) {
std::cout << "found key:" << key1 << ",value:" << value << std::endl;
}
s = db->Delete(leveldb::WriteOptions(), key1);
if (s.ok()) {
std::cout << "delete key success which key:" << key1 << std::endl;
}
s = db->Get(leveldb::ReadOptions(), key1, &value);
if (s.IsNotFound()) {
std::cout << "can not found after delete for key:" << key1 << std::endl;
}
delete db;
return 0;
}
然后在CMakeLists.txt 中新增上这个模块
add_library(leveldb "" )
target_sources(leveldb
PRIVATE
"${PROJECT_BINARY_DIR}/${LEVELDB_PORT_CONFIG_DIR}/port_config.h"
"app/main.cpp" # 加这个位置
"db/builder.cc"
然后将test 也加入
leveldb_test("db/c_test.c")
leveldb_test("app/main.cpp") # 加的这行
然后就可以在clion中看到一个叫main的test,直接可以debug。至于为什么估计需要看cmake 相关的知识,暂时不去管他,总之这样就可以直接debug了。如果是windows,cmake的环境只要做好了,其他的都是类似。在clion中可以直接debug。