10225501448 李度 10225101546 陈胤遒 10215501422 高宇菲
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 

130 líneas
3.8 KiB

#include <deque>
#include <string>
#include "leveldb/status.h"
#include "leveldb/write_batch.h"
#include "port/port_stdcxx.h"
#include "util/mutexlock.h"
#include "util/serialize_value.h"
// #include "fielddb/field_db.h"
#ifndef REQUEST_H
#define REQUEST_H
namespace fielddb {
using namespace leveldb;
// 在taskqueue中的Request,由taskqueue最开始的线程处理一批Request
// 这个思路与write写入的思路类似
class FieldDB;
class Request {
public:
friend class FieldDB;
enum RequestType {
FieldsReq_t,
ValueReq_t,
iCreateReq_t,
iDeleteReq_t,
DeleteReq_t,
};
public:
// Request(std::string *Key,std::string *Value,port::Mutex *mu):
// Key(Key),Value(Value),hasFields(false),cond_(mu) { }
// Request(std::string *Key,FieldArray *Fields,port::Mutex *mu):
// Key(Key),Fields(Fields),hasFields(true),cond_(mu) { }
Request(RequestType type,port::Mutex *mu):
type_(type),cond_(mu),done(false) { parent = this; };
virtual ~Request();
inline bool isFieldsReq() { return type_ == FieldsReq_t; }
// inline bool isValueReq() { return type_ == ValueReq_t; }
inline bool isiCreateReq() { return type_ == iCreateReq_t; }
inline bool isiDeleteReq() { return type_ == iDeleteReq_t; }
inline bool isDeleteReq() { return type_ == DeleteReq_t; }
//用于含有Fields的
virtual void ConstructBatch(WriteBatch &KVBatch,WriteBatch &IndexBatch,
WriteBatch &MetaBatch,fielddb::FieldDB *DB);
//主要用于icreate和idelete在队列中的注册当前状态
virtual void Prepare(FieldDB *DB);
virtual void Finalize(FieldDB *DB);
virtual void PendReq(Request *req);
bool isPending();
// protected:
bool done;
Status s;
port::CondVar cond_;
RequestType type_;
Request *parent;
};
//含有field的put
class FieldsReq : public Request {
public:
FieldsReq(std::string *Key,FieldArray *Fields,port::Mutex *mu):
Key(Key),Fields(Fields),Request(FieldsReq_t,mu) { };
void ConstructBatch(WriteBatch &KVBatch,WriteBatch &IndexBatch,
WriteBatch &MetaBatch,fielddb::FieldDB *DB) override;
std::string *Key;
FieldArray *Fields;
};
//不含有field的put,但是计划被弃用了
// class ValueReq : public Request {
// public:
// ValueReq(std::string *Key,std::string *Value,port::Mutex *mu):
// Key(Key),Value(Value),Request(ValueReq_t,mu) { };
// std::string *Key;
// std::string *Value;
// };
//TODO:下面的Field什么的可能通过传引用的方式会更加好?
//创建索引的request
class iCreateReq : public Request {
public:
iCreateReq(std::string *Field,port::Mutex *mu):
Field(Field),Request(iCreateReq_t, mu) { };
void ConstructBatch(WriteBatch &KVBatch,WriteBatch &IndexBatch,
WriteBatch &MetaBatch,fielddb::FieldDB *DB) override;
void Prepare(FieldDB *DB) override;
void Finalize(FieldDB *DB) override;
std::string *Field;
std::deque<Request *> pending_list;
};
//删除索引的request
class iDeleteReq : public Request {
public:
iDeleteReq(std::string *Field,port::Mutex *mu):
Field(Field),Request(iDeleteReq_t, mu) { };
void ConstructBatch(WriteBatch &KVBatch,WriteBatch &IndexBatch,
WriteBatch &MetaBatch,fielddb::FieldDB *DB) override;
void Prepare(FieldDB *DB) override;
void Finalize(FieldDB *DB) override;
std::string *Field;
std::deque<Request *> pending_list;
};
//删除key的request
class DeleteReq : public Request {
public:
DeleteReq(std::string *Key,port::Mutex *mu):
Key(Key),Request(DeleteReq_t,mu) { };
void ConstructBatch(WriteBatch &KVBatch,WriteBatch &IndexBatch,
WriteBatch &MetaBatch,fielddb::FieldDB *DB) override;
std::string *Key;
};
}
#endif