private static string GenerateMigrationScript(
ConnectionStringSettings connectionStringSettings,
ReverseEngineerSettings reverseEngineerSettings,
IConfiguration configuration,
bool naive,
out IEnumerable<string> warnings,
out IEnumerable<string> errors) {
// fetch the from state
var dialectFactory = new DialectFactory();
var dialect = dialectFactory.Create(connectionStringSettings.ToSystem());
var factory = DbProviderFactories.GetFactory(connectionStringSettings.ProviderName);
// create database if not exists
CreateDatabaseIfNotExists(connectionStringSettings, factory, dialect);
DatabaseSchema schema;
using (new TimedOperation("-- Reading database contents...")) {
var databaseReader = new DatabaseReader(connectionStringSettings.ConnectionString, connectionStringSettings.ProviderName);
schema = databaseReader.ReadAll();
}
IEnumerable<IMap> fromMaps;
using (new TimedOperation("-- Reverse engineering...")) {
Console.WriteLine();
var engineer = new Engineer(reverseEngineerSettings.ExtraPluralizationWords);
fromMaps = engineer.ReverseEngineer(schema, dialect, reverseEngineerSettings.GetTablesToIgnore(), consoleAnswerProvider, false);
Console.Write("-- ");
}
using (var connection = factory.CreateConnection()) {
connection.ConnectionString = connectionStringSettings.ConnectionString;
// set up migrator
IMigrator migrator;
if (naive) {
throw new NotSupportedException("The Naive Migrator is no longer supported");
}
migrator = new Migrator(
dialect,
new CreateTableWriter(dialect),
new AlterTableWriter(dialect),
new DropTableWriter(dialect),
new StatisticsProvider(connection, dialect));
// run the migrator
string script;
using (new TimedOperation("-- Generating diff...")) {
script = migrator.GenerateSqlDiff(
fromMaps,
configuration.Maps,
consoleAnswerProvider,
new ConsoleLogger(isVerbose),
reverseEngineerSettings.GetIndexesToIgnore(),
out warnings,
out errors);
// TODO: do things with warnings and errors
return script;
}
}
}