ClientExtNetSession::~ClientExtNetSession() { if (mRedisParse != nullptr) { parse_tree_del(mRedisParse); mRedisParse = nullptr; } }
BackendExtNetSession::~BackendExtNetSession() { cout << "断开与服务器的链接" << endl; if (mRedisParse != nullptr) { parse_tree_del(mRedisParse); mRedisParse = nullptr; } }
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; } }
/* 收到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; }
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; }