cyq 8 månader sedan
förälder
incheckning
f2f8f8200d
3 ändrade filer med 35 tillägg och 3 borttagningar
  1. +8
    -0
      fielddb/field_db.cpp
  2. +22
    -0
      fielddb/request.cpp
  3. +5
    -3
      fielddb/request.h

+ 8
- 0
fielddb/field_db.cpp Visa fil

@ -229,6 +229,10 @@ Status FieldDB::CreateIndexOnField(const std::string& field_name) {
std::string Field = field_name;
iCreateReq req(&Field,&mutex_);
HandleRequest(req);
//如果已经存在索引,那么可以直接返回
if(req.Existed) {
return req.s;
}
WriteBatch KVBatch,IndexBatch,MetaBatch;
req.ConstructBatch(KVBatch, IndexBatch, MetaBatch, this);
indexDB_->Write(WriteOptions(), &IndexBatch);
@ -257,6 +261,10 @@ Status FieldDB::DeleteIndex(const std::string &field_name) {
std::string Field = field_name;
iDeleteReq req(&Field,&mutex_);
HandleRequest(req);
//如果已经被删除或者不存在,那么可以直接返回
if(req.Deleted) {
return req.s;
}
WriteBatch KVBatch,IndexBatch,MetaBatch;
req.ConstructBatch(KVBatch, IndexBatch, MetaBatch, this);
indexDB_->Write(WriteOptions(), &IndexBatch);

+ 22
- 0
fielddb/request.cpp Visa fil

@ -104,6 +104,7 @@ void iCreateReq::Prepare(FieldDB *DB) {
if(istatus == FieldDB::Exist) {
//如果已经完成建立索引,则返回成功
done = true;
Existed = true;
s = Status::OK();
} else {
//如果正在创建或删除,那么进行等待
@ -131,4 +132,25 @@ void iCreateReq::Finalize(FieldDB *DB) {
}
/*******iDeleteReq*******/
void iDeleteReq::Prepare(FieldDB *DB) {
DB->index_mu.AssertHeld();
if(DB->index_.count(*Field) == 0) {
done = true;
Deleted = true;
s = Status::OK();
return ;
}
}
void iDeleteReq::ConstructBatch(WriteBatch &KVBatch,WriteBatch &IndexBatch,
WriteBatch &MetaBatch,fielddb::FieldDB *DB)
{
}
void iDeleteReq::Finalize(FieldDB *DB) {
}
}

+ 5
- 3
fielddb/request.h Visa fil

@ -87,13 +87,14 @@ public:
class iCreateReq : public Request {
public:
iCreateReq(std::string *Field,port::Mutex *mu):
Field(Field),Request(iCreateReq_t, mu) { };
Field(Field),Request(iCreateReq_t, mu),Existed(false) { };
void ConstructBatch(WriteBatch &KVBatch,WriteBatch &IndexBatch,
WriteBatch &MetaBatch,fielddb::FieldDB *DB) override;
void Prepare(FieldDB *DB) override;
void Finalize(FieldDB *DB) override;
bool Existed;
std::string *Field;
std::deque<Request *> pending_list;
};
@ -102,13 +103,14 @@ public:
class iDeleteReq : public Request {
public:
iDeleteReq(std::string *Field,port::Mutex *mu):
Field(Field),Request(iDeleteReq_t, mu) { };
Field(Field),Request(iDeleteReq_t, mu),Deleted(false) { };
void ConstructBatch(WriteBatch &KVBatch,WriteBatch &IndexBatch,
WriteBatch &MetaBatch,fielddb::FieldDB *DB) override;
void Prepare(FieldDB *DB) override;
void Finalize(FieldDB *DB) override;
bool Deleted;
std::string *Field;
std::deque<Request *> pending_list;
};

Laddar…
Avbryt
Spara