#include #include #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 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 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