예제 #1
0
        public DocumentTable(DocumentMapping mapping) : base(mapping.Table)
        {
            var pgIdType = TypeMappings.GetPgType(mapping.IdMember.GetMemberType());

            AddPrimaryKey(new TableColumn("id", pgIdType));

            AddColumn("data", "jsonb", "NOT NULL");

            AddColumn <LastModifiedColumn>();
            AddColumn <VersionColumn>();
            AddColumn <DotNetTypeColumn>();

            foreach (var field in mapping.DuplicatedFields)
            {
                AddColumn(new DuplicatedFieldColumn(field));
            }

            if (mapping.IsHierarchy())
            {
                AddColumn(new DocumentTypeColumn(mapping));
            }

            if (mapping.DeleteStyle == DeleteStyle.SoftDelete)
            {
                AddColumn <DeletedColumn>();
                AddColumn <DeletedAtColumn>();
            }

            Indexes.AddRange(mapping.Indexes);
            ForeignKeys.AddRange(mapping.ForeignKeys);
        }
예제 #2
0
        private void UpdateGroupedIndexList(DatabaseStatistics statistics)
        {
            Indexes.Clear();
            if (string.IsNullOrWhiteSpace(SearchText.Value))
            {
                Indexes.AddRange(statistics.Indexes.Where(stats => stats != null)
                                 .Select(stats => new IndexItem {
                    Name = stats.Name, GroupName = GetIndexGroup(stats), IndexStats = stats
                }));
            }
            else
            {
                Indexes.AddRange(statistics.Indexes
                                 .Where(stats => stats != null && stats.Name.IndexOf(SearchText.Value, StringComparison.InvariantCultureIgnoreCase) != -1)
                                 .Select(stats => new IndexItem {
                    Name = stats.Name, GroupName = GetIndexGroup(stats), IndexStats = stats
                }));
            }

            CleanGroupIndexes();
            foreach (var indexItem in Indexes)
            {
                var groupItem = GroupedIndexes.FirstOrDefault(@group => string.Equals(@group.GroupName, indexItem.GroupName, StringComparison.OrdinalIgnoreCase));
                if (groupItem == null)
                {
                    groupItem = new Group(indexItem.GroupName);
                    GroupedIndexes.Add(groupItem);
                }

                groupItem.Items.Add(indexItem);
            }

            OnPropertyChanged(() => GroupedIndexes);
        }
예제 #3
0
 public ArrayIndex(SourcePosition pos, IEnumerable <int> indexes = null) : base(pos)
 {
     if (indexes != null)
     {
         Indexes.AddRange(indexes);
     }
 }
 internal ClonedDbTable(DBTable table, string prefix)
 {
     Prefix = prefix;
     Columns.AddRange(table.Columns);
     ForeignKeys.AddRange(table.ForeignKeys);
     Indexes.AddRange(table.Indexes);
     IsView     = table.IsView;
     PrimaryKey = table.PrimaryKey;
 }
예제 #5
0
        public DocumentTable(DocumentMapping mapping) : base(mapping.TableName)
        {
            // validate to ensure document has an Identity field or property
            mapping.CompileAndValidate();

            _mapping = mapping;

            foreach (var index in mapping.IgnoredIndexes)
            {
                IgnoredIndexes.Add(index);
            }

            var idColumn = new IdColumn(mapping);

            AddColumn(idColumn).AsPrimaryKey();

            if (mapping.TenancyStyle == TenancyStyle.Conjoined)
            {
                AddColumn(mapping.Metadata.TenantId).AsPrimaryKey();

                Indexes.Add(new DocumentIndex(mapping, TenantIdColumn.Name));
            }

            AddColumn <DataColumn>();

            AddIfActive(_mapping.Metadata.LastModified);
            AddIfActive(_mapping.Metadata.Version);
            AddIfActive(_mapping.Metadata.DotNetType);

            AddIfActive(_mapping.Metadata.CorrelationId);
            AddIfActive(_mapping.Metadata.CausationId);
            AddIfActive(_mapping.Metadata.LastModifiedBy);
            AddIfActive(_mapping.Metadata.Headers);

            foreach (var field in mapping.DuplicatedFields.Where(x => !x.OnlyForSearching))
            {
                AddColumn(new DuplicatedFieldColumn(field));
            }

            if (mapping.IsHierarchy())
            {
                Indexes.Add(new DocumentIndex(_mapping, SchemaConstants.DocumentTypeColumn));
                AddColumn(_mapping.Metadata.DocumentType);
            }

            if (mapping.DeleteStyle == DeleteStyle.SoftDelete)
            {
                AddColumn(_mapping.Metadata.IsSoftDeleted);
                Indexes.Add(new DocumentIndex(mapping, SchemaConstants.DeletedColumn));

                AddColumn(_mapping.Metadata.SoftDeletedAt);
            }

            Indexes.AddRange(mapping.Indexes);
            ForeignKeys.AddRange(mapping.ForeignKeys);
        }
