예제 #1
0
 internal RawRecord(ArrayDelimiter<byte> bytes)
 {
     // Status byte A
     RawStatusByteA = bytes[0];
     Version = (RawStatusByteA & 0x01) == 0x01; // First bit
     Type = (RecordType)((RawStatusByteA & 0x0E) >> 1); // 2-4th bits
     HasNullBitmap = (RawStatusByteA & 0x10) == 0x10; // Fifth bit
     HasVariableLengthColumns = (RawStatusByteA & 0x20) == 0x20; // Sixth bit
     HasVersioningInformation = (RawStatusByteA & 0x40) == 0x40; // Seventh bit
 }
예제 #2
0
 internal RawRecord(ArrayDelimiter <byte> bytes)
 {
     // Status byte A
     RawStatusByteA           = bytes[0];
     Version                  = (RawStatusByteA & 0x01) == 0x01;            // First bit
     Type                     = (RecordType)((RawStatusByteA & 0x0E) >> 1); // 2-4th bits
     HasNullBitmap            = (RawStatusByteA & 0x10) == 0x10;            // Fifth bit
     HasVariableLengthColumns = (RawStatusByteA & 0x20) == 0x20;            // Sixth bit
     HasVersioningInformation = (RawStatusByteA & 0x40) == 0x40;            // Seventh bit
 }
예제 #3
0
        public RawIndexRecord(ArrayDelimiter <byte> bytes, short pminlen, byte level) : base(bytes)
        {
            // Fixed length size
            FixedLengthSize = (short)(pminlen - 1);

            // Fixed length data
            FixedLengthData = new ArrayDelimiter <byte>(bytes.SourceArray, bytes.Offset + 1, FixedLengthSize);

            // Null bitmap column count
            NullBitmapColumnCount = BitConverter.ToInt16(bytes.SourceArray, FixedLengthData.Offset + FixedLengthData.Count);

            // Null bitmap
            NullBitmapRawBytes = new ArrayDelimiter <byte>(bytes.SourceArray, FixedLengthData.Offset + FixedLengthData.Count + 2, (NullBitmapColumnCount + 7) / 8);
            NullBitmap         = new BitArray(NullBitmapRawBytes.ToArray());

            // Variable length offset array
            if (HasVariableLengthColumns)
            {
                int endOfNullBitmapPointer = 1 + FixedLengthData.Count + 2 + NullBitmapRawBytes.Count;

                // Number of pointers
                NumberOfVariableLengthOffsetArrayEntries = BitConverter.ToInt16(bytes.SourceArray, bytes.Offset + endOfNullBitmapPointer);

                // Pointers
                VariableLengthOffsetArray = new List <short>();
                for (int i = 0; i < NumberOfVariableLengthOffsetArrayEntries; i++)
                {
                    VariableLengthOffsetArray.Add(BitConverter.ToInt16(bytes.SourceArray, bytes.Offset + endOfNullBitmapPointer + 2 + i * 2));
                }

                // Values
                int endOfVariableLengthOffsetArrayPointer = endOfNullBitmapPointer + 2 + NumberOfVariableLengthOffsetArrayEntries.Value * 2;
                int previousPointer = endOfVariableLengthOffsetArrayPointer;

                VariableLengthOffsetValues = new List <ArrayDelimiter <byte> >();
                foreach (short entry in VariableLengthOffsetArray)
                {
                    VariableLengthOffsetValues.Add(new ArrayDelimiter <byte>(bytes.SourceArray, bytes.Offset + previousPointer, entry - previousPointer));
                    previousPointer = entry;
                }
            }

            // If we're at a non-leaf level, parse the page pointers
            if (level > 0)
            {
                ChildPageID = BitConverter.ToInt32(bytes.SourceArray, bytes.Offset + 1 + FixedLengthData.Count - 6);
                ChildFileID = BitConverter.ToInt16(bytes.SourceArray, bytes.Offset + 1 + FixedLengthData.Count - 2);
            }
        }
예제 #4
0
        public RawIndexRecord(ArrayDelimiter<byte> bytes, short pminlen, byte level)
            : base(bytes)
        {
            // Fixed length size
            FixedLengthSize = (short)(pminlen - 1);

            // Fixed length data
            FixedLengthData = new ArrayDelimiter<byte>(bytes.SourceArray, bytes.Offset + 1, FixedLengthSize);

            // Null bitmap column count
            NullBitmapColumnCount = BitConverter.ToInt16(bytes.SourceArray, FixedLengthData.Offset + FixedLengthData.Count);

            // Null bitmap
            NullBitmapRawBytes = new ArrayDelimiter<byte>(bytes.SourceArray, FixedLengthData.Offset + FixedLengthData.Count + 2, (NullBitmapColumnCount + 7) / 8);
            NullBitmap = new BitArray(NullBitmapRawBytes.ToArray());

            // Variable length offset array
            if (HasVariableLengthColumns)
            {
                int endOfNullBitmapPointer = 1 + FixedLengthData.Count + 2 + NullBitmapRawBytes.Count;

                // Number of pointers
                NumberOfVariableLengthOffsetArrayEntries = BitConverter.ToInt16(bytes.SourceArray, bytes.Offset + endOfNullBitmapPointer);

                // Pointers
                VariableLengthOffsetArray = new List<short>();
                for (int i = 0; i < NumberOfVariableLengthOffsetArrayEntries; i++)
                    VariableLengthOffsetArray.Add(BitConverter.ToInt16(bytes.SourceArray, bytes.Offset + endOfNullBitmapPointer + 2 + i * 2));

                // Values
                int endOfVariableLengthOffsetArrayPointer = endOfNullBitmapPointer + 2 + NumberOfVariableLengthOffsetArrayEntries.Value * 2;
                int previousPointer = endOfVariableLengthOffsetArrayPointer;

                VariableLengthOffsetValues = new List<ArrayDelimiter<byte>>();
                foreach (short entry in VariableLengthOffsetArray)
                {
                    VariableLengthOffsetValues.Add(new ArrayDelimiter<byte>(bytes.SourceArray, bytes.Offset + previousPointer, entry - previousPointer));
                    previousPointer = entry;
                }
            }

            // If we're at a non-leaf level, parse the page pointers
            if (level > 0)
            {
                ChildPageID = BitConverter.ToInt32(bytes.SourceArray, bytes.Offset + 1 + FixedLengthData.Count - 6);
                ChildFileID = BitConverter.ToInt16(bytes.SourceArray, bytes.Offset + 1 + FixedLengthData.Count - 2);
            }
        }
예제 #5
0
        public RawPrimaryRecord(ArrayDelimiter <byte> bytes) : base(bytes)
        {
            // Status byte B
            RawStatusByteB         = bytes[1];
            IsGhostForwardedRecord = (bytes[1] & 0x01) == 0x01;             // First bit

            // Fixed length size
            FixedLengthSize = (short)(BitConverter.ToInt16(bytes.SourceArray, bytes.Offset + 2) - 4);

            // Fixed length data
            FixedLengthData = new ArrayDelimiter <byte>(bytes.SourceArray, bytes.Offset + 4, FixedLengthSize);

            // Null bitmap column count
            NullBitmapColumnCount = BitConverter.ToInt16(bytes.SourceArray, bytes.Offset + 4 + FixedLengthSize);

            // Null bitmap
            NullBitmapRawBytes = new ArrayDelimiter <byte>(bytes.SourceArray, bytes.Offset + 4 + FixedLengthSize + 2, (NullBitmapColumnCount + 7) / 8);
            NullBitmap         = new BitArray(NullBitmapRawBytes.ToArray());

            // Variable length offset array
            if (HasVariableLengthColumns)
            {
                int endOfNullBitmapPointer = 4 + FixedLengthSize + 2 + NullBitmapRawBytes.Count;

                // Number of pointers
                NumberOfVariableLengthOffsetArrayEntries = BitConverter.ToInt16(bytes.SourceArray, bytes.Offset + endOfNullBitmapPointer);

                // Pointers
                VariableLengthOffsetArray = new List <short>();
                for (int i = 0; i < NumberOfVariableLengthOffsetArrayEntries; i++)
                {
                    VariableLengthOffsetArray.Add(BitConverter.ToInt16(bytes.SourceArray, bytes.Offset + endOfNullBitmapPointer + 2 + i * 2));
                }

                // Values
                int endOfVariableLengthOffsetArrayPointer = endOfNullBitmapPointer + 2 + NumberOfVariableLengthOffsetArrayEntries.Value * 2;
                int previousPointer = endOfVariableLengthOffsetArrayPointer;

                VariableLengthOffsetValues = new List <ArrayDelimiter <byte> >();
                foreach (short entry in VariableLengthOffsetArray)
                {
                    VariableLengthOffsetValues.Add(new ArrayDelimiter <byte>(bytes.SourceArray, bytes.Offset + previousPointer, entry - previousPointer));
                    previousPointer = entry;
                }
            }
        }
예제 #6
0
        public RawPrimaryRecord(ArrayDelimiter<byte> bytes)
            : base(bytes)
        {
            // Status byte B
            RawStatusByteB = bytes[1];
            IsGhostForwardedRecord = (bytes[1] & 0x01) == 0x01; // First bit

            // Fixed length size
            FixedLengthSize = (short)(BitConverter.ToInt16(bytes.SourceArray, bytes.Offset + 2) - 4);

            // Fixed length data
            FixedLengthData = new ArrayDelimiter<byte>(bytes.SourceArray, bytes.Offset + 4, FixedLengthSize);

            // Null bitmap column count
            NullBitmapColumnCount = BitConverter.ToInt16(bytes.SourceArray, bytes.Offset + 4 + FixedLengthSize);

            // Null bitmap
            NullBitmapRawBytes = new ArrayDelimiter<byte>(bytes.SourceArray, bytes.Offset + 4 + FixedLengthSize + 2, (NullBitmapColumnCount + 7) / 8);
            NullBitmap = new BitArray(NullBitmapRawBytes.ToArray());

            // Variable length offset array
            if (HasVariableLengthColumns)
            {
                int endOfNullBitmapPointer = 4 + FixedLengthSize + 2 + NullBitmapRawBytes.Count;

                // Number of pointers
                NumberOfVariableLengthOffsetArrayEntries = BitConverter.ToInt16(bytes.SourceArray, bytes.Offset + endOfNullBitmapPointer);

                // Pointers
                VariableLengthOffsetArray = new List<short>();
                for (int i = 0; i < NumberOfVariableLengthOffsetArrayEntries; i++)
                    VariableLengthOffsetArray.Add(BitConverter.ToInt16(bytes.SourceArray, bytes.Offset + endOfNullBitmapPointer + 2 + i * 2));

                // Values
                int endOfVariableLengthOffsetArrayPointer = endOfNullBitmapPointer + 2 + NumberOfVariableLengthOffsetArrayEntries.Value * 2;
                int previousPointer = endOfVariableLengthOffsetArrayPointer;

                VariableLengthOffsetValues = new List<ArrayDelimiter<byte>>();
                foreach (short entry in VariableLengthOffsetArray)
                {
                    VariableLengthOffsetValues.Add(new ArrayDelimiter<byte>(bytes.SourceArray, bytes.Offset + previousPointer, entry - previousPointer));
                    previousPointer = entry;
                }
            }
        }
 public IniArrayDelimiter(ArrayDelimiter delimiter)
 {
     this.delimiter = delimiter;
 }