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 ; }