예제 #6
0
        public DocumentTable(DocumentMapping mapping) : base(mapping.TableName)
        {
            // validate to ensure document has an Identity field or property
            mapping.Validate();

            _mapping = mapping;

            var idColumn = new IdColumn(mapping);

            if (mapping.TenancyStyle == TenancyStyle.Conjoined)
            {
                AddPrimaryKeys(new List <TableColumn> {
                    idColumn, mapping.Metadata.TenantId
                });

                Indexes.Add(new IndexDefinition(mapping, TenantIdColumn.Name));
            }
            else
            {
                AddPrimaryKey(idColumn);
            }

            AddColumn <DataColumn>();

            AddIfActive(_mapping.Metadata.LastModified);
            AddIfActive(_mapping.Metadata.Version);
            AddIfActive(_mapping.Metadata.DotNetType);

            AddIfActive(_mapping.Metadata.CorrelationId);
            AddIfActive(_mapping.Metadata.CausationId);
            AddIfActive(_mapping.Metadata.LastModifiedBy);
            AddIfActive(_mapping.Metadata.Headers);

            foreach (var field in mapping.DuplicatedFields)
            {
                AddColumn(new DuplicatedFieldColumn(field));
            }

            if (mapping.IsHierarchy())
            {
                Indexes.Add(new IndexDefinition(_mapping, SchemaConstants.DocumentTypeColumn));
                AddColumn(_mapping.Metadata.DocumentType);
            }

            if (mapping.DeleteStyle == DeleteStyle.SoftDelete)
            {
                AddColumn(_mapping.Metadata.IsSoftDeleted);
                Indexes.Add(new IndexDefinition(mapping, SchemaConstants.DeletedColumn));

                AddColumn(_mapping.Metadata.SoftDeletedAt);
            }

            Indexes.AddRange(mapping.Indexes);
            ForeignKeys.AddRange(mapping.ForeignKeys);
        }
 /// <summary>
 ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
 ///     directly from your code. This API may change or be removed in future releases.
 /// </summary>
 public virtual void Add([NotNull] List <Tuple <InternalIndexBuilder, ConfigurationSource> > indexes)
 {
     if (Indexes == null)
     {
         Indexes = indexes;
     }
     else
     {
         Indexes.AddRange(indexes);
     }
 }
예제 #8
0
        public DocumentTable(DocumentMapping mapping) : base(mapping.Table)
        {
            // validate to ensure document has an Identity field or property
            mapping.Validate();

            var pgIdType   = TypeMappings.GetPgType(mapping.IdMember.GetMemberType());
            var pgTextType = TypeMappings.GetPgType(string.Empty.GetType());

            var idColumn = new TableColumn("id", pgIdType);

            if (mapping.TenancyStyle == TenancyStyle.Conjoined)
            {
                AddPrimaryKeys(new List <TableColumn>
                {
                    idColumn,
                    new TenantIdColumn()
                });

                Indexes.Add(new IndexDefinition(mapping, TenantIdColumn.Name));
            }
            else
            {
                AddPrimaryKey(idColumn);
            }

            AddColumn("data", "jsonb", "NOT NULL");

            AddColumn <LastModifiedColumn>();
            AddColumn <VersionColumn>();
            AddColumn <DotNetTypeColumn>();

            foreach (var field in mapping.DuplicatedFields)
            {
                AddColumn(new DuplicatedFieldColumn(field));
            }

            if (mapping.IsHierarchy())
            {
                AddColumn(new DocumentTypeColumn(mapping));
            }

            if (mapping.DeleteStyle == DeleteStyle.SoftDelete)
            {
                AddColumn <DeletedColumn>();
                Indexes.Add(new IndexDefinition(mapping, DocumentMapping.DeletedColumn));
                AddColumn <DeletedAtColumn>();
            }


            Indexes.AddRange(mapping.Indexes);
            ForeignKeys.AddRange(mapping.ForeignKeys);
        }
