INT32 rtnCoordQuery::execute( CHAR *pReceiveBuffer, SINT32 packSize, CHAR **ppResultBuffer, pmdEDUCB *cb, MsgOpReply &replyHeader, BSONObj **ppErrorObj ) { INT32 rc = SDB_OK ; pmdKRCB *pKrcb = pmdGetKRCB(); CoordCB *pCoordcb = pKrcb->getCoordCB(); netMultiRouteAgent *pRouteAgent = pCoordcb->getRouteAgent(); rtnContextCoord *pContext = NULL ; BSONObj boQuery; BSONObj boOrderBy; CoordGroupList sendGroupList ; MsgHeader*pHeader = (MsgHeader *)pReceiveBuffer; replyHeader.header.messageLength = sizeof( MsgOpReply ); replyHeader.header.opCode = MSG_BS_QUERY_RES; replyHeader.header.requestID = pHeader->requestID; replyHeader.header.routeID.value = 0; replyHeader.header.TID = pHeader->TID; replyHeader.contextID = -1; replyHeader.flags = SDB_OK; replyHeader.numReturned = 0; replyHeader.startFrom = 0; INT32 flag = 0; CHAR *pCollectionName = NULL; SINT64 numToSkip = 0; SINT64 numToReturn = 0; CHAR *pQuery = NULL; CHAR *pFieldSelector = NULL; CHAR *pOrderBy = NULL; CHAR *pHint = NULL; BSONObj *err = NULL ; MsgOpQuery *pSrc = (MsgOpQuery *)pReceiveBuffer; rc = msgExtractQuery( pReceiveBuffer, &flag, &pCollectionName, &numToSkip, &numToReturn, &pQuery, &pFieldSelector, &pOrderBy, &pHint ); PD_RC_CHECK( rc, PDERROR, "failed to parse query request(rc=%d)", rc ); if ( pCollectionName != NULL && '$' == pCollectionName[0] ) { rtnCoordCommand *pCmdProcesser = NULL; rtnCoordProcesserFactory *pProcesserFactory = pCoordcb->getProcesserFactory(); pCmdProcesser = pProcesserFactory->getCommandProcesser( pCollectionName ); PD_CHECK( pCmdProcesser != NULL, SDB_INVALIDARG, error, PDERROR, "unknown command:%s", pCollectionName ); rc = pCmdProcesser->execute( pReceiveBuffer, packSize, ppResultBuffer, cb, replyHeader, &err ); SDB_ASSERT( NULL == err, "impossible" ); PD_RC_CHECK( rc, PDERROR, "failed to execute the command(command:%s, " "rc=%d)", pCollectionName, rc ); goto done; } try { boQuery = BSONObj( pQuery ); boOrderBy = BSONObj( pOrderBy ); } catch ( std::exception &e ) { PD_RC_CHECK( SDB_INVALIDARG, PDERROR, "occur unexpected error:%s", e.what() ); } rc = executeQuery( (CHAR *)pSrc, boQuery, boOrderBy, pCollectionName, pRouteAgent, cb, pContext ) ; PD_RC_CHECK( rc, PDERROR, "query failed(rc=%d)", rc ); replyHeader.contextID = pContext->contextID() ; pContext->addSubDone( cb ); done: return rc; error: replyHeader.flags = rc; goto done; }