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); }
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); }