Return TypeFunction nameArguments
hzEcodehdbBinRepos::Fetch(hzChain&,unsigned int,)

Declared in file: hzDatabase.h
Defined in file : hdbBinRepos.cpp

Function Logic:

0:START 1:hzChain::Clear 2:m_nInitState<1 3:Return E_NOINIT 4:m_nInitState<2 5:Return E_NOTOPEN 6:!datumId 7:Return hzerr(E_RANGE,NULL datum id) 8:datumId>m_nSeqId 9:rc 10:hzChain::Clear hzLockS::Lock nAddr ifstream::seekg ifstream::tellg nPosn 11:nPosn!=nAddr 12:rc 13:ifstream::read ifstream::fail 14:m_RdI.fail() 15:rc ifstream::clear 16:hzLockS::Unlock 17:rc!=E_OK 18:Return rc 19:workBuf hzLockS::Lock ifstream::seekg ifstream::tellg nPosn 20:nPosn!=hdr.m_Addr 21:rc 22:toGet 23:toGet>hdr.m_Size 24:toGet 25:soFar ifstream::read 26:m_RdD.gcount()!=toGet 27:ifstream::gcount 28:hzChain::Append soFar 29:soFar 30:toGet 31:toGet>HZ_BLOCKSIZE 32:toGet 33:ifstream::read 34:m_RdD.gcount()!=toGet 35:ifstream::gcount 36:hzChain::Append soFar ifstream::fail 37:m_RdD.fail() 38:rc ifstream::clear 39:hzChain::Size 40:hzLockS::Unlock []workBuf 41:Return rc

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