add method to get client args as list
Former-commit-id: 576b8cd2153c48c0ca4dfc9ed7d12f77d6f76f7e
This commit is contained in:
parent
0baa543819
commit
7ee39396c0
@ -4952,6 +4952,20 @@ bool client::postFunction(std::function<void(client *)> fn, bool fLock) {
|
|||||||
}, fLock) == AE_OK;
|
}, fLock) == AE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
list *client::argsAsList() {
|
||||||
|
list *args = listCreate();
|
||||||
|
for (int j = 1; j < this->argc; j++) {
|
||||||
|
incrRefCount(this->argv[j]);
|
||||||
|
listAddNodeTail(args, this->argv[j]);
|
||||||
|
}
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
|
||||||
|
void client::freeArgList(list* args) {
|
||||||
|
listSetFreeMethod(args,decrRefCountVoid);
|
||||||
|
listRelease(args);
|
||||||
|
}
|
||||||
|
|
||||||
bool client::asyncCommand(std::function<void *(const redisDbPersistentDataSnapshot *)> &&preFn,
|
bool client::asyncCommand(std::function<void *(const redisDbPersistentDataSnapshot *)> &&preFn,
|
||||||
std::function<void(const redisDbPersistentDataSnapshot *, void *)> &&mainFn,
|
std::function<void(const redisDbPersistentDataSnapshot *, void *)> &&mainFn,
|
||||||
std::function<void(const redisDbPersistentDataSnapshot *, void *)> &&postFn)
|
std::function<void(const redisDbPersistentDataSnapshot *, void *)> &&postFn)
|
||||||
|
@ -1661,6 +1661,8 @@ struct client {
|
|||||||
// post a function from a non-client thread to run on its client thread
|
// post a function from a non-client thread to run on its client thread
|
||||||
bool postFunction(std::function<void(client *)> fn, bool fLock = true);
|
bool postFunction(std::function<void(client *)> fn, bool fLock = true);
|
||||||
size_t argv_len_sum() const;
|
size_t argv_len_sum() const;
|
||||||
|
list *argsAsList();
|
||||||
|
void freeArgList(list* args);
|
||||||
bool asyncCommand(std::function<void *(const redisDbPersistentDataSnapshot *)> &&preFn,
|
bool asyncCommand(std::function<void *(const redisDbPersistentDataSnapshot *)> &&preFn,
|
||||||
std::function<void(const redisDbPersistentDataSnapshot *, void *)> &&mainFn,
|
std::function<void(const redisDbPersistentDataSnapshot *, void *)> &&mainFn,
|
||||||
std::function<void(const redisDbPersistentDataSnapshot *, void *)> &&postFn);
|
std::function<void(const redisDbPersistentDataSnapshot *, void *)> &&postFn);
|
||||||
|
@ -524,15 +524,6 @@ void getrangeCommand(client *c) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
list *mgetKeysFromClient(client *c) {
|
|
||||||
list *keys = listCreate();
|
|
||||||
for (int j = 1; j < c->argc; j++) {
|
|
||||||
incrRefCount(c->argv[j]);
|
|
||||||
listAddNodeTail(keys, c->argv[j]);
|
|
||||||
}
|
|
||||||
return keys;
|
|
||||||
}
|
|
||||||
|
|
||||||
void mgetCore(client *c, list *keys, const redisDbPersistentDataSnapshot *snapshot = nullptr) {
|
void mgetCore(client *c, list *keys, const redisDbPersistentDataSnapshot *snapshot = nullptr) {
|
||||||
addReplyArrayLen(c,listLength(keys));
|
addReplyArrayLen(c,listLength(keys));
|
||||||
listNode *ln = listFirst(keys);
|
listNode *ln = listFirst(keys);
|
||||||
@ -551,32 +542,27 @@ void mgetCore(client *c, list *keys, const redisDbPersistentDataSnapshot *snapsh
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void mgetClearKeys(list *keys) {
|
|
||||||
listSetFreeMethod(keys,decrRefCountVoid);
|
|
||||||
listRelease(keys);
|
|
||||||
}
|
|
||||||
|
|
||||||
void mgetCommand(client *c) {
|
void mgetCommand(client *c) {
|
||||||
// Do async version for large number of arguments
|
// Do async version for large number of arguments
|
||||||
if (c->argc > 100) {
|
if (c->argc > 100) {
|
||||||
if (c->asyncCommand(
|
if (c->asyncCommand(
|
||||||
[c] (const redisDbPersistentDataSnapshot *snapshot) {
|
[c] (const redisDbPersistentDataSnapshot *snapshot) {
|
||||||
return mgetKeysFromClient(c);
|
return c->argsAsList();
|
||||||
},
|
},
|
||||||
[c] (const redisDbPersistentDataSnapshot *snapshot, void *keys) {
|
[c] (const redisDbPersistentDataSnapshot *snapshot, void *keys) {
|
||||||
mgetCore(c, (list *)keys, snapshot);
|
mgetCore(c, (list *)keys, snapshot);
|
||||||
},
|
},
|
||||||
[] (const redisDbPersistentDataSnapshot *snapshot, void *keys) {
|
[c] (const redisDbPersistentDataSnapshot *snapshot, void *keys) {
|
||||||
mgetClearKeys((list *)keys);
|
c->freeArgList((list *)keys);
|
||||||
}
|
}
|
||||||
)) {
|
)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
list *keys = mgetKeysFromClient(c);
|
list *keys = c->argsAsList();
|
||||||
mgetCore(c, keys);
|
mgetCore(c, keys);
|
||||||
mgetClearKeys(keys);
|
c->freeArgList(keys);
|
||||||
}
|
}
|
||||||
|
|
||||||
void msetGenericCommand(client *c, int nx) {
|
void msetGenericCommand(client *c, int nx) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user