| 6615 | } |
| 6616 | |
| 6617 | void getKeySizes(redisReply *keys, typeinfo **types, |
| 6618 | unsigned long long *sizes, int memkeys, |
| 6619 | unsigned memkeys_samples) |
| 6620 | { |
| 6621 | redisReply *reply; |
| 6622 | unsigned int i; |
| 6623 | |
| 6624 | /* Pipeline size commands */ |
| 6625 | for(i=0;i<keys->elements;i++) { |
| 6626 | /* Skip keys that disappeared between SCAN and TYPE (or unknown types when not in memkeys mode) */ |
| 6627 | if(!types[i] || (!types[i]->sizecmd && !memkeys)) |
| 6628 | continue; |
| 6629 | |
| 6630 | if (!memkeys) { |
| 6631 | const char* argv[] = {types[i]->sizecmd, keys->element[i]->str}; |
| 6632 | size_t lens[] = {strlen(types[i]->sizecmd), keys->element[i]->len}; |
| 6633 | redisAppendCommandArgv(context, 2, argv, lens); |
| 6634 | } else if (memkeys_samples==0) { |
| 6635 | const char* argv[] = {"MEMORY", "USAGE", keys->element[i]->str}; |
| 6636 | size_t lens[] = {6, 5, keys->element[i]->len}; |
| 6637 | redisAppendCommandArgv(context, 3, argv, lens); |
| 6638 | } else { |
| 6639 | sds samplesstr = sdsfromlonglong(memkeys_samples); |
| 6640 | const char* argv[] = {"MEMORY", "USAGE", keys->element[i]->str, "SAMPLES", samplesstr}; |
| 6641 | size_t lens[] = {6, 5, keys->element[i]->len, 7, sdslen(samplesstr)}; |
| 6642 | redisAppendCommandArgv(context, 5, argv, lens); |
| 6643 | sdsfree(samplesstr); |
| 6644 | } |
| 6645 | } |
| 6646 | |
| 6647 | /* Retrieve sizes */ |
| 6648 | for(i=0;i<keys->elements;i++) { |
| 6649 | /* Skip keys that disappeared between SCAN and TYPE (or unknown types when not in memkeys mode) */ |
| 6650 | if(!types[i] || (!types[i]->sizecmd && !memkeys)) { |
| 6651 | sizes[i] = 0; |
| 6652 | continue; |
| 6653 | } |
| 6654 | |
| 6655 | /* Retrieve size */ |
| 6656 | if(redisGetReply(context, (void**)&reply)!=REDIS_OK) { |
| 6657 | fprintf(stderr, "Error getting size for key '%s' (%d: %s)\n", |
| 6658 | keys->element[i]->str, context->err, context->errstr); |
| 6659 | exit(1); |
| 6660 | } else if(reply->type != REDIS_REPLY_INTEGER) { |
| 6661 | /* Theoretically the key could have been removed and |
| 6662 | * added as a different type between TYPE and SIZE */ |
| 6663 | fprintf(stderr, |
| 6664 | "Warning: %s on '%s' failed (may have changed type)\n", |
| 6665 | !memkeys? types[i]->sizecmd: "MEMORY USAGE", |
| 6666 | keys->element[i]->str); |
| 6667 | sizes[i] = 0; |
| 6668 | } else { |
| 6669 | sizes[i] = reply->integer; |
| 6670 | } |
| 6671 | |
| 6672 | freeReplyObject(reply); |
| 6673 | } |
| 6674 | } |
no test coverage detected