Exemplo n.º 1
0
   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;
   }