Example #1
0
 private void AddTopSchemaTupleItem(IObjectSchema schema, SchemaInfoTuple schemaInfo)
 {
     if (!this.TopObjectSchemaInfoTupleTable.ContainsKey(schema))
     {
         this.TopObjectSchemaInfoTupleTable.Add(schema, schemaInfo);
     }
 }
Example #2
0
        public static void CompleteSchema(ISchemaProvider provider, SchemaInfoTuple schemaInfo)
        {
            switch (schemaInfo.SchemaType)
            {
            case SchemaType.Table:
            {
                var columnSchemas = provider.LoadColumnSchemaList(schemaInfo.ObjectSchema.Name);
                schemaInfo.ColumnSchemas = new List <ColumnSchemaExtend>(columnSchemas);
                var indexSchemas = provider.LoadIndexSchemaList(schemaInfo.ObjectSchema.Name);
                schemaInfo.IndexColumnSchemas = new List <IndexSchema>(indexSchemas);
            }
            break;

            case SchemaType.View:
            {
                var columnSchems = provider.LoadViewColumnSchemaList(schemaInfo.ObjectSchema.Name);
                schemaInfo.ColumnSchemas = new List <ColumnSchemaExtend>(columnSchems);
            }
            break;

            case SchemaType.Procedure:
            {
            }
            break;

            case SchemaType.Function:
            {
            }
            break;
            }
        }
        private async Task CompleteSchema(SchemaInfoTuple schemaInfo)
        {
            this.ShowTipInformation($"正在补全 [{schemaInfo.ObjectSchema.Name}] 的结构信息...");
            await Task.Run(() =>
            {
                SchemaAssistor.CompleteSchema(this.CurrentSchemaProvider, schemaInfo);
            });

            this.ShowTipInformation();
        }
Example #4
0
        private void RaiseExportProgressChanged(Int32 total, Int32 current, SchemaInfoTuple schema)
        {
            SchemaExportEventArgs args = new SchemaExportEventArgs();

            args.Total      = total;
            args.Current    = current;
            args.SchemaInfo = schema;
            ThreadPool.QueueUserWorkItem((s) =>
            {
                this.ExportProgressChanged?.Invoke(this, args);
            });
        }
Example #5
0
        public void WriteSchemaInfo(ISheet formatSheet, ISheet sheet, EPoint start, SchemaInfoTuple schemaInfo)
        {
            //复制表头
            formatSheet.CopyRow(ExcelTemplateFormat.TSTHeadRowNum, sheet, start.X, start.Y);
            //写入 表名(说明) 信息
            String name = schemaInfo.ObjectSchema.Name;

            if (!String.IsNullOrEmpty(schemaInfo.ObjectSchema.Explain))
            {
                name += $"({schemaInfo.ObjectSchema.Explain})";
            }
            sheet.SetCellValue(start.X, 0, name);

            start.X += ExcelTemplateFormat.RowSpan;
            //复制列头
            formatSheet.CopyRow(ExcelTemplateFormat.TSTColumnHeaderRowNum, sheet, start.X, start.Y);
            start.X += ExcelTemplateFormat.RowSpan;



            //开始写入列信息
            Int32 num = 1;

            if (schemaInfo.ColumnSchemas == null || schemaInfo.ColumnSchemas.Count == 0)
            {
                return;
            }
            foreach (var colSchema in schemaInfo.ColumnSchemas)
            {
                //复制行
                formatSheet.CopyRow(ExcelTemplateFormat.TSTRowTemlateNum, sheet, start.X, start.Y);

                Int32 col = 0;
                //写入序号
                sheet.SetCellValue(start.X, col, num++);
                col += ExcelTemplateFormat.TableNumColLength;

                //写入列名
                sheet.SetCellValue(start.X, col, colSchema.Name);
                col += ExcelTemplateFormat.TableFieldNameColLength;

                //写入注释
                sheet.SetCellValue(start.X, col, colSchema.Explain);
                col += ExcelTemplateFormat.TableExplainColLength;

                //写入类型
                sheet.SetCellValue(start.X, col, colSchema.DbTypeString);
                col += ExcelTemplateFormat.TableTypeColLength;

                //写入长度
                if (colSchema.Length.HasValue)
                {
                    sheet.SetCellValue(start.X, col, colSchema.Length.Value);
                }

                col += ExcelTemplateFormat.TableLengthColLength;

                //写入主键信息
                if (colSchema.IsPrimaryKey)
                {
                    sheet.SetCellValue(start.X, col, colSchema.IsPrimaryKey);
                }

                col += ExcelTemplateFormat.TableIsPrimaryColLength;

                //写入可空信息
                if (!colSchema.IsNullable)
                {
                    sheet.SetCellValue(start.X, col, colSchema.IsNullable);
                }
                col += ExcelTemplateFormat.TableIsNullableColLength;


                start.X += ExcelTemplateFormat.RowSpan;
            }
        }
