@@ -350,13 +350,15 @@ void CJHBlockCompressedVarNode::load(CKeyHdr *_keyHdr, const void *rawData, offs
350350 recArray[i] = finger + sizeof (KEYRECSIZE_T);
351351 KEYRECSIZE_T recsize = *(KEYRECSIZE_T *)finger;
352352 _WINREV (recsize);
353- finger += recsize + sizeof (KEYRECSIZE_T) + sizeof (offset_t );
353+ finger += recsize + sizeof (KEYRECSIZE_T);
354+ if (hasFilePosition)
355+ finger += sizeof (offset_t );
354356 }
355357}
356358
357359int CJHBlockCompressedVarNode::compareValueAt (const char *src, unsigned int index) const
358360{
359- return memcmp (src, recArray[index] + (keyHdr-> hasSpecialFileposition () ? sizeof ( offset_t ) : 0 ) , keyCompareLen);
361+ return memcmp (src, recArray[index], keyCompareLen);
360362}
361363
362364bool CJHBlockCompressedVarNode::fetchPayload (unsigned int num, char *dst, PayloadReference & activePayload) const
@@ -370,8 +372,14 @@ bool CJHBlockCompressedVarNode::fetchPayload(unsigned int num, char *dst, Payloa
370372 _WINREV (reclen);
371373 if (keyHdr->hasSpecialFileposition ())
372374 {
373- memcpy (dst+keyCompareLen, p+keyCompareLen+sizeof (offset_t ), reclen-keyCompareLen);
374- memcpy (dst+reclen, p, sizeof (offset_t ));
375+ memcpy (dst+keyCompareLen, p+keyCompareLen, reclen-keyCompareLen);
376+ if (hasFilePosition)
377+ memcpy (dst+reclen, p+reclen, sizeof (offset_t ));
378+ else
379+ {
380+ offset_t zeroPos = 0 ;
381+ memcpy (dst+reclen, &zeroPos, sizeof (offset_t ));
382+ }
375383 }
376384 else
377385 memcpy (dst+keyCompareLen, p+keyCompareLen, reclen-keyCompareLen);
@@ -389,10 +397,7 @@ bool CJHBlockCompressedVarNode::getKeyAt(unsigned int num, char *dst) const
389397 KEYRECSIZE_T reclen = ((KEYRECSIZE_T *) p)[-1 ];
390398 _WINREV (reclen);
391399 assertex (reclen >= keyCompareLen);
392- if (keyHdr->hasSpecialFileposition ())
393- memcpy (dst, p + sizeof (offset_t ), keyCompareLen);
394- else
395- memcpy (dst, p, keyCompareLen);
400+ memcpy (dst, p, keyCompareLen);
396401 }
397402 return true ;
398403}
@@ -411,10 +416,13 @@ size32_t CJHBlockCompressedVarNode::getSizeAt(unsigned int num) const
411416offset_t CJHBlockCompressedVarNode::getFPosAt (unsigned int num) const
412417{
413418 if (num >= hdr.numKeys ) return 0 ;
419+ if (!hasFilePosition) return 0 ;
414420
415421 const char * p = recArray[num];
422+ KEYRECSIZE_T reclen = ((KEYRECSIZE_T *) p)[-1 ];
423+ _WINREV (reclen);
416424 offset_t pos;
417- memcpy ( &pos, p, sizeof (__int64) );
425+ memcpy ( &pos, p + reclen , sizeof (__int64) );
418426 _WINREV (pos);
419427 return pos;
420428}
0 commit comments