//<"LSCH"><CeHeader><CacheKey><ResponseHeader><ResponseBody> int DirHashCacheEntry::loadCeHeader() { int fd = getFdStore(); if ( fd == -1 ) { errno = EBADF; return -1; } if ( nio_lseek( fd, getStartOffset(), SEEK_SET ) == -1 ) return -1; char achBuf[4 + sizeof( CeHeader ) ]; if ( (size_t)nio_read( fd, achBuf, 4 + sizeof( CeHeader ) ) < 4 + sizeof( CeHeader ) ) return -1; // if ( *( uint32_t *)achBuf != CE_ID ) // return -1; if (memcmp(achBuf, CE_ID, 4) != 0) return -1; memmove( &getHeader(), &achBuf[4], sizeof( CeHeader ) ); int len = getHeader().m_keyLen; if ( len > 0 ) { char * p = getKey().prealloc( len+1 ); if ( !p ) return -1; if ( nio_read( fd, p, len ) < len ) return -1; *(p+len) = 0; } char tmpBUf[4096]; #ifdef CACHE_RESP_HEADER if (getHeader().m_valPart1Len < 4096 ) //< 4K { if ( nio_read( fd, tmpBUf, getHeader().m_valPart1Len ) < getHeader().m_valPart1Len ) return -1; m_sRespHeader.append(tmpBUf, getHeader().m_valPart1Len); } #endif //load part3 to buffer int part3offset = getHeaderSize() + getContentTotalLen(); if ( nio_lseek( fd, part3offset, SEEK_SET ) != -1 ) { while((len = nio_read( fd, tmpBUf, 4096 )) > 0) m_sPart3Buf.append(tmpBUf, len); } return 0; }
const char * FileCacheDataEx::getCacheData( off_t offset, off_t& wanted, char *pBuf, long len ) { if ( isCached() ) { if ( offset > m_lSize ) { wanted = 0; return pBuf; } if ( wanted > m_lSize - offset ) wanted = m_lSize - offset; return m_pCache + offset; } else { assert( m_fd != -1 ); off_t off = nio_lseek( m_fd, offset, SEEK_SET ); /* if ( D_ENABLED( DL_MORE )) LOG_D(( "lseek() return %d", (int)off ));*/ if ( off == offset ) { wanted = nio_read( m_fd, pBuf, len ); } else { wanted = -1; } return pBuf; } }
int DirHashCacheEntry::saveCeHeader() { int fd = getFdStore(); if ( fd == -1 ) { errno = EBADF; return -1; } if ( nio_lseek( fd, getStartOffset(), SEEK_SET ) == -1 ) return -1; char achBuf[4 + sizeof( CeHeader ) ]; //*( int *)achBuf = CE_ID; memcpy(achBuf, CE_ID, 4); memmove( &achBuf[4], &getHeader(), sizeof( CeHeader ) ); if ( (size_t)nio_write( fd, achBuf, 4 + sizeof( CeHeader ) ) < 4 + sizeof( CeHeader ) ) return -1; if ( getHeader().m_keyLen > 0 ) { if ( nio_write( fd, getKey().c_str(), getHeader().m_keyLen ) < getHeader().m_keyLen ) return -1; } return 0; }