c++ 操作 leveldb

创建日期: 2024-10-29 15:25 | 作者: 风波 | 浏览次数: 17 | 分类: KV数据库

官方文档:https://github.com/google/leveldb/blob/main/doc/index.md

调试环境:Ubuntu24.04

1. 安装 libleveldb-dev

apt install -y libleveldb-dev

2. C++ 操作 leveldb

2.1 打开数据库

    std::string dbname = "./lvdb";
    leveldb::DB* db;
    leveldb::Options options;
    options.create_if_missing = true;
    //options.error_if_exists = true; //如果数据库已存在,则报错
    leveldb::Status s = leveldb::DB::Open(options, dbname, &db);
    if(!s.ok()) {
        std::cout << "opendb failed: " << s.ToString() << std::endl;
    } else {
        std::cout << "opendb success" << std::endl;
    }

2.2 插入数据

    s = db->Put(leveldb::WriteOptions(), key, value);

2.3 get 数据

s = db->Get(leveldb::ReadOptions(), key, &value);

2.4 删除数据

s = db->Delete(leveldb::WriteOptions(), key);

2.5 完整例子代码

#include <leveldb/db.h>
#include <iostream>

void put_get_delete(leveldb::DB* db) {
    leveldb::Status s;
    //插入数据
    std::string key = "hello";
    std::string value = "world";

    s = db->Get(leveldb::ReadOptions(), key, &value);
    if(s.IsNotFound()) {
        std::cout << "error " << s.ToString() << " for key: " << key << std::endl;
    }

    s = db->Put(leveldb::WriteOptions(), key, value);
    if(!s.ok()) {
        std::cout << "Put data failed: " << s.ToString() << std::endl;
    } else {
        std::cout << "Put data success" << std::endl;
    }
    value = "";

    s = db->Get(leveldb::ReadOptions(), key, &value);
    std::cout << "Get data, key: " << key << ", value: " << value << std::endl;

    s = db->Delete(leveldb::WriteOptions(), key);
    if(!s.ok()) {
        std::cout << "Delete key failed: " << s.ToString() << std::endl;
    } else {
        std::cout << "Delete key success: " << s.ToString() << std::endl;
    }

    s = db->Get(leveldb::ReadOptions(), key, &value);
    if(s.IsNotFound()) {
        std::cout << "error " << s.ToString() << " for key: " << key << std::endl;
    }
}

void loop(leveldb::DB* db) {
    std::string value = "xxx";
    leveldb::Status s;
    s = db->Put(leveldb::WriteOptions(), "k1", value);
    s = db->Put(leveldb::WriteOptions(), "k2", value);
    s = db->Put(leveldb::WriteOptions(), "k3", value);

    leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions());
    //it->Seek(start); // seek to 指定的 key 前缀
    //for (it->SeekToLast(); it->Valid(); it->Prev()) // seek to last key
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": "  << it->value().ToString() << std::endl;
    }
    if(!it->status().ok()) {
        std::cout << "some error ahppend: " << it->status().ToString() << std::endl;
    }
    delete it;
}

int main() {
    std::string dbname = "./lvdb";
    leveldb::DB* db;
    leveldb::Options options;
    options.create_if_missing = true;
    //options.error_if_exists = true; //如果数据库已存在,则报错
    leveldb::Status s = leveldb::DB::Open(options, dbname, &db);
    if(!s.ok()) {
        std::cout << "opendb failed: " << s.ToString() << std::endl;
    } else {
        std::cout << "opendb success" << std::endl;
    }

    put_get_delete(db);
    loop(db);

    delete db;

    return 0;
}
17 浏览
0 评论