|
#pragma
|
|
#include <iostream>
|
|
#include "leveldb/db.h"
|
|
#include <vector>
|
|
#include <mutex>
|
|
namespace leveldb {
|
|
class LEVELDB_EXPORT MyLevelDB : leveldb::DB {
|
|
public:
|
|
MyLevelDB(Options& options, std::string db_name)
|
|
: _op(options), _db_name(db_name) {
|
|
//打开数据库
|
|
Status status = DB::Open(options, db_name + "_main", &_fields_db);
|
|
if (!status.ok()) {
|
|
std::cerr << "Open main database failure: " << status.ToString() << std::endl;
|
|
abort();
|
|
}
|
|
}
|
|
//序列化为字符串
|
|
void SerializeValue(const FieldArray& fields, std::string& resString);
|
|
// 反序列化为字段数组
|
|
void ParseValue(const std::string& value_str, FieldArray& resFieldArray);
|
|
//字段存储
|
|
Status PutWithFields(const WriteOptions& options, const std::string& key,const FieldArray& fields);
|
|
//字段查找
|
|
Status FindKeysByField(const ReadOptions& options, const Field field,std::vector<std::string>* keys);
|
|
//创建索引
|
|
Status CreateIndexOnField(const std::string& field_name);
|
|
//删除索引
|
|
Status DeleteIndex(std::string& field_name);
|
|
void QueryByIndex(const ReadOptions& options, Field& field,
|
|
std::vector<std::string>& keys);
|
|
public:
|
|
Status Put(const WriteOptions& options, const Slice& key,
|
|
const Slice& value) override;
|
|
|
|
Status Delete(const WriteOptions& options, const Slice& key) override;
|
|
|
|
Status Write(const WriteOptions& options, WriteBatch* updates) override;
|
|
|
|
Status Get(const ReadOptions& options, const Slice& key,
|
|
std::string* value) override;
|
|
|
|
Iterator* NewIterator(const ReadOptions& options) override;
|
|
|
|
const Snapshot* GetSnapshot() override;
|
|
|
|
void ReleaseSnapshot(const Snapshot* snapshot) override;
|
|
|
|
bool GetProperty(const Slice& property, std::string* value) override;
|
|
|
|
void GetApproximateSizes(const Range* range, int n, uint64_t* sizes) override;
|
|
|
|
void CompactRange(const Slice* begin, const Slice* end) override;
|
|
private:
|
|
Options _op;
|
|
std::string _db_name;
|
|
DB* _fields_db;
|
|
std::vector<std::string> index_list_;
|
|
std::mutex mutex_;
|
|
std::vector<DB*> index_db;
|
|
};
|
|
}
|