private int[] SortTable <T>(MetadataTable <T> table, IComparer <int> comparer)
            where T : struct
        {
            int count = table.Count;

            // Create rids
            int[] indexes = new int[count];
            for (int i = 0; i < count; i++)
            {
                indexes[i] = i;
            }

            // Sort rids.
            Array.Sort <int>(indexes, 0, count, comparer);

            var oldRows = table.GetRows();
            var newRows = new T[count];

            int[] ridMap = new int[count];

            // Map
            for (int i = 0; i < count; i++)
            {
                int mapIndex = indexes[i];
                ridMap[mapIndex] = i + 1;
                newRows[i]       = oldRows[mapIndex];
            }

            table.SetRows(newRows);

            return(ridMap);
        }
Ejemplo n.º 2
0
        private int GetTableRowSize(MetadataTable table)
        {
            var tableSchema   = table.GetSchema();
            var columnSchemas = tableSchema.Columns;

            int columnOffset = 0;

            for (int columnIndex = 0; columnIndex < columnSchemas.Length; columnIndex++)
            {
                int columnSize;
                var columnSchema = columnSchemas[columnIndex];
                if (columnSchema.IsTableIndex)
                {
                    columnSize = (_compressionInfo.TableRowIndexSize4[columnSchema.Type] ? 4 : 2);
                }
                else if (columnSchema.IsCodedToken)
                {
                    columnSize = (_compressionInfo.CodedTokenDataSize4[columnSchema.Type - 64] ? 4 : 2);
                }
                else
                {
                    switch (columnSchema.Type)
                    {
                    case MetadataColumnType.Byte2:
                    case MetadataColumnType.Int16:
                    case MetadataColumnType.UInt16:
                        columnSize = 2;
                        break;

                    case MetadataColumnType.Int32:
                    case MetadataColumnType.UInt32:
                        columnSize = 4;
                        break;

                    case MetadataColumnType.String:
                        columnSize = (_compressionInfo.StringHeapOffsetSize4 ? 4 : 2);
                        break;

                    case MetadataColumnType.Guid:
                        columnSize = (_compressionInfo.GuidHeapOffsetSize4 ? 4 : 2);
                        break;

                    case MetadataColumnType.Blob:
                        columnSize = (_compressionInfo.BlobHeapOffsetSize4 ? 4 : 2);
                        break;

                    default:
                        throw new InvalidOperationException();
                    }
                }

                columnOffset += columnSize;
            }

            return(columnOffset);
        }
        private bool CanSortAndMark(MetadataTable table)
        {
            if (IsSorted(table.Type))
            {
                return(false);
            }

            SetSorted(table.Type, true);

            if (table.Count == 0)
            {
                return(false);
            }

            return(true);
        }
        private void DeoptimizeTable <T>(MetadataTable <T> table, MetadataPtrTable ptrTable)
            where T : struct
        {
            int count = table.Count;

            if (count == 0)
            {
                return;
            }

            ptrTable.Capacity = count;

            for (int i = 0; i < count; i++)
            {
                ptrTable.Add(i + 1);
            }
        }
        private void OptimizeTable <T>(MetadataTable <T> table, MetadataPtrTable ptrTable)
            where T : struct
        {
            int count = table.Count;

            if (count == 0)
            {
                return;
            }

            if (ptrTable.Count == 0)
            {
                return;
            }

            int[] rids = new int[count];
            for (int i = 0; i < count; i++)
            {
                rids[i] = ptrTable.Get(i + 1);
            }

            table.Map(rids);
            ptrTable.Clear();
        }