提交 81086283 编写于 作者: W wangkang-xy

Modify command structure

上级 3ab80217
...@@ -37,68 +37,74 @@ enum CmdRes { ...@@ -37,68 +37,74 @@ enum CmdRes {
static const std::string CmdNameSet = "set"; static const std::string CmdNameSet = "set";
class CmdInfo {
public:
CmdInfo(const std::string _name, int _num, int16_t _flag) : name_(_name), arity_(_num), flag_(_flag) {}
bool CheckArg(int num) const {
if ((arity_ > 0 && num != arity_) || (arity_ < 0 && num < -arity_)) {
return false;
}
return true;
}
int16_t flag_rw() const {
return flag_ & CmdFlagsMaskRW;
}
int16_t flag_type() const {
return flag_ & CmdFlagsMaskType;
}
int16_t flag_local() const {
return flag_ & CmdFlagsMaskLocal;
}
int16_t flag_prior() const {
return flag_ & CmdFlagsMaskPrior;
}
std::string name() const {
return name_;
}
private:
std::string name_;
int arity_;
int flag_;
};
class Cmd { class Cmd {
public: public:
Cmd(const std::string _name, int _num, int16_t _flag) : name_(_name), arity_(_num), flag_(_flag) {}; virtual ~Cmd() {}
Cmd() {};
virtual ~Cmd() = 0;
virtual int16_t Do(PikaCmdArgsType &argvs, std::string &ret) = 0; virtual int16_t Do(PikaCmdArgsType &argvs, std::string &ret) = 0;
int16_t flag() { return flag_; } virtual const CmdInfo& cmd_info() = 0;
std::string name() { return name_; }
protected: protected:
virtual bool Initial(PikaCmdArgsType &argvs, std::string &ret) = 0; virtual bool Initial(PikaCmdArgsType &argvs, std::string &ret) = 0;
std::string PopArg(PikaCmdArgsType& arg, bool keyword = false);
bool CheckArg(const PikaCmdArgsType& argv);
private:
std::string name_;
int arity_;
int16_t flag_;
}; };
class CmdGenerator { Cmd* getCmd(const std::string& opt);
public: std::string PopArg(PikaCmdArgsType& arg, bool keyword = false);
static Cmd* getCmd(const std::string& opt);
};
class CmdHolder : public Cmd{ class CmdHolder : public Cmd{
public: public:
explicit CmdHolder(const std::string& opt) : valid_(true){ explicit CmdHolder(const std::string& opt) : valid_(true){
cmd_ = CmdGenerator::getCmd(opt); cmd_ = getCmd(opt);
if (cmd_ == NULL) { valid_ = false; } if (cmd_ == NULL) {
valid_ = false;
}
} }
~CmdHolder() { ~CmdHolder() {
if (valid_) delete cmd_; if (valid_) delete cmd_;
} }
int16_t Do(PikaCmdArgsType &argvs, std::string &ret) { int16_t Do(PikaCmdArgsType &argvs, std::string &ret) {
return cmd_->Do(argvs, ret); return cmd_->Do(argvs, ret);
}
const CmdInfo& cmd_info() {
return cmd_->cmd_info();
}
bool valid() {
return valid_;
} }
int16_t flag() { return cmd_->flag(); }
std::string name() { return cmd_->name(); }
bool valid() { return valid_; }
private: private:
Cmd* cmd_; Cmd* cmd_;
bool valid_; bool valid_;
}; };
/*
* kv
*/
class SetCmd : public Cmd {
public:
enum SetCondition{ANY, NX, XX};
SetCmd() : Cmd(CmdNameSet, -2, CmdFlagsWrite | CmdFlagsKv), sec_(0), condition_(ANY) {};
int16_t Do(PikaCmdArgsType &argvs, std::string &ret);
private:
std::string key_;
std::string value_;
int64_t sec_;
SetCmd::SetCondition condition_;
bool Initial(PikaCmdArgsType &argvs, std::string &ret);
};
#endif #endif
#ifndef __PIKA_KV_H__
#define __PIKA_KV_H__
#include "pika_command.h"
/*
* kv
*/
class SetCmd : public Cmd {
public:
enum SetCondition{ANY, NX, XX};
SetCmd() : sec_(0), condition_(ANY) {};
int16_t Do(PikaCmdArgsType &argvs, std::string &ret);
const CmdInfo& cmd_info() {
return info_;
}
private:
static const CmdInfo info_;
std::string key_;
std::string value_;
int64_t sec_;
SetCmd::SetCondition condition_;
bool Initial(PikaCmdArgsType &argvs, std::string &ret);
};
#endif
#include <algorithm> #include <algorithm>
#include "pika_command.h" #include "pika_kv.h"
Cmd* CmdGenerator::getCmd(const std::string& opt) { const CmdInfo SetCmd::info_(CmdNameSet, -2, CmdFlagsWrite | CmdFlagsKv);
Cmd* getCmd(const std::string& opt) {
Cmd* cmd = NULL; Cmd* cmd = NULL;
if (opt == CmdNameSet) { if (opt == CmdNameSet) {
cmd = new SetCmd(); cmd = new SetCmd();
...@@ -10,7 +12,8 @@ Cmd* CmdGenerator::getCmd(const std::string& opt) { ...@@ -10,7 +12,8 @@ Cmd* CmdGenerator::getCmd(const std::string& opt) {
} }
return cmd; return cmd;
} }
std::string Cmd::PopArg(PikaCmdArgsType& argv, bool keyword) {
std::string PopArg(PikaCmdArgsType& argv, bool keyword) {
std::string next = argv.front(); std::string next = argv.front();
argv.pop_front(); argv.pop_front();
if (keyword) { if (keyword) {
...@@ -19,11 +22,3 @@ std::string Cmd::PopArg(PikaCmdArgsType& argv, bool keyword) { ...@@ -19,11 +22,3 @@ std::string Cmd::PopArg(PikaCmdArgsType& argv, bool keyword) {
return next; return next;
} }
bool Cmd::CheckArg(const PikaCmdArgsType& argv) {
if ((arity_ > 0 && (int)argv.size() != arity_) ||
(arity_ < 0 && (int)argv.size() < -arity_)) {
return false;
}
return true;
}
#include "nemo.h" #include "nemo.h"
#include "pika_command.h" #include "pika_kv.h"
//#include "pika_server.h"
#include <algorithm> #include <algorithm>
//class PikaServer {
//public:
// nemo::Nemo* GetHandle() {return db_;}
//private:
// nemo::Nemo *db_;
//};
//extern int string2l(const char *s, size_t slen, long *value);
extern PikaServer *g_pikaServer; extern PikaServer *g_pikaServer;
bool SetCmd::Initial(PikaCmdArgsType &argv, std::string &ret) { bool SetCmd::Initial(PikaCmdArgsType &argv, std::string &ret) {
if (!CheckArg(argv)) { if (!info_.CheckArg(argv.size())) {
ret = "-ERR wrong number of arguments for " + name() + " command\r\n"; ret = "-ERR wrong number of arguments for " + info_.name() + " command\r\n";
return false; return false;
} }
key_ = PopArg(argv); key_ = PopArg(argv);
...@@ -58,6 +50,7 @@ int16_t SetCmd::Do(PikaCmdArgsType &argv, std::string &ret) { ...@@ -58,6 +50,7 @@ int16_t SetCmd::Do(PikaCmdArgsType &argv, std::string &ret) {
break; break;
default: default:
s = g_pikaServer->GetHandle()->Set(key_, value_, sec_); s = g_pikaServer->GetHandle()->Set(key_, value_, sec_);
break;
} }
if (s.ok() || s.IsNotFound()) { if (s.ok() || s.IsNotFound()) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册