Example #6
0
        /// <summary>
        /// 比较两个结构信息集合,并返回之间的差异(包含相同的信息项)
        /// </summary>
        /// <remarks>两个集合中的信息的 <see cref="SchemaInfoTuple.SchemaType"/> 值需要相同 </remarks>
        /// <param name="sourceSchemas"></param>
        /// <param name="targetSchemas"></param>
        /// <returns></returns>
        public static List <SchemaDifferenceInfo> CompareSchemaInfo(IEnumerable <SchemaInfoTuple> sourceSchemas, IEnumerable <SchemaInfoTuple> targetSchemas)
        {
            List <SchemaDifferenceInfo> differenceInfos = new List <SchemaDifferenceInfo>();

            //层1:表、视图、函数、存储过程
            //层2:列、索引


            //比较层1
            var sourceTopSchemas = sourceSchemas.Select(t => t.ObjectSchema).ToList();
            var targetTopSchemas = targetSchemas.Select(t => t.ObjectSchema).ToList();

            var topSchemaDifferenceInfos     = CompareObjectSchemas(sourceTopSchemas, targetTopSchemas, out var topChangeFlag);
            var topSchemaDifferenceTypeTable = topSchemaDifferenceInfos.ToDictionary(t => t.Schema);

            differenceInfos.AddRange(topSchemaDifferenceInfos);

            Dictionary <String, SchemaInfoTuple> targetSchemaInfoTable = new Dictionary <String, SchemaInfoTuple>();

            foreach (var schema in targetSchemas)
            {
                targetSchemaInfoTable.Add(schema.ObjectSchema.Name, schema);
            }

            //比较层2
            foreach (var sourceSchema in sourceSchemas)
            {
                SchemaInfoTuple targetSchema = null;
                if (targetSchemaInfoTable.ContainsKey(sourceSchema.ObjectSchema.Name))
                {
                    targetSchema = targetSchemaInfoTable[sourceSchema.ObjectSchema.Name];
                }
                switch (sourceSchema.SchemaType)
                {
                case SchemaType.Table:
                {
                    //比较列
                    var columnDifferenceInfos = SchemaAssistor.CompareObjectSchemas(
                        sourceSchema.ColumnSchemas.Cast <IObjectSchema>(),
                        targetSchema?.ColumnSchemas.Cast <IObjectSchema>(), out var changeFlag);
                    differenceInfos.AddRange(columnDifferenceInfos);
                    //将变化中删除的列添加至目标结构中
                    var deletedColumnSchemas = columnDifferenceInfos.Where(t => t.DifferenceType == SchemaDifferenceType.Delete).Select(t => t.Schema).Cast <ColumnSchemaExtend>();
                    targetSchema?.ColumnSchemas.AddRange(deletedColumnSchemas);
                    //如果第二层的信息发生了变化,则信息所属的父结点也应该被标记为变化
                    //改变可能是删除、新增、修改。当改变是新增与修改时,表中一定会存在
                    if (changeFlag)
                    {
                        if (topSchemaDifferenceTypeTable[targetSchema.ObjectSchema].DifferenceType != SchemaDifferenceType.Delete)
                        {
                            topSchemaDifferenceTypeTable[targetSchema.ObjectSchema].DifferenceType = SchemaDifferenceType.Modify;
                        }
                    }
                    //比较索引
                    var indexDifferenceInfos = SchemaAssistor.CompareObjectSchemas(
                        sourceSchema.IndexColumnSchemas.Cast <IObjectSchema>(),
                        targetSchema?.IndexColumnSchemas.Cast <IObjectSchema>(), out changeFlag);
                    differenceInfos.AddRange(indexDifferenceInfos);
                    //将变化中删除的索引添加至目标结构中
                    var deletedIndexColumnSchemas = indexDifferenceInfos.Where(t => t.DifferenceType == SchemaDifferenceType.Delete).Select(t => t.Schema).Cast <IndexSchema>();
                    targetSchema?.IndexColumnSchemas.AddRange(deletedIndexColumnSchemas);
                    //如果第二层的信息发生了变化
                    if (changeFlag)
                    {
                        if (topSchemaDifferenceTypeTable[targetSchema.ObjectSchema].DifferenceType != SchemaDifferenceType.Delete)
                        {
                            topSchemaDifferenceTypeTable[targetSchema.ObjectSchema].DifferenceType = SchemaDifferenceType.Modify;
                        }
                    }
                }
                break;

                case SchemaType.View:
                {
                    //比较列
                    var columnDifferenceInfos = SchemaAssistor.CompareObjectSchemas(
                        sourceSchema.ColumnSchemas.Cast <IObjectSchema>(),
                        targetSchema?.ColumnSchemas.Cast <IObjectSchema>(), out var changeFlag);
                    differenceInfos.AddRange(columnDifferenceInfos);
                    //将变化中删除的列添加至目标结构中
                    var deletedIndexColumnSchemas = columnDifferenceInfos.Where(t => t.DifferenceType == SchemaDifferenceType.Delete).Select(t => t.Schema).Cast <ColumnSchemaExtend>();
                    targetSchema?.ColumnSchemas.AddRange(deletedIndexColumnSchemas);
                    //如果第二层的信息发生了变化
                    if (changeFlag)
                    {
                        if (topSchemaDifferenceTypeTable[targetSchema.ObjectSchema].DifferenceType != SchemaDifferenceType.Delete)
                        {
                            topSchemaDifferenceTypeTable[targetSchema.ObjectSchema].DifferenceType = SchemaDifferenceType.Modify;
                        }
                    }
                }
                break;

                case SchemaType.Procedure:
                {
                }
                break;

                case SchemaType.Function:
                {
                }
                break;
                }
            }

            //获取新增的结构信息,上面的遍历是以源结构为集合的,所以目标结构新增的信息是遍历不到的
            var addSchemaInfos = topSchemaDifferenceInfos.Where(t => t.DifferenceType == SchemaDifferenceType.Add);

            foreach (var addSchema in addSchemaInfos)
            {
                var targetSchema = targetSchemaInfoTable[addSchema.Schema.Name];
                switch (targetSchema.SchemaType)
                {
                case SchemaType.Table:
                {
                    //新增列
                    var columnDifferenceInfos = SchemaAssistor.CompareObjectSchemas(
                        null,
                        targetSchema?.ColumnSchemas.Cast <IObjectSchema>(), out var changeFlag);
                    differenceInfos.AddRange(columnDifferenceInfos);

                    //新增索引
                    var indexDifferenceInfos = SchemaAssistor.CompareObjectSchemas(
                        null,
                        targetSchema?.IndexColumnSchemas.Cast <IObjectSchema>(), out changeFlag);
                    differenceInfos.AddRange(indexDifferenceInfos);
                }
                break;

                case SchemaType.View:
                {
                    //新增列
                    var columnDifferenceInfos = SchemaAssistor.CompareObjectSchemas(
                        null,
                        targetSchema?.ColumnSchemas.Cast <IObjectSchema>(), out var changeFlag);
                    differenceInfos.AddRange(columnDifferenceInfos);
                }
                break;

                case SchemaType.Procedure:
                {
                    //
                }
                break;

                case SchemaType.Function:
                {
                    //
                }
                break;
                }
            }
            return(differenceInfos);
        }
Example #7
0
 /// <summary>
 /// 是否需要补全结构信息
 /// </summary>
 /// <param name="schemaInfo"></param>
 /// <returns></returns>
 public static Boolean IsRequiredCompleteSchema(SchemaInfoTuple schemaInfo)
 {
     return((schemaInfo.SchemaType == SchemaType.Table || schemaInfo.SchemaType == SchemaType.View) && schemaInfo.ColumnSchemas == null);
 }