int scanReadRecords(Ndb* pNdb, const NdbDictionary::Table* pTab, const NdbDictionary::Index* pIdx, int parallel, int _lock, bool headers, bool useHexFormat, char delimiter, bool order, bool descending) { int retryAttempt = 0; const int retryMax = 100; int check; NdbTransaction *pTrans; NdbScanOperation *pOp; NdbIndexScanOperation * pIOp= 0; NDBT_ResultRow * row = new NDBT_ResultRow(*pTab, delimiter); while (true) { if (retryAttempt >= retryMax) { ndbout << "ERROR: has retried this operation " << retryAttempt << " times, failing!" << endl; return -1; } pTrans = pNdb->startTransaction(); if (pTrans == NULL) { const NdbError err = pNdb->getNdbError(); if (err.status == NdbError::TemporaryError) { NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); return -1; } pOp = (!pIdx) ? pTrans->getNdbScanOperation(pTab->getName()) : pIOp=pTrans->getNdbIndexScanOperation(pIdx->getName(), pTab->getName()); if (pOp == NULL) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return -1; } int rs; unsigned scan_flags = 0; if (_tup) scan_flags |= NdbScanOperation::SF_TupScan; switch(_lock + (3 * order)) { case 1: rs = pOp->readTuples(NdbScanOperation::LM_Read, scan_flags, parallel); break; case 2: rs = pOp->readTuples(NdbScanOperation::LM_Exclusive, scan_flags, parallel); break; case 3: rs = pIOp->readTuples(NdbScanOperation::LM_CommittedRead, 0, parallel, true, descending); break; case 4: rs = pIOp->readTuples(NdbScanOperation::LM_Read, 0, parallel, true, descending); break; case 5: rs = pIOp->readTuples(NdbScanOperation::LM_Exclusive, 0, parallel, true, descending); break; case 0: default: rs = pOp->readTuples(NdbScanOperation::LM_CommittedRead, scan_flags, parallel); break; } if( rs != 0 ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return -1; } if(0) { NdbScanFilter sf(pOp); #if 0 sf.begin(NdbScanFilter::AND); sf.le(0, (Uint32)10); sf.end(); #elif 0 sf.begin(NdbScanFilter::OR); sf.begin(NdbScanFilter::AND); sf.ge(0, (Uint32)10); sf.lt(0, (Uint32)20); sf.end(); sf.begin(NdbScanFilter::AND); sf.ge(0, (Uint32)30); sf.lt(0, (Uint32)40); sf.end(); sf.end(); #elif 1 sf.begin(NdbScanFilter::AND); sf.begin(NdbScanFilter::OR); sf.begin(NdbScanFilter::AND); sf.ge(0, (Uint32)10); sf.lt(0, (Uint32)20); sf.end(); sf.begin(NdbScanFilter::AND); sf.ge(0, (Uint32)30); sf.lt(0, (Uint32)40); sf.end(); sf.end(); sf.begin(NdbScanFilter::OR); sf.begin(NdbScanFilter::AND); sf.ge(0, (Uint32)0); sf.lt(0, (Uint32)50); sf.end(); sf.begin(NdbScanFilter::AND); sf.ge(0, (Uint32)100); sf.lt(0, (Uint32)200); sf.end(); sf.end(); sf.end(); #endif } else { check = pOp->interpret_exit_ok(); if( check == -1 ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return -1; } } bool disk= false; for(int a = 0; a<pTab->getNoOfColumns(); a++) { const NdbDictionary::Column* col = pTab->getColumn(a); if(col->getStorageType() == NdbDictionary::Column::StorageTypeDisk) disk= true; if (!nodata) if((row->attributeStore(a) = pOp->getValue(col)) == 0) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return -1; } } NdbRecAttr * disk_ref= 0; if(_dumpDisk && disk) disk_ref = pOp->getValue(NdbDictionary::Column::DISK_REF); NdbRecAttr * rowid= 0, *frag = 0, *gci = 0; if (use_rowid) { frag = pOp->getValue(NdbDictionary::Column::FRAGMENT); rowid = pOp->getValue(NdbDictionary::Column::ROWID); } if (use_gci) { gci = pOp->getValue(NdbDictionary::Column::ROW_GCI); } check = pTrans->execute(NdbTransaction::NoCommit); if( check == -1 ) { const NdbError err = pTrans->getNdbError(); if (err.status == NdbError::TemporaryError) { pNdb->closeTransaction(pTrans); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); pNdb->closeTransaction(pTrans); return -1; } if (rowid) ndbout << "ROWID\t"; if (gci) ndbout << "\tGCI"; if (headers && !nodata) row->header(ndbout); if (disk_ref) ndbout << "\tDISK_REF"; ndbout << endl; int eof; int rows = 0; eof = pOp->nextResult(); while(eof == 0) { rows++; if (useHexFormat) ndbout.setHexFormat(1); if (rowid) { ndbout << "[ fragment: " << frag->u_32_value() << " m_page: " << rowid->u_32_value() << " m_page_idx: " << *(Uint32*)(rowid->aRef() + 4) << " ]"; ndbout << "\t"; } if (gci) { if (gci->isNULL()) ndbout << "NULL\t"; else ndbout << gci->u_64_value() << "\t"; } if (!nodata) ndbout << (*row); if(disk_ref) { ndbout << "\t"; ndbout << "[ m_file_no: " << *(Uint16*)(disk_ref->aRef()+6) << " m_page: " << disk_ref->u_32_value() << " m_page_idx: " << *(Uint16*)(disk_ref->aRef() + 4) << " ]"; } if (rowid || disk_ref || gci || !nodata) ndbout << endl; eof = pOp->nextResult(); } if (eof == -1) { const NdbError err = pTrans->getNdbError(); if (err.status == NdbError::TemporaryError) { pNdb->closeTransaction(pTrans); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); pNdb->closeTransaction(pTrans); return -1; } pNdb->closeTransaction(pTrans); ndbout << rows << " rows returned" << endl; return 0; } return -1; }