10225501448 李度 10225101546 陈胤遒 10215501422 高宇菲
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 

93 linhas
3.4 KiB

#include "port/port_stdcxx.h"
#include "db/db_impl.h"
#include <deque>
#include <map>
#include <set>
#include <string>
#include "leveldb/db.h"
#include "leveldb/env.h"
#include "leveldb/options.h"
#include "leveldb/slice.h"
#include "leveldb/status.h"
#include "fielddb/request.h"
#include <shared_mutex>
# ifndef FIELD_DB_H
# define FIELD_DB_H
namespace fielddb {
using namespace leveldb;
enum IndexStatus{
Creating,
Deleting,
Exist,
NotExist
};
class FieldDB : DB {
public:
friend class Request;
friend class FieldsReq;
friend class iCreateReq;
friend class iDeleteReq;
friend class DeleteReq;
//用的时候必须FieldDB *db = new FieldDB()再open,不能像之前一样DB *db
FieldDB() : indexDB_(nullptr), kvDB_(nullptr), metaDB_(nullptr) {};
~FieldDB();
/*lab1的要求,作为db派生类要实现的虚函数*/
Status Put(const WriteOptions &options, const Slice &key, const Slice &value) override;
Status PutFields(const WriteOptions &, const Slice &key, const FieldArray &fields) 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;
Status GetFields(const ReadOptions &options, const Slice &key, FieldArray *fields) override;
std::vector<std::string> FindKeysByField(Field &field) 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;
/*与索引相关*/
Status CreateIndexOnField(const std::string& field_name);
Status DeleteIndex(const std::string &field_name);
std::vector<std::string> QueryByIndex(const Field &field, Status *s);
//返回当前数据库中索引状态,用来测试,不过也可以作为一个功能?
IndexStatus GetIndexStatus(const std::string &fieldName);
static Status OpenFieldDB(const Options& options,const std::string& name,FieldDB** dbptr);
private:
//根据metaDB的内容进行恢复
Status Recover();
private:
std::string dbname_;
const Options *options_;
Env *env_;
leveldb::DB *metaDB_;
leveldb::DB *indexDB_;
leveldb::DB *kvDB_;
using FieldName = std::string;
// 标记index的状态,如果是creating/deleting,则会附带相应的请求
std::map<FieldName, std::pair<IndexStatus,Request*>> index_;
port::Mutex index_mu;
leveldb::port::Mutex mutex_; // mutex for taskqueue
std::deque<Request *> taskqueue_;
std::vector<std::pair<std::string, std::string>> FindKeysAndValByFieldName (
const std::string &fieldName);
/*For request handling*/
Status HandleRequest(Request &req); //每个请求自行构造请求后交由这个函数处理
Request *GetHandleInterval(); //获得任务队列中的待处理区间,区间划分规则和原因见文档
};
Status DestroyDB(const std::string& name,
const Options& options);
} // end of namespace
# endif