CRON [name] [single shot] [optional: start] [delay] [script] [numkeys] [key N] [arg N]
| 8 | |
| 9 | // CRON [name] [single shot] [optional: start] [delay] [script] [numkeys] [key N] [arg N] |
| 10 | void 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) |
nothing calls this directly
no test coverage detected