cyq hace 8 meses
padre
commit
f2f8f8200d
Se han modificado 3 ficheros con 35 adiciones y 3 borrados
  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 Ver fichero

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

+ 22
- 0
fielddb/request.cpp Ver fichero

@ -104,6 +104,7 @@ void iCreateReq::Prepare(FieldDB *DB) {
if(istatus == FieldDB::Exist) { if(istatus == FieldDB::Exist) {
//如果已经完成建立索引,则返回成功 //如果已经完成建立索引,则返回成功
done = true; done = true;
Existed = true;
s = Status::OK(); s = Status::OK();
} else { } 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 Ver fichero

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

Cargando…
Cancelar
Guardar