diff --git a/src/base_cmd.h b/src/base_cmd.h index ee87730b9..d26ff339e 100644 --- a/src/base_cmd.h +++ b/src/base_cmd.h @@ -76,6 +76,7 @@ const std::string kCmdNameSIsMember = "sismember"; const std::string kCmdNameSAdd = "sadd"; const std::string kCmdNameSUnionStore = "sunionstore"; const std::string kCmdNameSRem = "srem"; +const std::string kCmdNameSCard = "scard"; enum CmdFlags { kCmdFlagsWrite = (1 << 0), // May modify the dataset diff --git a/src/cmd_set.cc b/src/cmd_set.cc index b0554c4a4..865f9f23a 100644 --- a/src/cmd_set.cc +++ b/src/cmd_set.cc @@ -142,4 +142,26 @@ void SRemCmd::DoCmd(PClient* client) { client->AppendInteger(oldSize - unset->size()); } +SCardCmd::SCardCmd(const std::string& name, int16_t arity) + : BaseCmd(name, arity, kCmdFlagsReadonly, kAclCategoryRead | kAclCategorySet) {} + +bool SCardCmd::DoInitial(PClient* client) { + client->SetKey(client->argv_[1]); + return true; +} + +void SCardCmd::DoCmd(PClient* client) { + PObject* value = nullptr; + PError err = PSTORE.GetValueByType(client->Key(), value, kPTypeSet); + if (err != kPErrorOK) { + if (err == kPErrorNotExist) { + client->AppendInteger(0); + } else { + client->SetRes(CmdRes::kErrOther); + } + return; + } + client->AppendInteger(value->CastSet()->size()); +} + } // namespace pikiwidb \ No newline at end of file diff --git a/src/cmd_set.h b/src/cmd_set.h index e69417351..45dddaf7e 100644 --- a/src/cmd_set.h +++ b/src/cmd_set.h @@ -54,4 +54,15 @@ class SRemCmd : public BaseCmd { void DoCmd(PClient *client) override; }; +class SCardCmd : public BaseCmd { + public: + SCardCmd(const std::string &name, int16_t arity); + + protected: + bool DoInitial(PClient *client) override; + + private: + void DoCmd(PClient *client) override; +}; + } // namespace pikiwidb diff --git a/src/cmd_table_manager.cc b/src/cmd_table_manager.cc index 49a283bfc..a5c50c75f 100644 --- a/src/cmd_table_manager.cc +++ b/src/cmd_table_manager.cc @@ -80,6 +80,7 @@ void CmdTableManager::InitCmdTable() { ADD_COMMAND(SAdd, -3); ADD_COMMAND(SUnionStore, -3); ADD_COMMAND(SRem, -3); + ADD_COMMAND(SCard, 2); } std::pair CmdTableManager::GetCommand(const std::string& cmdName, PClient* client) {