MCPcopy Create free account
hub / github.com/Snapchat/KeyDB / keysCommandCore

Function keysCommandCore

src/db.cpp:1016–1055  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1014client *createAOFClient(void);
1015void freeFakeClient(client *);
1016void keysCommandCore(client *cIn, const redisDbPersistentDataSnapshot *db, sds pattern)
1017{
1018 int plen = sdslen(pattern), allkeys;
1019 unsigned long numkeys = 0;
1020
1021 client *c = createAOFClient();
1022 c->flags |= CLIENT_FORCE_REPLY;
1023
1024 void *replylen = addReplyDeferredLen(c);
1025
1026 allkeys = (pattern[0] == '*' && plen == 1);
1027 db->iterate_threadsafe([&](const char *key, robj_roptr)->bool {
1028 robj *keyobj;
1029
1030 if (allkeys || stringmatchlen(pattern,plen,key,sdslen(key),0)) {
1031 keyobj = createStringObject(key,sdslen(key));
1032 if (!keyIsExpired(db,keyobj)) {
1033 addReplyBulk(c,keyobj);
1034 numkeys++;
1035 }
1036 decrRefCount(keyobj);
1037 }
1038 return !(cIn->flags.load(std::memory_order_relaxed) & CLIENT_CLOSE_ASAP);
1039 }, true /*fKeyOnly*/);
1040
1041 setDeferredArrayLen(c,replylen,numkeys);
1042
1043 aeAcquireLock();
1044 addReplyProto(cIn, c->buf, c->bufpos);
1045 listIter li;
1046 listNode *ln;
1047 listRewind(c->reply, &li);
1048 while ((ln = listNext(&li)) != nullptr)
1049 {
1050 clientReplyBlock *block = (clientReplyBlock*)listNodeValue(ln);
1051 addReplyProto(cIn, block->buf(), block->used);
1052 }
1053 aeReleaseLock();
1054 freeFakeClient(c);
1055}
1056
1057int prepareClientToWrite(client *c, bool fAsync);
1058void keysCommand(client *c) {

Callers 1

keysCommandFunction · 0.85

Calls 15

sdslenFunction · 0.85
createAOFClientFunction · 0.85
addReplyDeferredLenFunction · 0.85
stringmatchlenFunction · 0.85
keyIsExpiredFunction · 0.85
addReplyBulkFunction · 0.85
decrRefCountFunction · 0.85
setDeferredArrayLenFunction · 0.85
aeAcquireLockFunction · 0.85
addReplyProtoFunction · 0.85
listRewindFunction · 0.85
listNextFunction · 0.85

Tested by

no test coverage detected