コード例 #1
0
ファイル: DBProvider.cs プロジェクト: psulek/doemd
        public bool InternalRefresh(Schema schema, LoadingMode loadMode, bool clearErrors)
        {
            if (clearErrors)
            {
                ClearLastErrors();
            }

            EnsureExtractedCatalog();

            List <Table> tables = new List <Table>();

            global::Xtensive.Sql.Model.Schema ormSchema = extractedCatalog.Schemas[schema.Name];
            foreach (global::Xtensive.Sql.Model.Table table in ormSchema.Tables)
            {
                Table newTable = new Table(table.Name, schema);
                tables.Add(newTable);
            }

            schema.Tables = new TableCollection(tables);

            if (loadMode == LoadingMode.RecursiveAllLevels)
            {
                foreach (var table in schema.Tables)
                {
                    InternalRefresh(table, false);
                }

                // iterate each foreign key if has assigned temporary reference table and if so then try to found real foreign table
                foreach (Table table in schema.Tables)
                {
                    if (table.ForeignKeys != null)
                    {
                        foreach (ForeignKey foreignKey in table.ForeignKeys)
                        {
                            if (foreignKey.ForeignTable is TemporaryReferencedTable)
                            {
                                TemporaryReferencedTable temporaryReferencedTable =
                                    (TemporaryReferencedTable)foreignKey.ForeignTable;

                                var referencedTable = schema.Tables[temporaryReferencedTable.Name];
                                //, temporaryReferencedTable.Schema];
                                foreignKey.ForeignTable = referencedTable;
                            }
                        }
                    }
                }
            }

            //TODO: When supporting views, add loading of views

            return(true);
        }
