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

Function cronCommand

src/cron.cpp:10–77  ·  view source on GitHub ↗

CRON [name] [single shot] [optional: start] [delay] [script] [numkeys] [key N] [arg N]

Source from the content-addressed store, hash-verified

8
9// CRON [name] [single shot] [optional: start] [delay] [script] [numkeys] [key N] [arg N]
10void cronCommand(client *c)
11{
12 int arg_offset = 0;
13 static const int ARG_NAME = 1;
14 static const int ARG_SINGLESHOT = 2;
15 static const int ARG_EXPIRE = 3;
16 #define ARG_SCRIPT (4+arg_offset)
17 #define ARG_NUMKEYS (5+arg_offset)
18 #define ARG_KEYSTART (6+arg_offset)
19
20 bool fSingleShot = false;
21 if (strcasecmp("single", szFromObj(c->argv[ARG_SINGLESHOT])) == 0) {
22 fSingleShot = true;
23 } else {
24 if (strcasecmp("repeat", szFromObj(c->argv[ARG_SINGLESHOT])) != 0) {
25 addReply(c, shared.syntaxerr);
26 return;
27 }
28 }
29
30 long long interval;
31 if (getLongLongFromObjectOrReply(c, c->argv[ARG_EXPIRE], &interval, "missing expire time") != C_OK)
32 return;
33
34 long long base;
35 __atomic_load(&g_pserver->mstime, &base, __ATOMIC_ACQUIRE);
36 if (getLongLongFromObject(c->argv[ARG_EXPIRE+1], &base) == C_OK) {
37 arg_offset++;
38 std::swap(base, interval);
39 }
40
41 if (interval <= 0)
42 {
43 addReplyError(c, "interval must be positive");
44 return;
45 }
46
47 long numkeys = 0;
48 if (c->argc > ARG_NUMKEYS)
49 {
50 if (getLongFromObjectOrReply(c, c->argv[ARG_NUMKEYS], &numkeys, NULL) != C_OK)
51 return;
52
53 if (c->argc < (6 + numkeys)) {
54 addReplyError(c, "Missing arguments or numkeys is too big");
55 return;
56 }
57 }
58
59 std::unique_ptr<cronjob> spjob = std::make_unique<cronjob>();
60 spjob->script = sdsstring(sdsdup(szFromObj(c->argv[ARG_SCRIPT])));
61 spjob->interval = (uint64_t)interval;
62 spjob->startTime = (uint64_t)base;
63 spjob->fSingleShot = fSingleShot;
64 spjob->dbNum = dbnumFromDb(c->db);
65 for (long i = 0; i < numkeys; ++i)
66 spjob->veckeys.emplace_back(sdsdup(szFromObj(c->argv[ARG_KEYSTART+i])));
67 for (long i = ARG_KEYSTART + numkeys; i < c->argc; ++i)

Callers

nothing calls this directly

Calls 15

szFromObjFunction · 0.85
addReplyFunction · 0.85
getLongLongFromObjectFunction · 0.85
addReplyErrorFunction · 0.85
getLongFromObjectOrReplyFunction · 0.85
sdsstringClass · 0.85
sdsdupFunction · 0.85
dbnumFromDbFunction · 0.85
createObjectFunction · 0.85
setKeyFunction · 0.85
decrRefCountFunction · 0.85

Tested by

no test coverage detected