Skip to content

Commit

Permalink
feat: support cmd keys (#217)
Browse files Browse the repository at this point in the history
issue: #30

Signed-off-by: HappyUncle <[email protected]>
  • Loading branch information
happy-v587 authored Mar 22, 2024
1 parent 14f8135 commit 5e770eb
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/base_cmd.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ const std::string kCmdNamePExpire = "pexpire";
const std::string kCmdNameExpireat = "expireat";
const std::string kCmdNamePExpireat = "pexpireat";
const std::string kCmdNamePersist = "persist";
const std::string kCmdNameKeys = "keys";

// string cmd
const std::string kCmdNameSet = "set";
Expand Down
21 changes: 21 additions & 0 deletions src/cmd_keys.cc
Original file line number Diff line number Diff line change
Expand Up @@ -146,4 +146,25 @@ void PersistCmd::DoCmd(PClient* client) {
}
}

KeysCmd::KeysCmd(const std::string& name, int16_t arity)
: BaseCmd(name, arity, kCmdFlagsReadonly, kAclCategoryRead | kAclCategoryKeyspace) {}

bool KeysCmd::DoInitial(PClient* client) {
client->SetKey(client->argv_[1]);
return true;
}

void KeysCmd::DoCmd(PClient* client) {
std::vector<std::string> keys;
auto s = PSTORE.GetBackend(client->GetCurrentDB())->Keys(storage::DataType::kAll, client->Key(), &keys);
if (s.ok()) {
client->AppendArrayLen(keys.size());
for (auto k : keys) {
client->AppendString(k);
}
} else {
client->SetRes(CmdRes::kErrOther, s.ToString());
}
}

} // namespace pikiwidb
11 changes: 11 additions & 0 deletions src/cmd_keys.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,15 @@ class PersistCmd : public BaseCmd {
private:
void DoCmd(PClient* client) override;
};

class KeysCmd : public BaseCmd {
public:
KeysCmd(const std::string& name, int16_t arity);

protected:
bool DoInitial(PClient* client) override;

private:
void DoCmd(PClient* client) override;
};
} // namespace pikiwidb
2 changes: 2 additions & 0 deletions src/cmd_table_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ void CmdTableManager::InitCmdTable() {
ADD_COMMAND(Expireat, 3);
ADD_COMMAND(PExpireat, 3);
ADD_COMMAND(Persist, 2);
ADD_COMMAND(Keys, 2);

// kv
ADD_COMMAND(Get, 2);
ADD_COMMAND(Set, -3);
Expand Down
28 changes: 28 additions & 0 deletions tests/key_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -211,5 +211,33 @@ var _ = Describe("Keyspace", Ordered, func() {
Expect(client.Set(ctx, DefaultKey, DefaultValue, 0).Val()).To(Equal(OK))
Expect(client.PExpireAt(ctx, DefaultKey, time.Now().Add(time.Second*1000)).Err()).NotTo(HaveOccurred())
Expect(client.Persist(ctx, DefaultKey).Err()).NotTo(HaveOccurred())

// del keys
Expect(client.PExpireAt(ctx, DefaultKey, time.Now().Add(time.Second*1)).Err()).NotTo(HaveOccurred())
time.Sleep(2 * time.Second)
})

It("keys", func() {
// empty
Expect(client.Keys(ctx, "*").Val()).To(Equal([]string{}))
Expect(client.Keys(ctx, "dummy").Val()).To(Equal([]string{}))
Expect(client.Keys(ctx, "dummy*").Val()).To(Equal([]string{}))

Expect(client.Set(ctx, "a1", "v1", 0).Val()).To(Equal(OK))
Expect(client.Set(ctx, "k1", "v1", 0).Val()).To(Equal(OK))
Expect(client.SAdd(ctx, "k2", "v2").Val()).To(Equal(int64(1)))
Expect(client.HSet(ctx, "k3", "k3", "v3").Val()).To(Equal(int64(1)))
Expect(client.LPush(ctx, "k4", "v4").Val()).To(Equal(int64(1)))
Expect(client.ZAdd(ctx, "k5", redis.Z{Score: 1, Member: "v5"}).Val()).To(Equal(int64(1)))

// all
Expect(client.Keys(ctx, "*").Val()).To(Equal([]string{"a1", "k1", "k3", "k4", "k5", "k2"}))

// pattern
Expect(client.Keys(ctx, "k*").Val()).To(Equal([]string{"k1", "k3", "k4", "k5", "k2"}))
Expect(client.Keys(ctx, "k1").Val()).To(Equal([]string{"k1"}))

// del keys
Expect(client.Del(ctx, "a1", "k1", "k2", "k3", "k4", "k5").Err()).NotTo(HaveOccurred())
})
})

0 comments on commit 5e770eb

Please sign in to comment.