From a8fa1f4fdffaa63147f00574dbad092c3ca98365 Mon Sep 17 00:00:00 2001 From: xiaodi05 Date: Wed, 15 May 2024 19:00:38 +0800 Subject: [PATCH 1/5] feat:add rpoplpush command --- src/base_cmd.h | 1 + src/cmd_list.cc | 25 +++++++++++++++++++++++++ src/cmd_list.h | 14 ++++++++++++++ src/cmd_table_manager.cc | 1 + tests/list_test.go | 25 +++++++++++++++++++++++++ 5 files changed, 66 insertions(+) diff --git a/src/base_cmd.h b/src/base_cmd.h index 0af27012b..e5d71b422 100644 --- a/src/base_cmd.h +++ b/src/base_cmd.h @@ -130,6 +130,7 @@ const std::string kCmdNameLSet = "lset"; const std::string kCmdNameLInsert = "linsert"; const std::string kCmdNameLIndex = "lindex"; const std::string kCmdNameLLen = "llen"; +const std::string kCmdNameRPoplpush = "rpoplpush"; // zset cmd const std::string kCmdNameZAdd = "zadd"; diff --git a/src/cmd_list.cc b/src/cmd_list.cc index 1805e410c..7880d154c 100644 --- a/src/cmd_list.cc +++ b/src/cmd_list.cc @@ -50,6 +50,31 @@ void LPushxCmd::DoCmd(PClient* client) { } } +RPoplpushCmd::RPoplpushCmd(const std::string& name, int16_t arity) + : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategoryList) {} + +bool RPoplpushCmd::DoInitial(PClient* client) { + if(((arity_ > 0 && client->argv_.size() != arity_) || (arity_ < 0 && client->argv_.size() < -arity_))) { + client->SetRes(CmdRes::kWrongNum, kCmdNameRPoplpush); + return false; + } + source_ = client->argv_[1]; + receiver_ = client->argv_[2]; + return true; +} + +void RPoplpushCmd::DoCmd(PClient* client) { + std::string value; + storage::Status s = + PSTORE.GetBackend(client->GetCurrentDB())->GetStorage()->RPoplpush(source_, receiver_, &value); + if (s.ok()) { + client->AppendString(value); + } else if (s.IsNotFound()) { + client->AppendStringLen(-1); + } else { + client->SetRes(CmdRes::kErrOther, s.ToString()); + } +} RPushCmd::RPushCmd(const std::string& name, int16_t arity) : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategoryList) {} diff --git a/src/cmd_list.h b/src/cmd_list.h index 1bbb6fe7b..e78f7e0e1 100644 --- a/src/cmd_list.h +++ b/src/cmd_list.h @@ -118,6 +118,20 @@ class RPushxCmd : public BaseCmd { void DoCmd(PClient* client) override; }; +class RPoplpushCmd : public BaseCmd { + public: + RPoplpushCmd(const std::string& name, int16_t arity); + + protected: + bool DoInitial(PClient* client) override; + + private: + std::string source_; + std::string receiver_; + std::string value_poped_from_source_; + void DoCmd(PClient* client) override; +}; + class LPopCmd : public BaseCmd { public: LPopCmd(const std::string& name, int16_t arity); diff --git a/src/cmd_table_manager.cc b/src/cmd_table_manager.cc index 26f910854..af131a93d 100644 --- a/src/cmd_table_manager.cc +++ b/src/cmd_table_manager.cc @@ -140,6 +140,7 @@ void CmdTableManager::InitCmdTable() { ADD_COMMAND(LPop, 2); ADD_COMMAND(LIndex, 3); ADD_COMMAND(LLen, 2); + ADD_COMMAND(RPoplpush, 3); // zset ADD_COMMAND(ZAdd, -4); diff --git a/tests/list_test.go b/tests/list_test.go index 4c1a5a807..2a794f404 100644 --- a/tests/list_test.go +++ b/tests/list_test.go @@ -175,6 +175,31 @@ var _ = Describe("List", Ordered, func() { Expect(del.Err()).NotTo(HaveOccurred()) }) + It("Cmd RPopLPush", func() { + rPush := client.RPush(ctx, DefaultKey, s2s["key_1"]) + Expect(rPush.Err()).NotTo(HaveOccurred()) + rPush = client.RPush(ctx, DefaultKey, s2s["key_2"]) + Expect(rPush.Err()).NotTo(HaveOccurred()) + rPush = client.RPush(ctx, DefaultKey, s2s["key_3"]) + Expect(rPush.Err()).NotTo(HaveOccurred()) + + rPopLPush := client.RPopLPush(ctx, DefaultKey, "destination_key") + Expect(rPopLPush.Err()).NotTo(HaveOccurred()) + Expect(rPopLPush.Val()).To(Equal(s2s["key_3"])) + + lRange := client.LRange(ctx, DefaultKey, 0, -1) + Expect(lRange.Err()).NotTo(HaveOccurred()) + Expect(lRange.Val()).To(Equal([]string{s2s["key_1"], s2s["key_2"]})) + + lRangeDest := client.LRange(ctx, "destination_key", 0, -1) + Expect(lRangeDest.Err()).NotTo(HaveOccurred()) + Expect(lRangeDest.Val()).To(Equal([]string{s2s["key_3"]})) + + //del + del := client.Del(ctx, DefaultKey) + Expect(del.Err()).NotTo(HaveOccurred()) + }) + It("Cmd LRem", func() { rPush := client.RPush(ctx, DefaultKey, s2s["key_1"]) Expect(rPush.Err()).NotTo(HaveOccurred()) From 02dc28bbe42a416a9ec4753a4f05b5553baa6cf4 Mon Sep 17 00:00:00 2001 From: xiao di <87564108+Polaris3003@users.noreply.github.com> Date: Wed, 15 May 2024 19:19:17 +0800 Subject: [PATCH 2/5] Update cmd_list.cc --- src/cmd_list.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cmd_list.cc b/src/cmd_list.cc index 7880d154c..b28dfcadb 100644 --- a/src/cmd_list.cc +++ b/src/cmd_list.cc @@ -75,6 +75,7 @@ void RPoplpushCmd::DoCmd(PClient* client) { client->SetRes(CmdRes::kErrOther, s.ToString()); } } + RPushCmd::RPushCmd(const std::string& name, int16_t arity) : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategoryList) {} From 1bbe189f92f605a0acbbbeea44a38379ca8f7fc5 Mon Sep 17 00:00:00 2001 From: xiao di <87564108+Polaris3003@users.noreply.github.com> Date: Thu, 16 May 2024 14:38:46 +0800 Subject: [PATCH 3/5] Update cmd_list.cc --- src/cmd_list.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/cmd_list.cc b/src/cmd_list.cc index b28dfcadb..53e2d9a7f 100644 --- a/src/cmd_list.cc +++ b/src/cmd_list.cc @@ -54,7 +54,7 @@ RPoplpushCmd::RPoplpushCmd(const std::string& name, int16_t arity) : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategoryList) {} bool RPoplpushCmd::DoInitial(PClient* client) { - if(((arity_ > 0 && client->argv_.size() != arity_) || (arity_ < 0 && client->argv_.size() < -arity_))) { + if (((arity_ > 0 && client->argv_.size() != arity_) || (arity_ < 0 && client->argv_.size() < -arity_))) { client->SetRes(CmdRes::kWrongNum, kCmdNameRPoplpush); return false; } @@ -65,8 +65,7 @@ bool RPoplpushCmd::DoInitial(PClient* client) { void RPoplpushCmd::DoCmd(PClient* client) { std::string value; - storage::Status s = - PSTORE.GetBackend(client->GetCurrentDB())->GetStorage()->RPoplpush(source_, receiver_, &value); + storage::Status s = PSTORE.GetBackend(client->GetCurrentDB())->GetStorage()->RPoplpush(source_, receiver_, &value); if (s.ok()) { client->AppendString(value); } else if (s.IsNotFound()) { From bec4bf0f79ab98052dfebe699a709e4cb7278d0b Mon Sep 17 00:00:00 2001 From: xiao di <87564108+Polaris3003@users.noreply.github.com> Date: Thu, 16 May 2024 14:39:35 +0800 Subject: [PATCH 4/5] Update cmd_list.h --- src/cmd_list.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/cmd_list.h b/src/cmd_list.h index e78f7e0e1..aae9f6cea 100644 --- a/src/cmd_list.h +++ b/src/cmd_list.h @@ -125,11 +125,12 @@ class RPoplpushCmd : public BaseCmd { protected: bool DoInitial(PClient* client) override; + private: + void DoCmd(PClient* client) override; + private: std::string source_; std::string receiver_; - std::string value_poped_from_source_; - void DoCmd(PClient* client) override; }; class LPopCmd : public BaseCmd { From eb127920b11e39e30ef2bc974b49efc9f3ff0a68 Mon Sep 17 00:00:00 2001 From: xiao di <87564108+Polaris3003@users.noreply.github.com> Date: Thu, 16 May 2024 14:45:02 +0800 Subject: [PATCH 5/5] Update cmd_list.h --- src/cmd_list.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cmd_list.h b/src/cmd_list.h index aae9f6cea..0fa7c220b 100644 --- a/src/cmd_list.h +++ b/src/cmd_list.h @@ -131,6 +131,7 @@ class RPoplpushCmd : public BaseCmd { private: std::string source_; std::string receiver_; + std::string value_poped_from_source_; }; class LPopCmd : public BaseCmd {