@@ -132,6 +132,8 @@ void CJHBlockCompressedSearchNode::load(CKeyHdr *_keyHdr, const void *rawData, o
132132
133133int CJHBlockCompressedSearchNode::compareValueAt (const char *src, unsigned int index) const
134134{
135+ dbgassertex (index < hdr.numKeys );
136+
135137 return memcmp (src, keyBuf + index*keyRecLen, keyCompareLen);
136138}
137139
@@ -238,6 +240,98 @@ void CJHNewBlobNode::load(CKeyHdr *_keyHdr, const void *rawData, offset_t _fpos,
238240
239241// =========================================================================================================
240242
243+ void CJHBlockCompressedVarNode::load (CKeyHdr *_keyHdr, const void *rawData, offset_t _fpos, bool needCopy)
244+ {
245+ CJHBlockCompressedSearchNode::load (_keyHdr, rawData, _fpos, needCopy);
246+ unsigned n = getNumKeys ();
247+ offsets.allocateN (n);
248+ sizes.allocateN (n);
249+ const byte *finger = (const byte *)keyBuf;
250+ size32_t keyedLen = keyHdr->getNodeKeyLength ();
251+ for (unsigned int i=0 ; i<getNumKeys (); i++)
252+ {
253+ unsigned payloadSize = *finger++;
254+ if (payloadSize & 0x80 )
255+ {
256+ payloadSize &= 0x7f ;
257+ payloadSize = (payloadSize << 8 ) | *finger++;
258+ }
259+ size32_t recsize = payloadSize + keyedLen;
260+ offsets[i] = (const char *)finger - keyBuf;
261+ sizes[i] = recsize;
262+ finger += recsize;
263+ if (!zeroFilePosition)
264+ finger += sizeof (offset_t );
265+ }
266+ }
267+
268+ int CJHBlockCompressedVarNode::compareValueAt (const char *src, unsigned int index) const
269+ {
270+ dbgassertex (index < hdr.numKeys );
271+ return memcmp (src, keyBuf + offsets[index], keyCompareLen);
272+ }
273+
274+ bool CJHBlockCompressedVarNode::fetchPayload (unsigned int num, char *dst, PayloadReference & activePayload) const
275+ {
276+ if (num >= hdr.numKeys ) return false ;
277+
278+ if (NULL != dst)
279+ {
280+ const char * p = keyBuf + offsets[num];
281+ KEYRECSIZE_T reclen = sizes[num];
282+ if (keyHdr->hasSpecialFileposition ())
283+ {
284+ if (zeroFilePosition)
285+ {
286+ memcpy (dst+keyCompareLen, p+keyCompareLen, reclen-keyCompareLen);
287+ *(offset_t *)(dst+keyLen) = 0 ;
288+ }
289+ else
290+ memcpy (dst+keyCompareLen, p+keyCompareLen, reclen + sizeof (offset_t ) - keyCompareLen);
291+ }
292+ else
293+ memcpy (dst+keyCompareLen, p+keyCompareLen, reclen-keyCompareLen);
294+ }
295+ return true ;
296+ }
297+
298+ bool CJHBlockCompressedVarNode::getKeyAt (unsigned int num, char *dst) const
299+ {
300+ if (num >= hdr.numKeys ) return false ;
301+
302+ if (NULL != dst)
303+ {
304+ const char * p = keyBuf + offsets[num];
305+ memcpy (dst, p, keyCompareLen);
306+ }
307+ return true ;
308+ }
309+
310+ size32_t CJHBlockCompressedVarNode::getSizeAt (unsigned int num) const
311+ {
312+ dbgassertex (num < hdr.numKeys );
313+ KEYRECSIZE_T reclen = sizes[num];
314+ if (keyHdr->hasSpecialFileposition ())
315+ return reclen + sizeof (offset_t );
316+ else
317+ return reclen;
318+ }
319+
320+ offset_t CJHBlockCompressedVarNode::getFPosAt (unsigned int num) const
321+ {
322+ if (num >= hdr.numKeys ) return 0 ;
323+ if (zeroFilePosition) return 0 ;
324+
325+ const char * p = keyBuf + offsets[num];
326+ KEYRECSIZE_T reclen = sizes[num];
327+ offset_t pos;
328+ memcpy ( &pos, p + reclen, sizeof (__int64) );
329+ _WINREV (pos);
330+ return pos;
331+ }
332+
333+ // =========================================================================================================
334+
241335CBlockCompressedWriteNode::CBlockCompressedWriteNode (offset_t _fpos, CKeyHdr *_keyHdr, bool isLeafNode, const CBlockCompressedBuildContext& ctx) :
242336 CWriteNode(_fpos, _keyHdr, isLeafNode), context(ctx)
243337{
@@ -283,8 +377,8 @@ bool CBlockCompressedWriteNode::add(offset_t pos, const void *indata, size32_t i
283377 compressor.open (keyPtr, maxBytes-hdr.keyBytes , handler, context.compressionOptions , isVariable, fixedKeySize);
284378 }
285379
286- unsigned writeOptions = KeyCompressor::TrailingFilePosition | (context.zeroFilePos ? KeyCompressor::NoFilePosition : 0 );
287- if (0xffff == hdr.numKeys || 0 == compressor.writekey (pos, (const char *)indata, insize, writeOptions))
380+ unsigned writeOptions = (context.zeroFilePos ? KeyCompressor::NoFilePosition : KeyCompressor::TrailingFilePosition );
381+ if (0xffff == hdr.numKeys || 0 == compressor.writekey (pos, (const char *)indata, insize, writeOptions, keyHdr-> getNodeKeyLength () ))
288382 return false ;
289383
290384 if (insize>keyLen)
@@ -346,96 +440,3 @@ BlockCompressedIndexCompressor::BlockCompressedIndexCompressor(unsigned keyedSiz
346440 if (!isTLK && helper && (helper->getFlags () & TIWzerofilepos))
347441 context.zeroFilePos = true ;
348442}
349-
350- CJHBlockCompressedVarNode::CJHBlockCompressedVarNode () {}
351- CJHBlockCompressedVarNode::~CJHBlockCompressedVarNode ()
352- {
353- delete [] recArray;
354- }
355-
356- void CJHBlockCompressedVarNode::load (CKeyHdr *_keyHdr, const void *rawData, offset_t _fpos, bool needCopy)
357- {
358- CJHBlockCompressedSearchNode::load (_keyHdr, rawData, _fpos, needCopy);
359- unsigned n = getNumKeys ();
360- recArray = new const char * [n];
361- const char *finger = keyBuf;
362- for (unsigned int i=0 ; i<getNumKeys (); i++)
363- {
364- recArray[i] = finger + sizeof (KEYRECSIZE_T);
365- KEYRECSIZE_T recsize = *(KEYRECSIZE_T *)finger;
366- _WINREV (recsize);
367- finger += recsize + sizeof (KEYRECSIZE_T);
368- if (!zeroFilePosition)
369- finger += sizeof (offset_t );
370- }
371- }
372-
373- int CJHBlockCompressedVarNode::compareValueAt (const char *src, unsigned int index) const
374- {
375- return memcmp (src, recArray[index], keyCompareLen);
376- }
377-
378- bool CJHBlockCompressedVarNode::fetchPayload (unsigned int num, char *dst, PayloadReference & activePayload) const
379- {
380- if (num >= hdr.numKeys ) return false ;
381-
382- if (NULL != dst)
383- {
384- const char * p = recArray[num];
385- KEYRECSIZE_T reclen = ((KEYRECSIZE_T *) p)[-1 ];
386- _WINREV (reclen);
387- if (keyHdr->hasSpecialFileposition ())
388- {
389- if (zeroFilePosition)
390- {
391- memcpy (dst+keyCompareLen, p+keyCompareLen, reclen-keyCompareLen);
392- *(offset_t *)(dst+keyLen) = 0 ;
393- }
394- else
395- memcpy (dst+keyCompareLen, p+keyCompareLen, reclen + sizeof (offset_t ) - keyCompareLen);
396- }
397- else
398- memcpy (dst+keyCompareLen, p+keyCompareLen, reclen-keyCompareLen);
399- }
400- return true ;
401- }
402-
403- bool CJHBlockCompressedVarNode::getKeyAt (unsigned int num, char *dst) const
404- {
405- if (num >= hdr.numKeys ) return false ;
406-
407- if (NULL != dst)
408- {
409- const char * p = recArray[num];
410- KEYRECSIZE_T reclen = ((KEYRECSIZE_T *) p)[-1 ];
411- _WINREV (reclen);
412- assertex (reclen >= keyCompareLen);
413- memcpy (dst, p, keyCompareLen);
414- }
415- return true ;
416- }
417-
418- size32_t CJHBlockCompressedVarNode::getSizeAt (unsigned int num) const
419- {
420- const char * p = recArray[num];
421- KEYRECSIZE_T reclen = ((KEYRECSIZE_T *) p)[-1 ];
422- _WINREV (reclen);
423- if (keyHdr->hasSpecialFileposition ())
424- return reclen + sizeof (offset_t );
425- else
426- return reclen;
427- }
428-
429- offset_t CJHBlockCompressedVarNode::getFPosAt (unsigned int num) const
430- {
431- if (num >= hdr.numKeys ) return 0 ;
432- if (!zeroFilePosition) return 0 ;
433-
434- const char * p = recArray[num];
435- KEYRECSIZE_T reclen = ((KEYRECSIZE_T *) p)[-1 ];
436- _WINREV (reclen);
437- offset_t pos;
438- memcpy ( &pos, p + reclen, sizeof (__int64) );
439- _WINREV (pos);
440- return pos;
441- }
0 commit comments