예제 #9
0
        public bool LoadDatabase(string path)
        {
            _dbInfo = new DatabaseInfo(new FirebirdInfo(path));
            if (!_dbInfo.CanLoadDatabase)
            {
                return(false);
            }

            using (var con = new FbConnection(_dbInfo.ConnectionString))
            {
                con.Open();
                foreach (var item in _dbInfo.GetTables(con))
                {
                    var vm = new TableViewModel(item.TableName);
                    foreach (var colums in item.GetColums(con))
                    {
                        vm.Colums.Add(new ColumViewMoodel(colums));
                    }
                    foreach (var trigger in item.GetTrigger(con))
                    {
                        vm.Triggers.Add(new TriggerViewModel(trigger));
                    }
                    foreach (var idx in item.GetIndex(con))
                    {
                        vm.Indexs.Add(new IndexViewModel(idx));
                    }
                    Tables.Add(vm);
                }
                Triggers.AddRange(Tables.SelectMany(x => ((TableViewModel)x).Triggers).ToArray());
                Indexes.AddRange(Tables.SelectMany(x => ((TableViewModel)x).Indexs).ToArray());
                foreach (var item in _dbInfo.GetViews(con))
                {
                    var vm = new TableViewViewModel(item.ViewName, item.Source);
                    foreach (var colums in item.GetColums(con))
                    {
                        vm.Colums.Add(new ColumViewMoodel(colums));
                    }
                    Tables.Add(vm);
                }
                RaisePropertyChanged(nameof(Tables));
                RaisePropertyChanged(nameof(Triggers));
                RaisePropertyChanged(nameof(Indexes));
            }
            return(true);
        }
예제 #10
0
    public EntityTypeMapping(IEntityType entityType)
    {
        Name       = entityType.Name;
        TableName  = entityType.GetTableName();
        PrimaryKey = entityType.FindPrimaryKey() !.ToDebugString(MetadataDebugStringOptions.SingleLineDefault);

        Properties.AddRange(
            entityType.GetProperties()
            .Select(p => p.ToDebugString(MetadataDebugStringOptions.SingleLineDefault)));

        Indexes.AddRange(
            entityType.GetIndexes().Select(i => $"{i.Properties.Format()} {(i.IsUnique ? "Unique" : "")}"));

        FKs.AddRange(
            entityType.GetForeignKeys().Select(f => f.ToDebugString(MetadataDebugStringOptions.SingleLineDefault)));

        Navigations.AddRange(
            entityType.GetNavigations().Select(n => n.ToDebugString(MetadataDebugStringOptions.SingleLineDefault)));

        SkipNavigations.AddRange(
            entityType.GetSkipNavigations().Select(n => n.ToDebugString(MetadataDebugStringOptions.SingleLineDefault)));
    }
예제 #11
0
        private void UpdateGroupedIndexList(DatabaseStatistics statistics)
        {
            Indexes.Clear();
            Indexes.AddRange(statistics.Indexes.Select(stats => new IndexItem {
                Name = stats.Name, GroupName = GetIndexGroup(stats), IndexStats = stats
            }));

            CleanGroupIndexes();
            foreach (var indexItem in Indexes)
            {
                var groupItem = GroupedIndexes.FirstOrDefault(@group => string.Equals(@group.GroupName, indexItem.GroupName, StringComparison.OrdinalIgnoreCase));
                if (groupItem == null)
                {
                    groupItem = new Group(indexItem.GroupName);
                    GroupedIndexes.Add(groupItem);
                }

                groupItem.Items.Add(indexItem);
            }

            OnPropertyChanged(() => GroupedIndexes);
        }
