| Return Type | Function name | Arguments |
|---|---|---|
| hzEcode | hdbBinRepos::Fetch | (hzChain&,unsigned int,) |
Declared in file: hzDatabase.h
Defined in file : hdbBinRepos.cpp
Function Logic:
Function body:
hzEcode hdbBinRepos::Fetch (hzChain& datum, unsigned int datumId)
{
_hzfunc("hdbBinRepos::Fetch") ;
_datum_hd hdr ;
char* workBuf ;
uint64_t nAddr ;
uint64_t nPosn ;
uint32_t toGet ;
uint32_t soFar ;
hzEcode rc = E_OK ;
datum.Clear() ;
if (m_nInitState < 1)
return E_NOINIT ;
if (m_nInitState < 2)
return E_NOTOPEN ;
if (!datumId)
return hzerr(E_RANGE, "NULL datum id") ;
if (datumId > m_nSeqId)
{
threadLog("Out of range\n") ;
rc = E_RANGE ;
}
m_Error.Clear() ;
m_LockIrd.Lock() ;
nAddr = (datumId-1)* sizeof(_datum_hd) ;
m_RdI.seekg((streamoff) nAddr) ;
nPosn = m_RdI.tellg() ;
if (nPosn != nAddr)
{
rc = E_READFAIL ;
threadLog("Could not seek header address %u for datum %u\n", nAddr, datumId) ;
}
else
{
threadLog("Found header address %u for datum %u\n", nAddr, datumId) ;
m_RdI.read((char*) &hdr, sizeof(_datum_hd)) ;
if (m_RdI.fail())
{
rc = E_READFAIL ;
threadLog("Could not read header for datum %u", datumId) ;
m_RdI.clear() ;
}
}
m_LockIrd.Unlock() ;
if (rc != E_OK)
return rc ;
workBuf = new char[HZ_BLOCKSIZE] ;
m_LockDrd.Lock() ;
threadLog("Found datum for datum %u addr %u, size %u\n", datumId, hdr.m_Addr, hdr.m_Size) ;
m_RdD.seekg((streamoff) hdr.m_Addr) ;
nPosn = m_RdD.tellg() ;
if (nPosn != hdr.m_Addr)
{
rc = E_READFAIL ;
threadLog("Could not seek data address %ul for datum %d\n", hdr.m_Addr, datumId) ;
}
else
{
toGet = HZ_BLOCKSIZE - (hdr.m_Addr % HZ_BLOCKSIZE) ;
if (toGet > hdr.m_Size)
toGet = hdr.m_Size ;
soFar = 0;
m_RdD.read(workBuf, toGet) ;
if (m_RdD.gcount() != toGet)
threadLog("Warning: toget %u, got %u\n", toGet, m_RdD.gcount()) ;
datum.Append(workBuf, toGet) ;
soFar += toGet ;
for (; soFar < hdr.m_Size ;)
{
toGet = hdr.m_Size - soFar ;
if (toGet > HZ_BLOCKSIZE)
toGet = HZ_BLOCKSIZE ;
m_RdD.read(workBuf, toGet) ;
if (m_RdD.gcount() != toGet)
threadLog("Warning: toget %u, got %u\n", toGet, m_RdD.gcount()) ;
datum.Append(workBuf, toGet) ;
soFar += toGet ;
}
if (m_RdD.fail())
{
rc = E_READFAIL ;
threadLog("m_RdD failed\n") ;
m_RdD.clear() ;
}
threadLog("Now have %u bytes in Datum\n", datum.Size()) ;
}
m_LockDrd.Unlock() ;
delete [] workBuf ;
return rc ;
}