public SchemaDiff(SchemaObjects existing, DocumentMapping mapping, DdlRules rules) { if (existing.HasNone()) { AllMissing = true; } else { var expectedTable = mapping.SchemaObjects.As<DocumentSchemaObjects>().StorageTable(); TableDiff = new TableDiff(expectedTable, existing.Table); // TODO -- drop obsolete indices? mapping.Indexes.Each(index => { if (existing.ActualIndices.ContainsKey(index.IndexName)) { var actualIndex = existing.ActualIndices[index.IndexName]; if (!index.Matches(actualIndex)) { IndexChanges.Add($"drop index {expectedTable.Table.Schema}.{index.IndexName};{Environment.NewLine}{index.ToDDL()};"); IndexRollbacks.Add($"drop index {expectedTable.Table.Schema}.{index.IndexName};{Environment.NewLine}{actualIndex.DDL};"); } } else { IndexChanges.Add(index.ToDDL()); IndexRollbacks.Add($"drop index concurrently if exists {expectedTable.Table.Schema}.{index.IndexName};"); } }); existing.ActualIndices.Values.Where(x => mapping.Indexes.All(_ => _.IndexName != x.Name)).Each( index => { IndexRollbacks.Add(index.DDL); IndexChanges.Add($"drop index concurrently if exists {mapping.Table.Schema}.{index.Name};"); }); var expectedFunction = new UpsertFunction(mapping); FunctionDiff = new FunctionDiff(expectedFunction.ToBody(rules), existing.Function); var missingFKs = mapping.ForeignKeys.Where(x => !existing.ForeignKeys.Contains(x.KeyName)); MissingForeignKeys.AddRange(missingFKs); } _mapping = mapping; }
public void WriteSchemaObjects(IDocumentSchema schema, StringWriter writer) { var table = StorageTable(); var rules = schema.StoreOptions.DdlRules; table.Write(rules, writer); writer.WriteLine(); writer.WriteLine(); var function = new UpsertFunction(_mapping); function.WriteFunctionSql(rules, writer); _mapping.ForeignKeys.Each(x => { writer.WriteLine(); writer.WriteLine((string)x.ToDDL()); }); _mapping.Indexes.Each(x => { writer.WriteLine(); writer.WriteLine(x.ToDDL()); }); DependentScripts.Each(script => { writer.WriteLine(); writer.WriteLine(); writer.WriteSql(_mapping.DatabaseSchemaName, script); }); writer.WriteLine(); writer.WriteLine(); var template = _mapping.DdlTemplate.IsNotEmpty() ? rules.Templates[_mapping.DdlTemplate.ToLower()] : rules.Templates["default"]; table.WriteTemplate(template, writer); var body = function.ToBody(rules); body.WriteTemplate(template, writer); writer.WriteLine(); writer.WriteLine(); }
public SchemaDiff(SchemaObjects existing, DocumentMapping mapping, DdlRules rules) { if (existing.HasNone()) { AllMissing = true; } else { var expectedTable = mapping.SchemaObjects.As <DocumentSchemaObjects>().StorageTable(); TableDiff = new TableDiff(expectedTable, existing.Table); // TODO -- drop obsolete indices? mapping.Indexes.Each(index => { if (existing.ActualIndices.ContainsKey(index.IndexName)) { var actualIndex = existing.ActualIndices[index.IndexName]; if (!index.Matches(actualIndex)) { IndexChanges.Add($"drop index {expectedTable.Table.Schema}.{index.IndexName};{Environment.NewLine}{index.ToDDL()};"); IndexRollbacks.Add($"drop index {expectedTable.Table.Schema}.{index.IndexName};{Environment.NewLine}{actualIndex.DDL};"); } } else { IndexChanges.Add(index.ToDDL()); IndexRollbacks.Add($"drop index concurrently if exists {expectedTable.Table.Schema}.{index.IndexName};"); } }); existing.ActualIndices.Values.Where(x => mapping.Indexes.All(_ => _.IndexName != x.Name)).Each( index => { IndexRollbacks.Add(index.DDL); IndexChanges.Add($"drop index concurrently if exists {mapping.Table.Schema}.{index.Name};"); }); var expectedFunction = new UpsertFunction(mapping); FunctionDiff = new FunctionDiff(expectedFunction.ToBody(rules), existing.Function); var missingFKs = mapping.ForeignKeys.Where(x => !existing.ForeignKeys.Contains(x.KeyName)); MissingForeignKeys.AddRange(missingFKs); } _mapping = mapping; }
public void WriteSchemaObjects(IDocumentSchema schema, StringWriter writer) { var table = StorageTable(); table.Write(writer); writer.WriteLine(); writer.WriteLine(); var function = new UpsertFunction(_mapping); function.WriteFunctionSql(writer); _mapping.ForeignKeys.Each(x => { writer.WriteLine(); writer.WriteLine((string)x.ToDDL()); }); _mapping.Indexes.Each(x => { writer.WriteLine(); writer.WriteLine(x.ToDDL()); }); DependentScripts.Each(script => { writer.WriteLine(); writer.WriteLine(); writer.WriteSql(_mapping.DatabaseSchemaName, script); }); var ownerName = schema.StoreOptions.OwnerName; if (ownerName.IsNotEmpty()) { writer.WriteLine($"ALTER TABLE {_mapping.Table} OWNER TO \"{ownerName}\";"); var functionBody = function.ToBody(); writer.WriteLine(functionBody.ToOwnershipCommand(ownerName)); } writer.WriteLine(); writer.WriteLine(); }