in common/consumertable.cpp [50:103]
void ConsumerTable::pops(deque<KeyOpFieldsValuesTuple> &vkco, const string &prefix)
{
RedisCommand command;
command.format(
"EVALSHA %s 2 %s %s %d %d",
m_shaPop.c_str(),
getKeyValueOpQueueTableName().c_str(),
(prefix+getTableName()).c_str(),
POP_BATCH_SIZE,
m_modifyRedis ? 1 : 0);
RedisReply r(m_db, command, REDIS_REPLY_ARRAY);
auto ctx0 = r.getContext();
vkco.clear();
// if the set is empty, return an empty kco object
if (r.getContext()->type == REDIS_REPLY_NIL)
{
return;
}
assert(ctx0->type == REDIS_REPLY_ARRAY);
size_t n = ctx0->elements;
vkco.resize(n);
for (size_t ie = 0; ie < n; ie++)
{
auto& kco = vkco[ie];
auto& values = kfvFieldsValues(kco);
assert(values.empty());
auto& ctx = ctx0->element[ie];
string key = ctx->element[0]->str;
kfvKey(kco) = key;
string op = ctx->element[1]->str;
kfvOp(kco) = op;
for (size_t i = 2; i < ctx->elements; i += 2)
{
if (i+1 >= ctx->elements)
{
SWSS_LOG_ERROR("invalid number of elements in returned table: %zu >= %zu", i+1, ctx->elements);
throw runtime_error("invalid number of elements in returned table");
}
FieldValueTuple e;
fvField(e) = ctx->element[i+0]->str;
fvValue(e) = ctx->element[i+1]->str;
values.push_back(e);
}
}
}