Block Read Functionality

Chapter Updated 2/1/23


Block Reads

As of release 4.1.1, the Xbase library includes functionality for reading a DBF file in blocks, rather than one record at a time.

This functionality can be used to improve application performance in situations where a data file is being read sequentially. For situations where records are retrieved randomly from the file, enabling this probably won't help much. In short, this can be turned on when accessing a file sequentially and should be left off when not processing sequentially.

The logic is all handled internally within the library, all that is needed is to enable it and the library handles the rest.

One Caveat

This functionality was originally designed with reporting in mind and doesn't currently have any auto locking associated with it.

Sample Code

See example code below for how to enable and disable the feature.
#include "xbase.h"
using namespace xb;

int main(int ac,char** av)
{
xbXBase x;
xbInt16 iRc;
x.EnableMsgLogging();
x.SetLogSize( 1000000L );

if (ac <= 1) {
std::cout << "Usage: xb_dumprecs filename..." << std::endl;
return 1;
}

xbDbf *MyFile = NULL;
if(( iRc = x.OpenHighestVersion( av[1], "", &MyFile )) != XB_NO_ERROR ){
std::cout << "Could not open file iRc = " << iRc << " file = " << av[1] << std::endl;
x.DisplayError( iRc );
return 0;
}

// std::cout << "Processing file sequentially from beginning..." << std::endl;


// turn on Block Read Processing
#ifdef XB_BLOCKREAD_SUPPORT
MyFile->EnableBlockReadProcessing();
#endif

xbUInt32 j = 0;
xbUInt32 ulRecCnt = 0;

iRc = MyFile->GetRecordCnt( ulRecCnt );

if( iRc < XB_NO_ERROR )
return iRc;
while( j < ulRecCnt ){
if( j == 0 )
iRc = MyFile->DumpRecord(++j, 2, 2 );
else
iRc = MyFile->DumpRecord(++j, 2, 1 );
if( iRc != XB_NO_ERROR ){
x.DisplayError( iRc );
return 1;
}
}
std::cout << j << " Records processed." << std::endl;


// optionally turn off Block Read Processing
#ifdef XB_BLOCKREAD_SUPPORT
MyFile->DisableBlockReadProcessing();
#endif

MyFile->Close();
return 0;
}