📄 bank.cpp
字号:
check = pOp->interpret_exit_ok(); if( check == -1 ) { ERR(pScanTrans->getNdbError()); m_ndb.closeTransaction(pScanTrans); return NDBT_FAILED; } NdbRecAttr* timeRec = pOp->getValue("TIME"); if( timeRec ==NULL ) { ERR(pScanTrans->getNdbError()); m_ndb.closeTransaction(pScanTrans); return NDBT_FAILED; } NdbRecAttr* accountTypeRec = pOp->getValue("ACCOUNT_TYPE"); if( accountTypeRec ==NULL ) { ERR(pScanTrans->getNdbError()); m_ndb.closeTransaction(pScanTrans); return NDBT_FAILED; } check = pScanTrans->execute(NoCommit); if( check == -1 ) { ERR(pScanTrans->getNdbError()); m_ndb.closeTransaction(pScanTrans); return NDBT_FAILED; } int eof; int rows = 0; int rowsFound = 0; eof = pOp->nextResult(); while(eof == 0){ rows++; Uint64 t = timeRec->u_64_value(); Uint32 a = accountTypeRec->u_32_value(); if (a == accountType && t == glTime){ rowsFound++; // One record found check = pOp->deleteCurrentTuple(pTrans); if (check == -1){ ERR(m_ndb.getNdbError()); m_ndb.closeTransaction(pScanTrans); return NDBT_FAILED; } // Execute transaction check = pTrans->execute(NoCommit); if( check == -1 ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pScanTrans); return NDBT_FAILED; } } eof = pOp->nextResult(); } if (eof == -1) { ERR(pScanTrans->getNdbError()); m_ndb.closeTransaction(pScanTrans); return NDBT_FAILED; } m_ndb.closeTransaction(pScanTrans); // ndbout << rowsFound << " TRANSACTIONS have been deleted" << endl; return NDBT_OK;} int Bank::performIncreaseTime(int maxSleepBetweenDays, int yield){ int yieldCounter = 0; while(1){ Uint64 currTime; if (incCurrTime(currTime) != NDBT_OK) break; g_info << "Current time is " << currTime << endl; if (maxSleepBetweenDays > 0){ int val = myRandom48(maxSleepBetweenDays); NdbSleep_SecSleep(val); } yieldCounter++; if (yield != 0 && yieldCounter >= yield) return NDBT_OK; } return NDBT_FAILED;}int Bank::readSystemValue(SystemValueId sysValId, Uint64 & value){ int check; NdbConnection* pTrans = m_ndb.startTransaction(); if (pTrans == NULL){ ERR(m_ndb.getNdbError()); if(m_ndb.getNdbError().status == NdbError::TemporaryError) return NDBT_TEMPORARY; return NDBT_FAILED; } int result; if ((result= prepareReadSystemValueOp(pTrans, sysValId, value)) != NDBT_OK) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); return result; } check = pTrans->execute(Commit); if( check == -1 ) { ERR(pTrans->getNdbError()); if(pTrans->getNdbError().status == NdbError::TemporaryError) { m_ndb.closeTransaction(pTrans); return NDBT_TEMPORARY; } m_ndb.closeTransaction(pTrans); return NDBT_FAILED; } m_ndb.closeTransaction(pTrans); return NDBT_OK;}int Bank::prepareReadSystemValueOp(NdbConnection* pTrans, SystemValueId sysValId, Uint64 & value){ int check; NdbOperation* pOp = pTrans->getNdbOperation("SYSTEM_VALUES"); if (pOp == NULL) { return NDBT_FAILED; } check = pOp->readTuple(); if( check == -1 ) { return NDBT_FAILED; } check = pOp->equal("SYSTEM_VALUES_ID", sysValId); if( check == -1 ) { return NDBT_FAILED; } NdbRecAttr* valueRec = pOp->getValue("VALUE", (char *)&value); if( valueRec == NULL ) { return NDBT_FAILED; } return NDBT_OK;}int Bank::writeSystemValue(SystemValueId sysValId, Uint64 value){ int check; NdbConnection* pTrans = m_ndb.startTransaction(); if (pTrans == NULL){ ERR(m_ndb.getNdbError()); return NDBT_FAILED; } NdbOperation* pOp = pTrans->getNdbOperation("SYSTEM_VALUES"); if (pOp == NULL) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); return NDBT_FAILED; } check = pOp->insertTuple(); if( check == -1 ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); return NDBT_FAILED; } check = pOp->equal("SYSTEM_VALUES_ID", sysValId); if( check == -1 ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); return NDBT_FAILED; } check = pOp->setValue("VALUE", value); if( check == -1 ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); return NDBT_FAILED; } check = pTrans->execute(Commit); if( check == -1 ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); return NDBT_FAILED; } m_ndb.closeTransaction(pTrans); return NDBT_OK;}int Bank::getNextTransactionId(Uint64 &value){ return increaseSystemValue2(LastTransactionId, value);}int Bank::incCurrTime(Uint64 &value){ return increaseSystemValue(CurrentTime, value);} int Bank::increaseSystemValue(SystemValueId sysValId, Uint64 &value){ /** * Increase value with one and return * updated value * */ DBUG_ENTER("Bank::increaseSystemValue"); int check; NdbConnection* pTrans = m_ndb.startTransaction(); if (pTrans == NULL){ ERR(m_ndb.getNdbError()); if (m_ndb.getNdbError().status == NdbError::TemporaryError) DBUG_RETURN(NDBT_TEMPORARY); DBUG_RETURN(NDBT_FAILED); } NdbOperation* pOp = pTrans->getNdbOperation("SYSTEM_VALUES"); if (pOp == NULL) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); DBUG_RETURN(NDBT_FAILED); } check = pOp->readTupleExclusive(); // check = pOp->readTuple(); if( check == -1 ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); DBUG_RETURN(NDBT_FAILED); } check = pOp->equal("SYSTEM_VALUES_ID", sysValId); if( check == -1 ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); DBUG_RETURN(NDBT_FAILED); } NdbRecAttr* valueRec = pOp->getValue("VALUE"); if( valueRec ==NULL ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); DBUG_RETURN(NDBT_FAILED); } check = pTrans->execute(NoCommit); if( check == -1 ) { ERR(pTrans->getNdbError()); if (pTrans->getNdbError().status == NdbError::TemporaryError) { m_ndb.closeTransaction(pTrans); DBUG_RETURN(NDBT_TEMPORARY); } m_ndb.closeTransaction(pTrans); DBUG_RETURN(NDBT_FAILED); } value = valueRec->u_64_value(); value++; NdbOperation* pOp2 = pTrans->getNdbOperation("SYSTEM_VALUES"); if (pOp2 == NULL) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); DBUG_RETURN(NDBT_FAILED); } check = pOp2->updateTuple(); if( check == -1 ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); DBUG_RETURN(NDBT_FAILED); } check = pOp2->equal("SYSTEM_VALUES_ID", sysValId); if( check == -1 ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); DBUG_RETURN(NDBT_FAILED); } check = pOp2->setValue("VALUE", value); if( check == -1 ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); DBUG_RETURN(NDBT_FAILED); } check = pTrans->execute(NoCommit); if( check == -1 ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); DBUG_RETURN(NDBT_FAILED); } NdbOperation* pOp3 = pTrans->getNdbOperation("SYSTEM_VALUES"); if (pOp3 == NULL) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); DBUG_RETURN(NDBT_FAILED); } check = pOp3->readTuple(); if( check == -1 ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); DBUG_RETURN(NDBT_FAILED); } check = pOp3->equal("SYSTEM_VALUES_ID", sysValId); if( check == -1 ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); DBUG_RETURN(NDBT_FAILED); } // Read new value NdbRecAttr* valueNewRec = pOp3->getValue("VALUE"); if( valueNewRec ==NULL ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); DBUG_RETURN(NDBT_FAILED); } check = pTrans->execute(Commit); if( check == -1 ) { ERR(pTrans->getNdbError()); if (pTrans->getNdbError().status == NdbError::TemporaryError) { m_ndb.closeTransaction(pTrans); DBUG_RETURN(NDBT_TEMPORARY); } m_ndb.closeTransaction(pTrans); DBUG_RETURN(NDBT_FAILED); } // Check that value updated equals the value we read after the update if (valueNewRec->u_64_value() != value){ printf("value actual=%lld\n", valueNewRec->u_64_value()); printf("value expected=%lld actual=%lld\n", value, valueNewRec->u_64_value()); DBUG_PRINT("info", ("value expected=%ld actual=%ld", value, valueNewRec->u_64_value())); g_err << "getNextTransactionId: value was not updated" << endl; m_ndb.closeTransaction(pTrans); DBUG_RETURN(NDBT_FAILED); } m_ndb.closeTransaction(pTrans); DBUG_RETURN(0);}int Bank::increaseSystemValue2(SystemValueId sysValId, Uint64 &value){ /** * Increase value with one and return * updated value * A more optimized version using interpreted update! * */ int check; NdbConnection* pTrans = m_ndb.startTransaction(); if (pTrans == NULL){ ERR(m_ndb.getNdbError()); if(m_ndb.getNdbError().status == NdbError::TemporaryError) return NDBT_TEMPORARY; return NDBT_FAILED; } NdbOperation* pOp = pTrans->getNdbOperation("SYSTEM_VALUES"); if (pOp == NULL) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); return NDBT_FAILED; } check = pOp->interpretedUpdateTuple(); if( check == -1 ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); return NDBT_FAILED; } check = pOp->equal("SYSTEM_VALUES_ID", sysValId ); if( check == -1 ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); return NDBT_FAILED; } Uint32 valToIncWith = 1; check = pOp->incValue("VALUE", valToIncWith); if( check == -1 ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); return NDBT_FAILED; } NdbRecAttr* valueRec = pOp->getValue("VALUE"); if( valueRec == NULL ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); return NDBT_FAILED; } check = pTrans->execute(Commit); if( check == -1 ) { ERR(pTrans->getNdbError()); if(pTrans->getNdbError().status == NdbError::TemporaryError) { m_ndb.closeTransaction(pTrans); return NDBT_TEMPORARY; } m_ndb.closeTransaction(pTrans); return NDBT_FAILED; } value = valueRec->u_64_value(); m_ndb.closeTransaction(pTrans); return 0;}int Bank::getCurrTime(Uint64 &time){ return readSystemValue(CurrentTime, time);}int Bank::prepareGetCurrTimeOp(NdbConnection *pTrans, Uint64 &time){ return prepareReadSystemValueOp(pTrans, CurrentTime, time);}int Bank::performSumAccounts(int maxSleepBetweenSums, int yield){ int yieldCounter = 0; while (1){ Uint32 sumAccounts = 0; Uint32 numAccounts = 0; if (getSumAccounts(sumAccounts, numAccounts) != NDBT_OK){ g_err << "getSumAccounts FAILED" << endl; } else { g_info << "num="<<numAccounts<<", sum=" << sumAccounts << endl; if (sumAccounts != (10000000 + (10000*(numAccounts-1)))){ g_err << "performSumAccounts FAILED" << endl << " sumAccounts="<<sumAccounts<<endl << " expected ="<<(10000000 + (10000*(numAccounts-1)))<<endl << " numAccounts="<<numAccounts<<endl; return NDBT_FAILED; } if (maxSleepBetweenSums > 0){ int val = myRandom48(maxSleepBetweenSums); NdbSleep_MilliSleep(val); } } yieldCounter++; if (yield != 0 && yieldCounter >= yield) return NDBT_OK; } return NDBT_FAILED;}int Bank::getSumAccounts(Uint32 &sumAccounts, Uint32 &numAccounts){ // SELECT SUM(balance) FROM ACCOUNT int check; NdbConnection* pScanTrans = m_ndb.startTransaction(); if (pScanTrans == NULL) { ERR(m_ndb.getNdbError()); return NDBT_FAILED; } NdbScanOperation* pOp = pScanTrans->getNdbScanOperation("ACCOUNT"); if (pOp == NULL) { ERR(pScanTrans->getNdbError()); m_ndb.closeTransaction(pScanTrans); return NDBT_FAILED; } if( pOp->readTuplesExclusive() ) { ERR(pScanTrans->getNdbError()); m_ndb.closeTransaction(pScanTrans); return NDBT_FAILED; } check = pOp->interpret_exit_ok(); if( check == -1 ) { ERR(pScanTrans->getNdbError()); m_ndb.closeTransaction(pScanTrans); return NDBT_FAILED; } NdbRecAttr* balanceRec = pOp->getValue("BALANCE"); if( balanceRec ==NULL ) { ERR(pScanTrans->getNdbError()); m_ndb.closeTransaction(pScanTrans); return NDBT_FAILED; } check = pScanTrans->execute(NoCommit); if( check == -1 ) { ERR(pScanTrans->getNdbError()); m_ndb.closeTransaction(pScanTrans); return NDBT_FAILED; } NdbConnection* pTrans = m_ndb.startTransaction(); if (pTrans == NULL) { ERR(m_ndb.getNdbError()); m_ndb.closeTransaction(pScanTrans); return NDBT_FAILED; } int eof; eof = pOp->nextResult(); while(eof == 0){ Uint32 b = balanceRec->u_32_value(); sumAccounts += b; numAccounts++; // ndbout << numAccounts << ": balance =" << b // << ", sum="<< sumAccounts << endl; // Take over the operation so that the lock is kept in db NdbOperation* pLockOp = pOp->updateCurrentTuple(pTrans); if (pLockOp == NULL){ ERR(m_ndb.getNdbError()); m_ndb.closeTransaction(pScanTrans); m_ndb.closeTransaction(pTrans); return NDBT_FAILED; } Uint32 illegalBalance = 99; check = pLockOp->setValue("BALANCE", illegalBalance); if( check == -1 ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pTrans); m_ndb.closeTransaction(pScanTrans); return NDBT_FAILED; } // Execute transaction check = pTrans->execute(NoCommit); if( check == -1 ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pScanTrans); m_ndb.closeTransaction(pTrans); return NDBT_FAILED; } eof = pOp->nextResult(); } if (eof == -1) { ERR(pScanTrans->getNdbError()); m_ndb.closeTransaction(pScanTrans); m_ndb.closeTransaction(pTrans); return NDBT_FAILED; } // TODO Forget about rolling back, just close pTrans!! // Rollback transaction check = pTrans->execute(Rollback); if( check == -1 ) { ERR(pTrans->getNdbError()); m_ndb.closeTransaction(pScanTrans); m_ndb.closeTransaction(pTrans); return NDBT_FAILED; } m_ndb.closeTransaction(pScanTrans); m_ndb.closeTransaction(pTrans); return NDBT_OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -