Esempio n. 1
0
        private static void LoadLargeRoot(BlobRecord record)
        {
            BlobChildLink link;

            record.BlobChildren = new List <BlobChildLink>();

            record.Mark("MaxLinks", record.SlotOffset + BlobRecord.MaxLinksOffset, sizeof(short));

            record.MaxLinks = BitConverter.ToInt16(record.Page.PageData, record.SlotOffset + BlobRecord.MaxLinksOffset);

            record.Mark("CurLinks", record.SlotOffset + BlobRecord.CurLinksOffset, sizeof(short));

            record.CurLinks = BitConverter.ToInt16(record.Page.PageData, record.SlotOffset + BlobRecord.CurLinksOffset);

            record.Mark("Level", record.SlotOffset + BlobRecord.RootLevelOffset, sizeof(short));

            record.Level = BitConverter.ToInt16(record.Page.PageData, record.SlotOffset + BlobRecord.RootLevelOffset);

            for (var i = 0; i < record.CurLinks; i++)
            {
                record.Mark("BlobChildrenArray", "Child " + i.ToString() + " ", i);

                if (record.BlobType == BlobType.LargeRoot)
                {
                    link = LoadRootBlobChild(record, i);
                }
                else
                {
                    link = LoadInternalBlobChild(record, i);
                }

                record.BlobChildren.Add(link);
            }
        }
Esempio n. 2
0
        private static BlobChildLink LoadRootBlobChild(BlobRecord record, int index)
        {
            var blobChildLink = new BlobChildLink();

            var offsetPosition = record.SlotOffset + BlobRecord.RootChildOffset + (index * 12);

            blobChildLink.Mark("Offset", offsetPosition, sizeof(int));

            var offset = BitConverter.ToInt32(record.Page.PageData, offsetPosition);

            var rowData = new byte[8];

            var rowIdPosition = record.SlotOffset + BlobRecord.RootChildOffset + (index * 12) + 4;

            blobChildLink.Mark("RowIdentifier", rowIdPosition, 8);

            Array.Copy(record.Page.PageData, rowIdPosition, rowData, 0, 8);

            var rowId = new RowIdentifier(rowData);

            blobChildLink.RowIdentifier = rowId;
            blobChildLink.Offset        = offset;

            return(blobChildLink);
        }
Esempio n. 3
0
        private static void LoadData(BlobRecord blobRecord)
        {
            blobRecord.Mark("Data", blobRecord.SlotOffset + BlobRecord.DataOffset, blobRecord.Length);

            blobRecord.Data = new byte[blobRecord.Length];

            Array.Copy(blobRecord.Page.PageData,
                       blobRecord.SlotOffset + BlobRecord.DataOffset,
                       blobRecord.Data,
                       0,
                       blobRecord.Length);
        }
Esempio n. 4
0
        private static void LoadSmallRoot(BlobRecord record)
        {
            record.Mark("Size", record.SlotOffset + BlobRecord.MaxLinksOffset, sizeof(short));

            record.Size = BitConverter.ToInt16(record.Page.PageData, record.SlotOffset + BlobRecord.MaxLinksOffset);

            record.Data = new byte[record.Size];

            record.Mark("Data", record.SlotOffset + BlobRecord.SmallDataOffset, record.Size);

            Array.Copy(record.Page.PageData,
                       record.SlotOffset + BlobRecord.SmallDataOffset,
                       record.Data,
                       0,
                       record.Size);
        }
Esempio n. 5
0
        private static BlobChildLink LoadInternalBlobChild(BlobRecord blobRecord, int index)
        {
            var offset = BitConverter.ToInt32(blobRecord.Page.PageData,
                                              blobRecord.SlotOffset + BlobRecord.InternalChildOffset + (index * 16));

            var rowData = new byte[8];

            Array.Copy(blobRecord.Page.PageData,
                       blobRecord.SlotOffset + BlobRecord.InternalChildOffset + (index * 16) + 8,
                       rowData,
                       0,
                       8);

            var rowId = new RowIdentifier(rowData);

            return(new BlobChildLink(rowId, offset, offset));
        }
