size_t DRTupleStream::computeOffsets(DRRecordType &type, const std::pair<const TableIndex*, uint32_t> &indexPair, TableTuple &tuple, size_t &rowHeaderSz, size_t &rowMetadataSz, const std::vector<int> *&interestingColumns) { interestingColumns = NULL; rowMetadataSz = sizeof(int32_t); int columnCount; switch (type) { case DR_RECORD_DELETE: case DR_RECORD_UPDATE: if (indexPair.first) { // The index-optimized versions of these types have values exactly // 5 larger than the unoptimized versions (asserted in test) // DR_RECORD_DELETE => DR_RECORD_DELETE_BY_INDEX // DR_RECORD_UPDATE => DR_RECORD_UPDATE_BY_INDEX type = static_cast<DRRecordType>((int)type + 5); interestingColumns = &(indexPair.first->getColumnIndices()); rowMetadataSz += sizeof(int32_t); columnCount = static_cast<int>(interestingColumns->size()); } else { columnCount = tuple.sizeInValues(); } break; default: columnCount = tuple.sizeInValues(); break; } int nullMaskLength = ((columnCount + 7) & -8) >> 3; rowHeaderSz = rowMetadataSz + nullMaskLength; return rowHeaderSz + tuple.maxDRSerializationSize(interestingColumns); }
size_t CompatibleDRTupleStream::computeOffsets(DRRecordType &type, TableTuple &tuple, size_t &rowHeaderSz, size_t &rowMetadataSz) { rowMetadataSz = sizeof(int32_t); int columnCount; switch (type) { case DR_RECORD_DELETE: case DR_RECORD_UPDATE: columnCount = tuple.sizeInValues(); break; default: columnCount = tuple.sizeInValues(); break; } int nullMaskLength = ((columnCount + 7) & -8) >> 3; rowHeaderSz = rowMetadataSz + nullMaskLength; return rowHeaderSz + tuple.maxDRSerializationSize(); }