| 7594 | } |
| 7595 | |
| 7596 | static void getKeySizes(redisReply *keys, typeinfo **types, |
| 7597 | unsigned long long *sizes, int memkeys, |
| 7598 | unsigned memkeys_samples) |
| 7599 | { |
| 7600 | redisReply *reply; |
| 7601 | unsigned int i; |
| 7602 | |
| 7603 | /* Pipeline size commands */ |
| 7604 | for(i=0;i<keys->elements;i++) { |
| 7605 | /* Skip keys that disappeared between SCAN and TYPE (or unknown types when not in memkeys mode) */ |
| 7606 | if(!types[i] || (!types[i]->sizecmd && !memkeys)) |
| 7607 | continue; |
| 7608 | |
| 7609 | if (!memkeys) { |
| 7610 | const char* argv[] = {types[i]->sizecmd, keys->element[i]->str}; |
| 7611 | size_t lens[] = {strlen(types[i]->sizecmd), keys->element[i]->len}; |
| 7612 | redisAppendCommandArgv(context, 2, argv, lens); |
| 7613 | } else if (memkeys_samples==0) { |
| 7614 | const char* argv[] = {"MEMORY", "USAGE", keys->element[i]->str}; |
| 7615 | size_t lens[] = {6, 5, keys->element[i]->len}; |
| 7616 | redisAppendCommandArgv(context, 3, argv, lens); |
| 7617 | } else { |
| 7618 | sds samplesstr = sdsfromlonglong(memkeys_samples); |
| 7619 | const char* argv[] = {"MEMORY", "USAGE", keys->element[i]->str, "SAMPLES", samplesstr}; |
| 7620 | size_t lens[] = {6, 5, keys->element[i]->len, 7, sdslen(samplesstr)}; |
| 7621 | redisAppendCommandArgv(context, 5, argv, lens); |
| 7622 | sdsfree(samplesstr); |
| 7623 | } |
| 7624 | } |
| 7625 | |
| 7626 | /* Retrieve sizes */ |
| 7627 | for(i=0;i<keys->elements;i++) { |
| 7628 | /* Skip keys that disappeared between SCAN and TYPE (or unknown types when not in memkeys mode) */ |
| 7629 | if(!types[i] || (!types[i]->sizecmd && !memkeys)) { |
| 7630 | sizes[i] = 0; |
| 7631 | continue; |
| 7632 | } |
| 7633 | |
| 7634 | /* Retrieve size */ |
| 7635 | if(redisGetReply(context, (void**)&reply)!=REDIS_OK) { |
| 7636 | fprintf(stderr, "Error getting size for key '%s' (%d: %s)\n", |
| 7637 | keys->element[i]->str, context->err, context->errstr); |
| 7638 | exit(1); |
| 7639 | } else if(reply->type != REDIS_REPLY_INTEGER) { |
| 7640 | /* Theoretically the key could have been removed and |
| 7641 | * added as a different type between TYPE and SIZE */ |
| 7642 | fprintf(stderr, |
| 7643 | "Warning: %s on '%s' failed (may have changed type)\n", |
| 7644 | !memkeys? types[i]->sizecmd: "MEMORY USAGE", |
| 7645 | keys->element[i]->str); |
| 7646 | sizes[i] = 0; |
| 7647 | } else { |
| 7648 | sizes[i] = reply->integer; |
| 7649 | } |
| 7650 | |
| 7651 | freeReplyObject(reply); |
| 7652 | } |
| 7653 | } |
no test coverage detected