提交 bd0fe7d6 编写于 作者: K KernelMaker

add lpushx lpop rpush rpushx rpop llen lrange lset

上级 3419cd31
...@@ -117,10 +117,57 @@ public: ...@@ -117,10 +117,57 @@ public:
/* /*
* Lists * Lists
*/ */
class LLenCmd : public Cmd {
public:
LLenCmd(int a) : Cmd(a) {};
virtual void Do(std::list<std::string> &argvs, std::string &ret);
};
class LPopCmd : public Cmd {
public:
LPopCmd(int a) : Cmd(a) {};
virtual void Do(std::list<std::string> &argvs, std::string &ret);
};
class LPushCmd : public Cmd { class LPushCmd : public Cmd {
public: public:
LPushCmd(int a) : Cmd(a) {}; LPushCmd(int a) : Cmd(a) {};
virtual void Do(std::list<std::string> &argvs, std::string &ret); virtual void Do(std::list<std::string> &argvs, std::string &ret);
}; };
class LPushxCmd : public Cmd {
public:
LPushxCmd(int a) : Cmd(a) {};
virtual void Do(std::list<std::string> &argvs, std::string &ret);
};
class LRangeCmd : public Cmd {
public:
LRangeCmd(int a) : Cmd(a) {};
virtual void Do(std::list<std::string> &argvs, std::string &ret);
};
class LSetCmd : public Cmd {
public:
LSetCmd(int a) : Cmd(a) {};
virtual void Do(std::list<std::string> &argvs, std::string &ret);
};
class RPopCmd : public Cmd {
public:
RPopCmd(int a) : Cmd(a) {};
virtual void Do(std::list<std::string> &argvs, std::string &ret);
};
class RPushCmd : public Cmd {
public:
RPushCmd(int a) : Cmd(a) {};
virtual void Do(std::list<std::string> &argvs, std::string &ret);
};
class RPushxCmd : public Cmd {
public:
RPushxCmd(int a) : Cmd(a) {};
virtual void Do(std::list<std::string> &argvs, std::string &ret);
};
#endif #endif
...@@ -157,10 +157,26 @@ int main(int argc, char **argv) ...@@ -157,10 +157,26 @@ int main(int argc, char **argv)
g_pikaCmd.insert(std::pair<std::string, Cmd *>("hscan", hscanptr)); g_pikaCmd.insert(std::pair<std::string, Cmd *>("hscan", hscanptr));
/* /*
* hash * lists
*/ */
LLenCmd *llenptr = new LLenCmd(2);
g_pikaCmd.insert(std::pair<std::string, Cmd *>("llen", llenptr));
LPopCmd *lpopptr = new LPopCmd(2);
g_pikaCmd.insert(std::pair<std::string, Cmd *>("lpop", lpopptr));
LPushCmd *lpushptr = new LPushCmd(-3); LPushCmd *lpushptr = new LPushCmd(-3);
g_pikaCmd.insert(std::pair<std::string, Cmd *>("lpush", lpushptr)); g_pikaCmd.insert(std::pair<std::string, Cmd *>("lpush", lpushptr));
LPushxCmd *lpushxptr = new LPushxCmd(3);
g_pikaCmd.insert(std::pair<std::string, Cmd *>("lpushx", lpushxptr));
LRangeCmd *lrangeptr = new LRangeCmd(4);
g_pikaCmd.insert(std::pair<std::string, Cmd *>("lrange", lrangeptr));
LSetCmd *lsetptr = new LSetCmd(4);
g_pikaCmd.insert(std::pair<std::string, Cmd *>("lset", lsetptr));
RPopCmd *rpopptr = new RPopCmd(2);
g_pikaCmd.insert(std::pair<std::string, Cmd *>("rpop", rpopptr));
RPushCmd *rpushptr = new RPushCmd(-3);
g_pikaCmd.insert(std::pair<std::string, Cmd *>("rpush", rpushptr));
RPushxCmd *rpushxptr = new RPushxCmd(3);
g_pikaCmd.insert(std::pair<std::string, Cmd *>("rpushx", rpushxptr));
/* /*
* Init the server * Init the server
......
...@@ -7,6 +7,56 @@ ...@@ -7,6 +7,56 @@
extern PikaServer *g_pikaServer; extern PikaServer *g_pikaServer;
extern std::map<std::string, Cmd *> g_pikaCmd; extern std::map<std::string, Cmd *> g_pikaCmd;
void LLenCmd::Do(std::list<std::string> &argv, std::string &ret) {
if ((arity > 0 && (int)argv.size() != arity) || (arity < 0 && (int)argv.size() < -arity)) {
ret = "-ERR wrong number of arguments for ";
ret.append(argv.front());
ret.append(" command\r\n");
return;
}
argv.pop_front();
std::string key = argv.front();
argv.pop_front();
uint64_t llen;
nemo::Status s = g_pikaServer->GetHandle()->LLen(key, &llen);
if (s.IsCorruption()) {
ret = "+ERR ";
ret.append(s.ToString().c_str());
ret.append("\r\n");
} else {
char buf[32];
snprintf(buf, sizeof(buf), ":%lu\r\n", llen);
ret.append(buf);
}
}
void LPopCmd::Do(std::list<std::string> &argv, std::string &ret) {
if ((arity > 0 && (int)argv.size() != arity) || (arity < 0 && (int)argv.size() < -arity)) {
ret = "-ERR wrong number of arguments for ";
ret.append(argv.front());
ret.append(" command\r\n");
return;
}
argv.pop_front();
std::string key = argv.front();
argv.pop_front();
std::string value;
nemo::Status s = g_pikaServer->GetHandle()->LPop(key, &value);
if (s.ok()) {
char buf[32];
snprintf(buf, sizeof(buf), "$%lu\r\n", value.size());
ret.append(buf);
ret.append(value.data(), value.size());
ret.append("\r\n");
} else if (s.IsNotFound()) {
ret.append("$-1\r\n");
} else {
ret.append("-ERR ");
ret.append(s.ToString().c_str());
ret.append("\r\n");
}
}
void LPushCmd::Do(std::list<std::string> &argv, std::string &ret) { void LPushCmd::Do(std::list<std::string> &argv, std::string &ret) {
if ((arity > 0 && (int)argv.size() != arity) || (arity < 0 && (int)argv.size() < -arity)) { if ((arity > 0 && (int)argv.size() != arity) || (arity < 0 && (int)argv.size() < -arity)) {
ret = "-ERR wrong number of arguments for "; ret = "-ERR wrong number of arguments for ";
...@@ -38,3 +88,191 @@ void LPushCmd::Do(std::list<std::string> &argv, std::string &ret) { ...@@ -38,3 +88,191 @@ void LPushCmd::Do(std::list<std::string> &argv, std::string &ret) {
ret.append(buf); ret.append(buf);
} }
} }
void LPushxCmd::Do(std::list<std::string> &argv, std::string &ret) {
if ((arity > 0 && (int)argv.size() != arity) || (arity < 0 && (int)argv.size() < -arity)) {
ret = "-ERR wrong number of arguments for ";
ret.append(argv.front());
ret.append(" command\r\n");
return;
}
argv.pop_front();
std::string key = argv.front();
argv.pop_front();
std::string value = argv.front();
argv.pop_front();
uint64_t llen = 0;
nemo::Status s = g_pikaServer->GetHandle()->LPushx(key, value, &llen);
if (s.IsCorruption()) {
ret = "+ERR ";
ret.append(s.ToString().c_str());
ret.append("\r\n");
} else {
char buf[32];
snprintf(buf, sizeof(buf), ":%lu\r\n", llen);
ret.append(buf);
}
}
void LRangeCmd::Do(std::list<std::string> &argv, std::string &ret) {
if ((arity > 0 && (int)argv.size() != arity) || (arity < 0 && (int)argv.size() < -arity)) {
ret = "-ERR wrong number of arguments for ";
ret.append(argv.front());
ret.append(" command\r\n");
return;
}
argv.pop_front();
std::string key = argv.front();
argv.pop_front();
std::string left = argv.front();
argv.pop_front();
std::string right = argv.front();
argv.pop_front();
long l_left, l_right;
if (!string2l(left.data(), left.size(), &l_left)) {
ret = "-ERR value is not an integer or out of range\r\n";
return;
}
if (!string2l(right.data(), right.size(), &l_right)) {
ret = "-ERR value is not an integer or out of range\r\n";
return;
}
std::vector<nemo::IV> ivs;
nemo::Status s = g_pikaServer->GetHandle()->LRange(key, l_left, l_right, ivs);
if (s.ok()) {
char buf[32];
snprintf(buf, sizeof(buf), "*%lu\r\n", ivs.size());
ret.append(buf);
std::vector<nemo::IV>::iterator iter;
for (iter = ivs.begin(); iter != ivs.end(); iter++) {
snprintf(buf, sizeof(buf), "$%lu\r\n", iter->val.size());
ret.append(buf);
ret.append(iter->val.data(), iter->val.size());
ret.append("\r\n");
}
} else if (s.IsNotFound()) {
ret = ":0\r\n";
} else {
ret = "+ERR ";
ret.append(s.ToString().c_str());
ret.append("\r\n");
}
}
void LSetCmd::Do(std::list<std::string> &argv, std::string &ret) {
if ((arity > 0 && (int)argv.size() != arity) || (arity < 0 && (int)argv.size() < -arity)) {
ret = "-ERR wrong number of arguments for ";
ret.append(argv.front());
ret.append(" command\r\n");
return;
}
argv.pop_front();
std::string key = argv.front();
argv.pop_front();
std::string index = argv.front();
argv.pop_front();
long l_index = 0;
if (!string2l(index.data(), index.size(), &l_index)) {
ret = "-ERR value is not an integer or out of range\r\n";
return;
}
std::string new_val = argv.front();
argv.pop_front();
nemo::Status s = g_pikaServer->GetHandle()->LSet(key, l_index, new_val);
if (s.ok()) {
ret = "+OK\r\n";
} else if (s.IsNotFound()) {
ret = "+ERR no such key\r\n";
} else if (s.IsCorruption() && s.ToString() == "Corruption: index out of range") {
ret = "+ERR index out of range\r\n";
} else {
ret = "+ERR ";
ret.append(s.ToString().c_str());
ret.append("\r\n");
}
}
void RPopCmd::Do(std::list<std::string> &argv, std::string &ret) {
if ((arity > 0 && (int)argv.size() != arity) || (arity < 0 && (int)argv.size() < -arity)) {
ret = "-ERR wrong number of arguments for ";
ret.append(argv.front());
ret.append(" command\r\n");
return;
}
argv.pop_front();
std::string key = argv.front();
argv.pop_front();
std::string value;
nemo::Status s = g_pikaServer->GetHandle()->RPop(key, &value);
if (s.ok()) {
char buf[32];
snprintf(buf, sizeof(buf), "$%lu\r\n", value.size());
ret.append(buf);
ret.append(value.data(), value.size());
ret.append("\r\n");
} else if (s.IsNotFound()) {
ret.append("$-1\r\n");
} else {
ret.append("-ERR ");
ret.append(s.ToString().c_str());
ret.append("\r\n");
}
}
void RPushCmd::Do(std::list<std::string> &argv, std::string &ret) {
if ((arity > 0 && (int)argv.size() != arity) || (arity < 0 && (int)argv.size() < -arity)) {
ret = "-ERR wrong number of arguments for ";
ret.append(argv.front());
ret.append(" command\r\n");
return;
}
argv.pop_front();
std::string key = argv.front();
argv.pop_front();
std::string value;
nemo::Status s;
uint64_t llen = 0;
while (argv.size() > 0) {
value = argv.front();
s = g_pikaServer->GetHandle()->RPush(key, value, &llen);
if (s.IsCorruption()) {
break;
}
argv.pop_front();
}
if (argv.size() > 0) {
ret = "+ERR ";
ret.append(s.ToString().c_str());
ret.append("\r\n");
} else {
char buf[32];
snprintf(buf, sizeof(buf), ":%lu\r\n", llen);
ret.append(buf);
}
}
void RPushxCmd::Do(std::list<std::string> &argv, std::string &ret) {
if ((arity > 0 && (int)argv.size() != arity) || (arity < 0 && (int)argv.size() < -arity)) {
ret = "-ERR wrong number of arguments for ";
ret.append(argv.front());
ret.append(" command\r\n");
return;
}
argv.pop_front();
std::string key = argv.front();
argv.pop_front();
std::string value = argv.front();
argv.pop_front();
uint64_t llen = 0;
nemo::Status s = g_pikaServer->GetHandle()->RPushx(key, value, &llen);
if (s.IsCorruption()) {
ret = "+ERR ";
ret.append(s.ToString().c_str());
ret.append("\r\n");
} else {
char buf[32];
snprintf(buf, sizeof(buf), ":%lu\r\n", llen);
ret.append(buf);
}
}
Subproject commit 387d61046901dfb38c87d1089fcbdce3200be2f6 Subproject commit 37a764fd93e76ae02ca09bca9b8564302d7499e7
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册