예제 #12
0
        /// <summary>
        /// Чтение заголовком атрибутов
        /// </summary>
        /// <param name="sector">Запись МФТ в виде массива байт</param>
        private void LoadAttributes(byte[] sector)
        {
            Attributes = new List <Attribute>();                 // создаем пустой список аттрибутов
            int       offset    = AttrsOffset;                   // смещение до первого аттрибута
            Attribute Attribute = new Attribute(sector, offset); // считываем первый аттрибут

            Attributes.Add(Attribute);                           //сохраняем в списке аттрибутов
            if (Signature != "FILE")                             // если текущая запись МФТ не файл, то прекращаем чтение
            {
                return;
            }
            while (Attribute.Type != AttributeTypes.AT_END)                                     // пока не дошли до последнего аттрибута
            {
                if (Attribute.NonResidentFlg == 1)                                              // Если аттрибут нерезидентный, то считываем его список отрезков и высчитываем адреса занимаемых кластеров
                {
                    int  runListStart       = offset + Attribute.NonResident.MappingPairOffset; // начало списка отрезков
                    int  currenrRunList     = runListStart;
                    byte RunListCurrentByte = sector[currenrRunList];
                    byte NumByteInRunOffset = (byte)(RunListCurrentByte >> 4);   // сколько байт отводится под адрес начального кластера
                    byte NumByteInRunLen    = (byte)(RunListCurrentByte & 0x0F); // сколько байт отводится под длину отрезка
                    currenrRunList++;
                    int currentSeg = 0;
                    do
                    {
                        LineSegment seg           = new LineSegment(); // создаем новый отрезок
                        int         segmentLength = 0;
                        for (int i = 0; i < NumByteInRunLen; i++)
                        {
                            segmentLength += sector[currenrRunList] << (i * 8);
                            currenrRunList++;
                        }

                        for (int i = 0; i < NumByteInRunOffset; i++)
                        {
                            seg.Start += (ulong)sector[currenrRunList] << (i * 8);
                            currenrRunList++;
                        }

                        if (currentSeg != 0)
                        {
                            seg.Start += Attribute.NonResident.Clusters[currentSeg - 1].Start; // высчитываем LCN начального кластера
                        }

                        seg.End = seg.Start + (ulong)segmentLength; // высчитываем адрес конечного кластера отрезка

                        Attribute.NonResident.Clusters.Add(seg);
                        RunListCurrentByte = sector[currenrRunList];
                        // переходим к следующему отрезку
                        NumByteInRunOffset = (byte)(RunListCurrentByte >> 4);
                        NumByteInRunLen    = (byte)(RunListCurrentByte & 0x0F);
                        currenrRunList++;
                        currentSeg++;
                    } while (RunListCurrentByte != 0); // подка не закончится список отрезков
                }

                if (Attribute.Type == AttributeTypes.AT_INDEX_ROOT && FileName != "$Secure") // если аттрибут INDEX_ROOT, то считываем индексные элементы
                {
                    Indexes.AddRange(IndexElements(sector, offset, Attribute));
                }

                if (Attribute.Type == AttributeTypes.AT_INDEX_ALLOCATION && FileName != "$Secure") // если аттрибут INDEX_ALLOCATIOB, то считываем индексные записи из списка отрезков, и читаем из них индексные элементы
                {
                    Indexes.AddRange(IndexAllocationElements(this, Attribute));
                }

                if (Attribute.Type == AttributeTypes.AT_FILE_NAME) // если аттрибут FILE_NAME, то читаем имя файла
                {
                    ParentDir = 0;
                    for (int i = 0; i < 6; i++)
                    {
                        ParentDir += (ulong)sector[offset + Attribute.Resident.ValueOffset + i] << (i * 8);
                    }

                    byte[] chars = new byte[sector[offset + 0x58] * 2];
                    for (int i = 0; i < chars.Length; i += 2)
                    {
                        chars[i] = (byte)(sector[offset + 0x5A + i] + (sector[offset + 0x5A + i + 1] << 8));
                    }

                    char[] unicode = new char[sector[offset + 0x58]];
                    Encoding.Unicode.GetChars(chars, 0, chars.Length, unicode, 0);
                    FileName = new string(unicode);
                }


                offset   += Attribute.Length;
                Attribute = new Attribute(sector, offset); // считываем следующий аттрибут
                Attributes.Add(Attribute);
            }
        }