当前位置: 首页>>代码示例>>C++>>正文


C++ WriteErrorDetail::setIndex方法代码示例

本文整理汇总了C++中WriteErrorDetail::setIndex方法的典型用法代码示例。如果您正苦于以下问题:C++ WriteErrorDetail::setIndex方法的具体用法?C++ WriteErrorDetail::setIndex怎么用?C++ WriteErrorDetail::setIndex使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在WriteErrorDetail的用法示例。


在下文中一共展示了WriteErrorDetail::setIndex方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: safeWriteBatch

void BatchSafeWriter::safeWriteBatch( DBClientBase* conn,
                                      const BatchedCommandRequest& request,
                                      BatchedCommandResponse* response ) {

    // N starts at zero, and we add to it for each item
    response->setN( 0 );

    for ( size_t i = 0; i < request.sizeWriteOps(); ++i ) {

        BatchItemRef itemRef( &request, static_cast<int>( i ) );
        LastError lastError;

        _safeWriter->safeWrite( conn, itemRef, &lastError );

        // Register the error if we need to
        WriteErrorDetail* batchError = lastErrorToBatchError( lastError );
        if ( batchError ) {
            batchError->setIndex( i );
            response->addToErrDetails( batchError );
        }

        response->setN( response->getN() + lastError.nObjects );

        if ( !lastError.upsertedId.isEmpty() ) {
            BatchedUpsertDetail* upsertedId = new BatchedUpsertDetail;
            upsertedId->setIndex( i );
            upsertedId->setUpsertedID( lastError.upsertedId );
            response->addToUpsertDetails( upsertedId );
        }

        // Break on first error if we're ordered
        if ( request.getOrdered() && BatchSafeWriter::isFailedOp( lastError ) ) break;
    }

    if ( request.sizeWriteOps() == 1 && response->isErrDetailsSet()
            && !response->isErrCodeSet() ) {

        // Promote single error to batch error
        const WriteErrorDetail* error = response->getErrDetailsAt( 0 );
        response->setErrCode( error->getErrCode() );
        if ( error->isErrInfoSet() ) response->setErrInfo( error->getErrInfo() );
        response->setErrMessage( error->getErrMessage() );

        response->unsetErrDetails();
    }

    if ( request.sizeWriteOps() == 1 && response->isUpsertDetailsSet() ) {

        // Promote single upsert to batch upsert
        const BatchedUpsertDetail* upsertedId = response->getUpsertDetailsAt( 0 );
        response->setSingleUpserted( upsertedId->getUpsertedID() );

        response->unsetUpsertDetails();
    }

    response->setOk( !response->isErrCodeSet() );
    dassert( response->isValid( NULL ) );
}
开发者ID:,项目名称:,代码行数:58,代码来源:

示例2: execInserts

    void WriteBatchExecutor::execInserts( const BatchedCommandRequest& request,
                                          std::vector<WriteErrorDetail*>* errors ) {

        // Theory of operation:
        //
        // Instantiates an ExecInsertsState, which represents all of the state involved in the batch
        // insert execution algorithm.  Most importantly, encapsulates the lock state.
        //
        // Every iteration of the loop in execInserts() processes one document insertion, by calling
        // insertOne() exactly once for a given value of state.currIndex.
        //
        // If the ExecInsertsState indicates that the requisite write locks are not held, insertOne
        // acquires them and performs lock-acquisition-time checks.  However, on non-error
        // execution, it does not release the locks.  Therefore, the yielding logic in the while
        // loop in execInserts() is solely responsible for lock release in the non-error case.
        //
        // Internally, insertOne loops performing the single insert until it completes without a
        // PageFaultException, or until it fails with some kind of error.  Errors are mostly
        // propagated via the request->error field, but DBExceptions or std::exceptions may escape,
        // particularly on operation interruption.  These kinds of errors necessarily prevent
        // further insertOne calls, and stop the batch.  As a result, the only expected source of
        // such exceptions are interruptions.
        ExecInsertsState state(&request);
        normalizeInserts(request, &state.normalizedInserts, &state.pregeneratedKeys);

        ElapsedTracker elapsedTracker(128, 10); // 128 hits or 10 ms, matching RunnerYieldPolicy's

        for (state.currIndex = 0;
             state.currIndex < state.request->sizeWriteOps();
             ++state.currIndex) {

            if (elapsedTracker.intervalHasElapsed()) {
                // Consider yielding between inserts.

                if (state.hasLock()) {
                    int micros = ClientCursor::suggestYieldMicros();
                    if (micros > 0) {
                        state.unlock();
                        killCurrentOp.checkForInterrupt();
                        sleepmicros(micros);
                    }
                }
                killCurrentOp.checkForInterrupt();
                elapsedTracker.resetLastTime();
            }

            WriteErrorDetail* error = NULL;
            execOneInsert(&state, &error);
            if (error) {
                errors->push_back(error);
                error->setIndex(state.currIndex);
                if (request.getOrdered())
                    return;
            }
        }
    }
开发者ID:joegen,项目名称:sipx-externals,代码行数:56,代码来源:batch_executor.cpp


注:本文中的WriteErrorDetail::setIndex方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。