//===================================encoder============================== bool RedisCommandEncoder::Encode(Buffer& buf, const RedisCommandFrame& cmd) { buf.Printf("*%d\r\n", cmd.GetArguments().size() + 1); buf.Printf("$%d\r\n", cmd.GetCommand().size()); buf.Write(cmd.GetCommand().data(), cmd.GetCommand().size()); buf.Write("\r\n", 2); for (uint32 i = 0; i < cmd.GetArguments().size(); i++) { const std::string* arg = cmd.GetArgument(i); buf.Printf("$%d\r\n", arg->size()); buf.Write(arg->data(), arg->size()); buf.Write("\r\n", 2); } return true; }
int RedisCommandManager::HandlerCommandFrame(RedisCommandFrame& frame, uint32 connectionID) { Buffer* name = frame.GetArgument(0); if (NULL == name) { snprintf(m_szErrMsg, MAX_REDIS_ERR_MSG_LEN, "NULL command name."); return -1; } std::string namestr = name->AsString(); namestr = string_tolower(namestr); RedisCommandConfigTable::iterator cfgfound = m_cfg_table.find(namestr); if (cfgfound == m_cfg_table.end()) { snprintf(m_szErrMsg, MAX_REDIS_ERR_MSG_LEN, "not supported command:%s", namestr.c_str()); return -1; } RedisCommandConfig cfg = cfgfound->second; if (cfg.arity > 0 && cfg.arity != frame.GetArguments().size()) { snprintf(m_szErrMsg, MAX_REDIS_ERR_MSG_LEN, "wrong number of arguments for '%s' command", namestr.c_str()); return -1; } RedisCommandHandlerArray::iterator it = m_handler_array.begin(); while (it != m_handler_array.end()) { RedisCommandHandler* handler = *it; if (NULL != handler) { handler->OnRedisCommand(cfg.type, connectionID, frame); } it++; } return 0; }