コード例 #2
0
ファイル: DBProvider.cs プロジェクト: psulek/doemd
        public bool InternalRefresh(Table table, bool clearErrors)
        {
            if (clearErrors)
            {
                ClearLastErrors();
            }

            EnsureExtractedCatalog();

            global::Xtensive.Sql.Model.Table ormTable = this.extractedCatalog.Schemas[table.Owner.Name].Tables[table.Name];

            if (ormTable != null)
            {
                var tableColumns = new List <Column>();

                // load columns
                foreach (TableColumn column in ormTable.TableColumns)
                {
                    Column newColumn = new Column(column.Name, table);
                    newColumn.DefaultValue = string.Empty;

                    if (column.DefaultValue != null)
                    {
                        SqlLiteral sqlLiteral = column.DefaultValue as SqlLiteral;
                        if (sqlLiteral != null)
                        {
                            object value = sqlLiteral.GetValue();
                            if (value != null)
                            {
                                newColumn.DefaultValue = value.ToString();
                            }
                        }
                    }

                    newColumn.MaxLength   = column.DataType.Length.GetValueOrDefault(0);
                    newColumn.IsMaxLength = column.DataType.Type == SqlType.VarCharMax || column.DataType.Type == SqlType.VarBinaryMax;
                    //                        column.DataType.SqlDataType.In(
                    //                        SqlDataType.NVarCharMax, SqlDataType.VarBinaryMax, SqlDataType.VarCharMax);
                    newColumn.Precision         = column.DataType.Precision.GetValueOrDefault(0);
                    newColumn.Scale             = column.DataType.Scale.GetValueOrDefault(0);
                    newColumn.ID                = -1;// column.SequenceDescriptor.Index;
                    newColumn.IdentityIncrement = column.SequenceDescriptor != null?column.SequenceDescriptor.Increment.GetValueOrDefault(0) : 0;

                    newColumn.IdentitySeed = column.SequenceDescriptor != null?column.SequenceDescriptor.StartValue.GetValueOrDefault(0) : 0;

                    newColumn.IsIdentity        = column.SequenceDescriptor != null;
                    newColumn.IsNullable        = column.IsNullable;
                    newColumn.NotForReplication = false;
                    newColumn.RowGuidCol        = false;
                    newColumn.SqlDataType       = column.DataType.Type.ToString();

                    Type clrType;

                    if (column.DataType.Type == SqlType.Unknown && column.DataType.TypeName.ToLower() == "timestamp")
                    {
                        clrType = typeof(byte[]);
                    }
                    else
                    {
                        clrType = column.DataType.Type.ToClrType();
                    }
                    Type nullableItemType = Nullable.GetUnderlyingType(clrType);

                    newColumn.ClrDataType = nullableItemType ?? clrType;
                    tableColumns.Add(newColumn);
                }

                table.Columns = new ColumnCollection(tableColumns);

                // load foreign keys
                List <ForeignKey> foreignKeys = new List <ForeignKey>();
                foreach (var key in ormTable.TableConstraints.Where(constraint => constraint is global::Xtensive.Sql.Model.ForeignKey).Cast <global::Xtensive.Sql.Model.ForeignKey>())
                {
                    ForeignKey newForeignKey = new ForeignKey(key.Name, table);
                    //TODO: How to get 'IsEnabled' and 'NotForReplication' values ??
                    newForeignKey.Enabled           = true;
                    newForeignKey.NotForReplication = true;
                    newForeignKey.OnDeleteAction    = ConvertForeignKeyAction(key.OnDelete);
                    newForeignKey.OnUpdateAction    = ConvertForeignKeyAction(key.OnUpdate);

                    //newForeignKey.SourceTable = table;
                    List <ForeignKeyColumn> newKeyColumns = new List <ForeignKeyColumn>();

                    for (int i = 0; i < key.ReferencedColumns.Count; i++)
                    {
                        var column       = key.Columns[i];
                        var keyColumnRef = key.ReferencedColumns[i];

                        //newKeyColumns.Add(new ForeignKeyColumn(column.Name, column.Value.Name, newForeignKey));
                        newKeyColumns.Add(new ForeignKeyColumn(column.Name, keyColumnRef.Name, newForeignKey));
                    }
                    newForeignKey.Columns = new ForeignKeyColumnCollection(newKeyColumns);

                    string referencedTableName   = key.ReferencedTable.Name;
                    string referencedTableSchema = key.ReferencedTable.Schema.Name;

                    var referencedTable = table.Owner.Owner.GetTable(referencedTableSchema, referencedTableName);
                    //var referencedTable = table.Owner.Tables[referencedTableName, referencedTableSchema]; //, key.ReferencedTableSchema];

                    if (referencedTable != null)
                    {
                        newForeignKey.ForeignTable = referencedTable;
                    }
                    else
                    {
                        var temporaryReferencedTable = new TemporaryReferencedTable(referencedTableName, table.Owner);
                        newForeignKey.ForeignTable = temporaryReferencedTable;
                    }

                    foreignKeys.Add(newForeignKey);
                }

                table.ForeignKeys = new ForeignKeyCollection(foreignKeys);

                // load indexes
                List <Index> indices = new List <Index>();

                foreach (global::Xtensive.Sql.Model.Index index in ormTable.Indexes)
                {
                    Index newIndex = new Index(index.Name, table);
                    newIndex.Primary    = false; // primaryKeys.Any(item => item.Name == index.Name);
                    newIndex.Clustered  = index.IsClustered;
                    newIndex.FillFactor = 0.0;
                    //newIndex.Unique = newIndex.Primary ? false : index.IsUnique;
                    newIndex.Unique = index.IsUnique;

                    List <IndexedColumn> newIndexedColumns = new List <IndexedColumn>();
                    foreach (var indexedColumn in index.Columns)
                    {
                        //ColumnInfo columnInfo = indexedColumn.Value;
                        newIndexedColumns.Add(new IndexedColumn(indexedColumn.Name, ConvertDirection(indexedColumn.Ascending), false, newIndex));
                    }

                    foreach (var includedColumn in index.NonkeyColumns)
                    {
                        newIndexedColumns.Add(new IndexedColumn(includedColumn.Name, IndexOrder.Ascending, true, newIndex));
                    }

                    newIndex.Columns = new IndexedColumnCollection(newIndexedColumns);
                    indices.Add(newIndex);
                }

                var primaryKeys = ormTable.TableConstraints.Where(constraint => constraint is PrimaryKey).Cast <PrimaryKey>();
                foreach (PrimaryKey primaryKey in primaryKeys)
                {
                    Index newIndex = new Index(primaryKey.Name, table);
                    newIndex.Primary    = true;
                    newIndex.Clustered  = true;
                    newIndex.Unique     = true;
                    newIndex.FillFactor = 0.0;
                    List <IndexedColumn> newIndexedColumns = new List <IndexedColumn>();
                    foreach (var indexedColumn in primaryKey.Columns)
                    {
                        newIndexedColumns.Add(new IndexedColumn(indexedColumn.Name, IndexOrder.Ascending, false, newIndex));
                    }

                    newIndex.Columns = new IndexedColumnCollection(newIndexedColumns);
                    indices.Add(newIndex);
                }

                table.Indexes = new IndexCollection(indices);
            }

            return(true);
        }