private static void LoadColumnOffsetArray(IndexRecord record, int varColStartIndex)
        {
            var varColCountOffset = record.SlotOffset + record.Page.Header.MinLen + varColStartIndex;

            record.VariableLengthColumnCount = BitConverter.ToUInt16(record.Page.PageData, varColCountOffset);

            record.Mark("VariableLengthColumnCount", varColCountOffset, sizeof(short));

            // Load offset array of 2-byte ints indicating the end offset of each variable length field
            record.ColOffsetArray = GetOffsetArray(record.Page.PageData,
                                                   record.VariableLengthColumnCount,
                                                   record.SlotOffset + record.Page.Header.MinLen + sizeof(short) + varColStartIndex);

            record.Mark("ColOffsetArrayDescription", varColCountOffset + sizeof(short), record.VariableLengthColumnCount * sizeof(short));
        }
        private static void LoadDownPagePointer(IndexRecord record)
        {
            //Last 6 bytes of the fixed slot
            var address = new byte[PageAddress.Size];

            var downPagePointerOffset = record.SlotOffset + record.Page.Header.MinLen - PageAddress.Size;

            Array.Copy(record.Page.PageData, downPagePointerOffset, address, 0, PageAddress.Size);

            record.DownPagePointer = new PageAddress(address);

            record.Mark("DownPagePointer", downPagePointerOffset, PageAddress.Size);
        }
        private static void LoadStatusBits(IndexRecord record)
        {
            var statusA = record.Page.PageData[record.SlotOffset];

            record.StatusBitsA = new BitArray(new byte[] { statusA });

            record.Mark("StatusBitsADescription", record.SlotOffset, 1);

            record.RecordType = (RecordType)((statusA >> 1) & 7);

            record.HasNullBitmap            = record.StatusBitsA[4];
            record.HasVariableLengthColumns = record.StatusBitsA[5];
        }
        private static void LoadNullBitmap(IndexRecord record)
        {
            record.NullBitmapSize = (short)((record.Structure.Columns.Count - 1) / 8 + 1);

            var columnCountPosition = record.SlotOffset + record.Page.Header.MinLen;

            record.ColumnCount = BitConverter.ToInt16(record.Page.PageData, columnCountPosition);

            record.Mark("ColumnCount", columnCountPosition, sizeof(short));

            var nullBitmapBytes = new byte[record.NullBitmapSize];

            var nullBitmapPosition = record.SlotOffset + record.Page.Header.MinLen + sizeof(short);

            Array.Copy(record.Page.PageData,
                       nullBitmapPosition,
                       nullBitmapBytes,
                       0,
                       record.NullBitmapSize);

            record.NullBitmap = new BitArray(nullBitmapBytes);

            record.Mark("NullBitmapDescription", nullBitmapPosition, record.NullBitmapSize);
        }
        private static void LoadRid(IndexRecord record)
        {
            int ridOffset;
            var ridAddress = new byte[8];

            if (record.IsIndexType(IndexTypes.Leaf))
            {
                ridOffset = record.SlotOffset + record.Page.Header.MinLen - 8;
            }
            else
            {
                ridOffset = record.SlotOffset + record.Page.Header.MinLen - 14;
            }

            Array.Copy(record.Page.PageData, ridOffset, ridAddress, 0, RowIdentifier.Size);

            record.Rid = new RowIdentifier(ridAddress);

            record.Mark("Rid", ridOffset, RowIdentifier.Size);
        }
        private static void LoadColumnValues(IndexRecord record)
        {
            RecordField field;

            var columnValues = new List <RecordField>();

            var index = 0;

            foreach (IndexColumn indexCol in (record.Structure as IndexStructure).Columns)
            {
                var processKeyColumn      = !indexCol.Key || (record.IncludeKey && indexCol.Key);
                var processIncludesColumn = !indexCol.IncludedColumn || (indexCol.IncludedColumn && record.IsIndexType(IndexTypes.Leaf));

                if (processKeyColumn & processIncludesColumn)
                {
                    field = new RecordField(indexCol);

                    var    length        = 0;
                    var    offset        = 0;
                    byte[] data          = null;
                    var    variableIndex = 0;

                    if (indexCol.LeafOffset >= 0)
                    {
                        // Fixed length field
                        offset = indexCol.LeafOffset;
                        length = indexCol.DataLength;
                        data   = new byte[length];

                        Array.Copy(record.Page.PageData, indexCol.LeafOffset + record.SlotOffset, data, 0, length);
                    }
                    else if (record.HasVariableLengthColumns)
                    {
                        //Variable length field
                        variableIndex = (indexCol.LeafOffset * -1) - 1;

                        if (variableIndex == 0)
                        {
                            offset = record.VariableLengthDataOffset;
                        }
                        else
                        {
                            offset = record.ColOffsetArray[variableIndex - 1];
                        }

                        if (variableIndex >= record.ColOffsetArray.Length)
                        {
                            length = 0;
                        }
                        else
                        {
                            length = record.ColOffsetArray[variableIndex] - offset;
                        }

                        data = new byte[length];

                        Array.Copy(record.Page.PageData, offset + record.SlotOffset, data, 0, length);
                    }

                    field.Offset         = offset;
                    field.Length         = length;
                    field.Data           = data;
                    field.VariableOffset = variableIndex;

                    field.Mark("Value", record.SlotOffset + field.Offset, field.Length);


                    record.Mark("FieldsArray", field.Name, index);

                    index++;

                    columnValues.Add(field);
                }
            }

            record.Fields.AddRange(columnValues);
        }