MessageResultPair PubSub::get_message_internal()

in common/pubsub.cpp [85:127]


MessageResultPair PubSub::get_message_internal(double timeout, bool interrupt_on_signal)
{
    MessageResultPair ret;

    if (!m_subscribe)
    {
        ret.first = Select::ERROR;
        return ret;
    }

    Selectable *selected;
    int rc = m_select.select(&selected, int(timeout * 1000), interrupt_on_signal);
    ret.first = rc;
    switch (rc)
    {
        case Select::ERROR:
            throw RedisError("Failed to select", m_subscribe->getContext());

        case Select::TIMEOUT:
        case Select::SIGNALINT:
            return ret;

        case Select::OBJECT:
            break;

        default:
            throw logic_error("Unexpected select result");
    }

    // Now we have some data to read
    auto event = popEventBuffer();
    if (!event)
    {
        return ret;
    }

    auto message = event->getReply<RedisMessage>();
    ret.second["type"] = message.type;
    ret.second["pattern"] = message.pattern;
    ret.second["channel"] = message.channel;
    ret.second["data"] = message.data;
    return ret;
}