Exemplo n.º 1
0
ClientExtNetSession::~ClientExtNetSession()
{
    if (mRedisParse != nullptr)
    {
        parse_tree_del(mRedisParse);
        mRedisParse = nullptr;
    }
}
Exemplo n.º 2
0
BackendExtNetSession::~BackendExtNetSession()
{
    cout << "断开与服务器的链接" << endl;
    if (mRedisParse != nullptr)
    {
        parse_tree_del(mRedisParse);
        mRedisParse = nullptr;
    }
}
Exemplo n.º 3
0
BaseWaitReply::~BaseWaitReply()
{
    for (auto& v : mWaitResponses)
    {
        if (v.ssdbReply != nullptr)
        {
            delete v.ssdbReply;
            v.ssdbReply = nullptr;
        }
        if (v.redisReply != nullptr)
        {
            parse_tree_del(v.redisReply);
            v.redisReply = nullptr;
        }
    }

    mWaitResponses.clear();

    if (mErrorCode != nullptr)
    {
        delete mErrorCode;
        mErrorCode = nullptr;
    }
}
Exemplo n.º 4
0
/*  收到db server的reply,解析并放入逻辑消息队列   */
int BackendExtNetSession::onMsg(const char* buffer, int len)
{
    bool isExist = mRedisParse != nullptr;
    int totalLen = 0;

    const char c = buffer[0];
    if (mRedisParse != nullptr ||
        !IS_NUM(c))
    {
        /*  redis reply */
        char* parseEndPos = (char*)buffer;
        char* parseStartPos = parseEndPos;
        string lastPacket;
        while (totalLen < len)
        {
            if (mRedisParse == nullptr)
            {
                mRedisParse = parse_tree_new();
            }

            int parseRet = parse(mRedisParse, &parseEndPos, (char*)buffer+len);
            totalLen += (parseEndPos - parseStartPos);

            if (parseRet == REDIS_OK)
            {
                if (mCache.empty())
                {
                    pushDataMsgToLogicThread(parseStartPos, parseEndPos - parseStartPos);
                }
                else
                {
                    mCache += string(parseStartPos, parseEndPos - parseStartPos);
                    pushDataMsgToLogicThread(mCache.c_str(), mCache.size());
                    mCache.clear();
                }
                parseStartPos = parseEndPos;
                parse_tree_del(mRedisParse);
                mRedisParse = nullptr;
            }
            else if (parseRet == REDIS_RETRY)
            {
                mCache += string(parseStartPos, parseEndPos - parseStartPos);
                break;
            }
            else
            {
                break;
            }
        }
    }
    else
    {
        /*  ssdb reply    */
        char* parseStartPos = (char*)buffer;
        int leftLen = len;
        int packetLen = 0;
        while ((packetLen = SSDBProtocolResponse::check_ssdb_packet(parseStartPos, leftLen)) > 0)
        {
            pushDataMsgToLogicThread(parseStartPos, packetLen);

            totalLen += packetLen;
            leftLen -= packetLen;
            parseStartPos += packetLen;
        }
    }

    return totalLen;
}
Exemplo n.º 5
0
void ClientLogicSession::onMsg(const char* buffer, int len)
{
    assert(sizeof(ParseMsg) == len);
    ParseMsg* msg = (ParseMsg*)buffer;

    if (msg->ssdbQuery != nullptr)
    {
        /*  处理ssdb 命令   */
        bool isSuccess = false;

        if (!gBackendClients.empty())
        {
            Bytes* op = msg->ssdbQuery->getByIndex(0);
            if (op != nullptr)
            {
                /*todo::处理auth命令*/
                BaseWaitReply::PTR w = nullptr;
                if (strncmp("multi_set", op->buffer, op->len) == 0)
                {
                    isSuccess = procSSDBMultiSet(msg->ssdbQuery, msg->buffer);
                }
                else if (strncmp("multi_get", op->buffer, op->len) == 0)
                {
                    isSuccess = procSSDBCommandOfMultiKeys(std::make_shared<SSDBMultiGetWaitReply>(this), msg->ssdbQuery, msg->buffer, "multi_get");
                }
                else if (strncmp("multi_del", op->buffer, op->len) == 0)
                {
                    isSuccess = procSSDBCommandOfMultiKeys(std::make_shared<SSDBMultiDelWaitReply>(this), msg->ssdbQuery, msg->buffer, "multi_del");
                }
                else
                {
                    isSuccess = procSSDBSingleCommand(msg->ssdbQuery, msg->buffer);
                }
            }
        }

        if (!isSuccess)
        {
            /*  模拟一个错误  */
            pushSSDBErrorReply("error");
            processCompletedReply();
        }
    }
    else
    {
        /*TODO::重用网络层分包的命令判断,减少此处的字符串比较*/
        if (strncmp(msg->buffer->c_str(), "PING\r\n", 6) == 0)
        {
            pushRedisStatusReply("PONG");
            processCompletedReply();
        }
        else
        {
            /*  处理redis命令, TODO::处理mset、mget、del   */
            bool isSuccess = processRedisSingleCommand(msg->msg, msg->buffer);
            if (!isSuccess)
            {
                /*  模拟一个错误  */
                pushRedisErrorReply("no error for key");
                processCompletedReply();
            }
        }
    }

    if (msg->ssdbQuery != nullptr)
    {
        delete msg->ssdbQuery;
        msg->ssdbQuery = nullptr;
    }
    if (msg->msg != nullptr)
    {
        parse_tree_del(msg->msg);
        msg->msg = nullptr;
    }
    delete msg->buffer;
}