Esempio n. 6
0
        /// <summary>
        /// Loads the specified record.
        /// </summary>
        /// <param name="record">The record.</param>
        internal static void Load(BlobRecord record)
        {
            var statusByte = record.Page.PageData[record.SlotOffset];

            record.Mark("StatusBitsADescription", record.SlotOffset, sizeof(byte));

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

            record.Mark("StatusBitsBDescription", record.SlotOffset + sizeof(byte), sizeof(byte));

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

            record.Mark("Length", record.SlotOffset + BlobRecord.LengthOffset, sizeof(short));

            record.Length = BitConverter.ToInt16(record.Page.PageData, record.SlotOffset + BlobRecord.LengthOffset);

            record.Mark("BlobId", record.SlotOffset + BlobRecord.IdOffset, sizeof(long));

            record.BlobId = BitConverter.ToInt64(record.Page.PageData, record.SlotOffset + BlobRecord.IdOffset);

            record.Mark("BlobTypeDescription", record.SlotOffset + BlobRecord.TypeOffset, sizeof(short));

            record.BlobType = (BlobType)record.Page.PageData[record.SlotOffset + BlobRecord.TypeOffset];

            switch (record.BlobType)
            {
            case BlobType.LargeRoot:
            case BlobType.Internal:

                LoadLargeRoot(record);
                break;

            case BlobType.SmallRoot:

                LoadSmallRoot(record);
                break;

            case BlobType.Data:

                LoadData(record);
                break;
            }
        }
Esempio n. 7
0
        /// <summary>
        /// Loads a record
        /// </summary>
        /// <param name="offset">The offset.</param>
        private void LoadRecord(ushort offset)
        {
            Record record = null;

            switch (Page.Header.PageType)
            {
            case PageType.Data:

                Structure tableStructure = new TableStructure(Page.Header.AllocationUnitId, Page.Database);

                if (Page.CompressionType == CompressionType.None)
                {
                    record = new DataRecord(Page, offset, tableStructure);
                }
                else
                {
                    record = new CompressedDataRecord(Page, offset, tableStructure);
                }

                allocationViewer.Visible = false;
                markerKeyTable.Visible   = true;
                break;

            case PageType.Index:

                Structure indexStructure = new IndexStructure(Page.Header.AllocationUnitId, Page.Database);

                record = new IndexRecord(Page, offset, indexStructure);

                allocationViewer.Visible = false;
                markerKeyTable.Visible   = true;
                break;

            case PageType.Iam:
            case PageType.Gam:
            case PageType.Sgam:
            case PageType.Bcm:
            case PageType.Dcm:

                allocationViewer.SetAllocationPage(Page.Header.PageAddress,
                                                   Page.Database.Name,
                                                   ConnectionString,
                                                   (Page.Header.PageType == PageType.Iam));

                markerKeyTable.Visible   = false;
                allocationViewer.Visible = true;
                break;

            case PageType.Pfs:

                allocationViewer.SetPfsPage(Page.Header.PageAddress,
                                            Page.Database.Name,
                                            ConnectionString);

                markerKeyTable.Visible   = false;
                allocationViewer.Visible = true;
                break;

            case PageType.Lob3:
            case PageType.Lob4:

                record = new BlobRecord(Page, offset);

                allocationViewer.Visible = false;
                markerKeyTable.Visible   = true;
                break;
            }

            if (record != null)
            {
                var markers = MarkerBuilder.BuildMarkers((Markable)record);

                hexViewer.AddMarkers(markers);

                markerKeyTable.SetMarkers(markers);

                hexViewer.ScrollToOffset(offset);

                offsetTableToolStripTextBox.Text = string.Format("{0:0000}", offset);
            }
        }