public virtual IReadOnlyList <SqlStatement> GenerateInsertMigrationSql( [NotNull] IMigrationMetadata migration, [NotNull] SqlGenerator sqlGenerator) { Check.NotNull(migration, "migration"); Check.NotNull(sqlGenerator, "sqlGenerator"); // TODO: Figure out what needs to be done to fully generate the INSERT statement // below using the DML SQL generator. var stringBuilder = new StringBuilder(); stringBuilder .Append("INSERT INTO ") .Append(sqlGenerator.DelimitIdentifier(TableName)) .Append(" (") .Append(sqlGenerator.DelimitIdentifier("MigrationName")) .Append(", ") .Append(sqlGenerator.DelimitIdentifier("Timestamp")) .Append(", ") .Append(sqlGenerator.DelimitIdentifier("ContextKey")) .Append(") VALUES (") .Append(sqlGenerator.GenerateLiteral(migration.Name)) .Append(", ") .Append(sqlGenerator.GenerateLiteral(migration.Timestamp)) .Append(", ") .Append(sqlGenerator.GenerateLiteral(GetContextKey())) .Append(")"); return(new[] { new SqlStatement(stringBuilder.ToString()) }); }
/// <inheritdoc /> public virtual void MigrationMetadataChanged(IMigrationMetadata migrationMetadata, IExtendedMigrationProcessor extendedMigrationProcessor) { Processor = extendedMigrationProcessor; if (!Enabled) { return; } if (!Processor.SchemaExists(CommonSchemaName) || !Processor.SchemaExists(AuthCodeSchemaName)) { return; } var logonSql = MigrationConfig .PrepareSql(SqlResources.LogonScriptSql) .ReplaceIgnoreCase("{CommonSchemaName}", CommonSchemaName) .ReplaceIgnoreCase("{AuthCodeSchemaName}", AuthCodeSchemaName); Execute(logonSql); if (Processor.SchemaExists(MigrationConfig.Schema)) { ProcessAfter(new CreateSchemaWithPrefixExpression { SchemaName = MigrationConfig.Schema, SchemaPrefixId = MigrationConfig.GetSchemaPrefixId(), SchemaPrefixUniqueId = MigrationConfig.GetSchemaPrefixUniqueId() }); } }
public MigrationPair( IMigrationMetadata localMigration, IMigrationMetadata databaseMigration) { LocalMigration = localMigration; DatabaseMigration = databaseMigration; }
public virtual IReadOnlyList <SqlStatement> GenerateDeleteMigrationSql( [NotNull] IMigrationMetadata migration, [NotNull] SqlGenerator sqlGenerator) { Check.NotNull(migration, "migration"); Check.NotNull(sqlGenerator, "sqlGenerator"); // TODO: Implement a mechanism to capture the SQL generated by // the update pipeline (context.Delete, context.SaveChanges) and use here. var stringBuilder = new StringBuilder(); stringBuilder .Append("DELETE FROM ") .Append(sqlGenerator.DelimitIdentifier(TableName)) .Append(" WHERE ") .Append(sqlGenerator.DelimitIdentifier("MigrationId")) .Append(" = ") .Append(sqlGenerator.GenerateLiteral(migration.MigrationId)) .Append(" AND ") .Append(sqlGenerator.DelimitIdentifier("ContextKey")) .Append(" = ") .Append(sqlGenerator.GenerateLiteral(GetContextKey())); return(new[] { new SqlStatement(stringBuilder.ToString()) }); }
public MigrationWithMetaDataAdapter(IMigration migration, IMigrationMetadata metadata) { if (migration == null) throw new ArgumentNullException("migration"); if (metadata == null) throw new ArgumentNullException("metadata"); Migration = migration; MetaData = metadata; }
public virtual IReadOnlyList <SqlStatement> GenerateInsertMigrationSql( [NotNull] IMigrationMetadata migration, [NotNull] SqlGenerator sqlGenerator) { Check.NotNull(migration, "migration"); Check.NotNull(sqlGenerator, "sqlGenerator"); // TODO: Implement a mechanism to capture the SQL generated by // the update pipeline (context.Add, context.SaveChanges) and use here. var stringBuilder = new StringBuilder(); stringBuilder .Append("INSERT INTO ") .Append(sqlGenerator.DelimitIdentifier(TableName)) .Append(" (") .Append(sqlGenerator.DelimitIdentifier("MigrationId")) .Append(", ") .Append(sqlGenerator.DelimitIdentifier("ContextKey")) .Append(", ") .Append(sqlGenerator.DelimitIdentifier("ProductVersion")) .Append(") VALUES (") .Append(sqlGenerator.GenerateLiteral(migration.MigrationId)) .Append(", ") .Append(sqlGenerator.GenerateLiteral(GetContextKey())) .Append(", ") .Append(sqlGenerator.GenerateLiteral(ProductVersion)) .Append(")"); return(new[] { new SqlStatement(stringBuilder.ToString()) }); }
public void Get_pending_migrations() { var databaseMigrations = new IMigrationMetadata[] { new MigrationMetadata("000000000000001_M1"), new MigrationMetadata("000000000000003_M3") }; var localMigrations = new IMigrationMetadata[] { new MigrationMetadata("000000000000001_M1"), new MigrationMetadata("000000000000002_M2"), new MigrationMetadata("000000000000003_M3"), new MigrationMetadata("000000000000004_M4") }; var migrator = MockMigrator(databaseMigrations, localMigrations); var migrations = migrator.GetPendingMigrations(); Assert.Equal(2, migrations.Count); Assert.Equal(localMigrations[1], migrations[0]); Assert.Equal(localMigrations[3], migrations[1]); }
protected virtual string GetClassName([NotNull] IMigrationMetadata migration) { Check.NotNull(migration, "migration"); // TODO: Generate valid C# class name from migration name. return(migration.GetMigrationName()); }
public ExtendedOracleProcessorBase(OracleBaseDbFactory factory, IMigrationGenerator generator, ILogger logger, IOptionsSnapshot <ProcessorOptions> options, IOptionsSnapshot <RunnerOptions> runnerOptions, IConnectionStringAccessor connectionStringAccessor, IExtendedMigrationGenerator <ExtendedOracleMigrationGenerator> extendedGenerator, IDbMigrationConfig migrationConfig, IMigrationSourceItem migrationSourceItem = null, IVersionTableMetaData versionTableMetaData = null, IOptions <FluentMigratorLoggerOptions> loggerGenOptions = null, IOptions <LogFileFluentMigratorLoggerOptions> logFileOptions = null) : base(ProcessorIds.OracleProcessorId, factory, generator, logger, options, connectionStringAccessor) { RunnerOptions = runnerOptions; MigrationConfig = migrationConfig; VersionTableMetaData = versionTableMetaData; LoggerOptions = loggerGenOptions?.Value; LoggerFileOptions = logFileOptions?.Value; IsSqlLogEnabled = (LoggerOptions?.ShowSql ?? false) || (LoggerFileOptions?.ShowSql ?? false); ExtendedGenerator = extendedGenerator; MigrationMetadata = new MigrationMetadata(migrationSourceItem).InitMetadata(MigrationConfig); ConnectionStringFunc = () => connectionStringAccessor.ConnectionString; Initialize(); }
internal override void ApplyMigration(DbMigration migration, DbMigration lastMigration) { IMigrationMetadata migrationMetadata = (IMigrationMetadata)migration; VersionedModel sourceModel1 = this.GetLastModel(lastMigration, migrationMetadata.Id); VersionedModel sourceModel2 = migration.GetSourceModel(); VersionedModel targetModel = migration.GetTargetModel(); if (sourceModel2 != null && this.IsModelOutOfDate(sourceModel2.Model, lastMigration)) { base.AutoMigrate(migrationMetadata.Id.ToAutomaticMigrationId(), sourceModel1, sourceModel2, false); sourceModel1 = sourceModel2; } string defaultSchema = DbMigrator.GetDefaultSchema(migration); XDocument historyModel = this.GetHistoryModel(defaultSchema); IEnumerable <MigrationOperation> systemOperations = Enumerable.Empty <MigrationOperation>(); if (object.ReferenceEquals((object)sourceModel1.Model, (object)this._emptyModel.Value) && !base.HistoryExists()) { systemOperations = (IEnumerable <MigrationOperation>) this._modelDiffer.Diff(this._emptyModel.Value, historyModel, (Lazy <ModificationCommandTreeGenerator>)null, (MigrationSqlGenerator)null, (string)null, (string)null); } else { string lastDefaultSchema = this.GetLastDefaultSchema(migrationMetadata.Id); if (!string.Equals(lastDefaultSchema, defaultSchema, StringComparison.Ordinal)) { systemOperations = (IEnumerable <MigrationOperation>) this._modelDiffer.Diff(this.GetHistoryModel(lastDefaultSchema), historyModel, (Lazy <ModificationCommandTreeGenerator>)null, (MigrationSqlGenerator)null, (string)null, (string)null); } } migration.Up(); this.ExecuteOperations(migrationMetadata.Id, targetModel, migration.Operations, systemOperations, false, false); }
public Aggregation(ImportedAggregateMigration migration, List <IMigrationMetadata> aggregatedMigrations) { Debug.Assert(aggregatedMigrations.All(m => m.ModuleName == migration.Metadata.ModuleName), "All migrations within an aggregation must belong to the same module."); _migration = migration; _aggregatedMigrations = aggregatedMigrations; _lastAggregatedMigration = aggregatedMigrations.Last(); }
public virtual IReadOnlyList <string> GetMetadataNamespaces([NotNull] IMigrationMetadata migration) { Check.NotNull(migration, "migration"); return(GetMetadataDefaultNamespaces() .Concat(ModelCodeGenerator.GetNamespaces(migration.TargetModel, migration.ContextType)) .ToList()); }
public override void GenerateMigrationMetadataClass( string @namespace, string className, IMigrationMetadata migration, IndentedStringBuilder stringBuilder) { foreach (var ns in GetMetadataDefaultNamespaces() .Concat(ModelCodeGenerator.GetNamespaces(migration.TargetModel)) .OrderBy(n => n) .Distinct()) { stringBuilder .Append("using ") .Append(ns) .AppendLine(";"); } stringBuilder .AppendLine() .Append("namespace ") .AppendLine(@namespace) .AppendLine("{"); using (stringBuilder.Indent()) { stringBuilder .Append("public partial class ") .Append(className) .AppendLine(" : IMigrationMetadata") .AppendLine("{"); using (stringBuilder.Indent()) { GenerateMigrationProperty( "string IMigrationMetadata.MigrationId", () => stringBuilder .Append("return ") .Append(GenerateLiteral(migration.MigrationId)) .Append(";"), stringBuilder); stringBuilder.AppendLine().AppendLine(); GenerateMigrationProperty( "IModel IMigrationMetadata.TargetModel", () => ModelCodeGenerator.Generate(migration.TargetModel, stringBuilder), stringBuilder); } stringBuilder .AppendLine() .Append("}"); } stringBuilder .AppendLine() .Append("}"); }
public bool IsContained(IMigrationMetadata metadata) { if (!_versioningTableExists.Value) { return false; } PersistedVersioning versioning = GetPersistedVersioning(null, null, null); return versioning.IsContained(metadata); }
public bool Select(IMigrationMetadata data) { if (_skipFirstMigration) { return(data.Timestamp > 201704042131); } else { return(true); } }
public override void GenerateMigrationClass( string @namespace, string className, IMigrationMetadata migration, IndentedStringBuilder stringBuilder) { Check.NotEmpty(@namespace, "namespace"); Check.NotEmpty(className, "className"); Check.NotNull(migration, "migration"); Check.NotNull(stringBuilder, "stringBuilder"); var operations = migration.UpgradeOperations.Concat(migration.DowngradeOperations); foreach (var ns in GetNamespaces(operations).OrderBy(n => n).Distinct()) { stringBuilder .Append("using ") .Append(ns) .AppendLine(";"); } stringBuilder .AppendLine() .Append("namespace ") .AppendLine(@namespace) .AppendLine("{"); using (stringBuilder.Indent()) { stringBuilder .Append("public partial class ") .Append(className) .AppendLine(" : Migration") .AppendLine("{"); using (stringBuilder.Indent()) { GenerateMigrationMethod("Up", migration.UpgradeOperations, stringBuilder); stringBuilder.AppendLine().AppendLine(); GenerateMigrationMethod("Down", migration.DowngradeOperations, stringBuilder); } stringBuilder .AppendLine() .Append("}"); } stringBuilder .AppendLine() .Append("}"); }
public virtual void ScaffoldMigration([NotNull] IMigrationMetadata migration) { Check.NotNull(migration, "migration"); var className = GetClassName(migration); var stringBuilder = new IndentedStringBuilder(); var metadataStringBuilder = new IndentedStringBuilder(); MigrationCodeGenerator.GenerateMigrationClass(Namespace, className, migration, stringBuilder); MigrationCodeGenerator.GenerateMigrationMetadataClass(Namespace, className, migration, metadataStringBuilder); OnMigrationScaffolded(className, stringBuilder.ToString(), metadataStringBuilder.ToString()); }
public MigrationWithMetaDataAdapter(IMigration migration, IMigrationMetadata metadata) { if (migration == null) { throw new ArgumentNullException("migration"); } if (metadata == null) { throw new ArgumentNullException("metadata"); } Migration = migration; MetaData = metadata; }
protected virtual void ScaffoldMigration( [NotNull] IMigrationMetadata migration, [NotNull] IndentedStringBuilder migrationCode, [NotNull] IndentedStringBuilder migrationMetadataCode) { Check.NotNull(migration, "migration"); Check.NotNull(migrationCode, "migrationCode"); Check.NotNull(migrationMetadataCode, "migrationMetadataCode"); var className = GetClassName(migration); MigrationCodeGenerator.GenerateMigrationClass(MigrationNamespace, className, migration, migrationCode); MigrationCodeGenerator.GenerateMigrationMetadataClass(MigrationNamespace, className, migration, migrationMetadataCode); }
private string GetMigrationName(IMigration migration) { if (migration == null) { throw new ArgumentNullException("migration"); } IMigrationMetadata metadata = migration as IMigrationMetadata; if (metadata != null) { return(string.Format("{0}: {1}", metadata.Version, metadata.Type.Name)); } return(migration.GetType().Name); }
public void Update(IMigrationMetadata metadata, IDbConnection connection, IDbTransaction transaction, MigrationDirection direction, IDbCommandExecutor commandExecutor) { Debug.Assert(!(metadata is BootstrapMetadata)); if (direction == MigrationDirection.Up) { _history.Insert(metadata.Timestamp, metadata.ModuleName, metadata.Tag); } else { Debug.Assert(direction == MigrationDirection.Down); Debug.Assert(_history.Contains(metadata.Timestamp, metadata.ModuleName), "Only migrations that were applied previously are being undone."); _history.Delete(metadata.Timestamp, metadata.ModuleName); } StoreChanges(connection, transaction, commandExecutor); }
protected virtual IReadOnlyList <IMigrationMetadata> GetDatabaseMigrations(out bool historyRepositoryExists) { IReadOnlyList <IMigrationMetadata> migrations; try { migrations = HistoryRepository.Migrations; historyRepositoryExists = true; } catch (DataStoreException) { // TODO: Log the exception message. migrations = new IMigrationMetadata[0]; historyRepositoryExists = false; } return(migrations); }
public void Get_database_migrations() { var databaseMigrations = new IMigrationMetadata[] { new MigrationMetadata("000000000000001_Migration1"), new MigrationMetadata("000000000000002_Migration2") }; var migrator = MockMigrator(databaseMigrations, new IMigrationMetadata[0]); var migrations = migrator.GetDatabaseMigrations(); Assert.Equal(databaseMigrations.Length, migrations.Count); for (var i = 0; i < databaseMigrations.Length; i++) { Assert.Equal(databaseMigrations[i], migrations[i]); } }
public void Get_local_migrations() { var localMigrations = new IMigrationMetadata[] { new MigrationMetadata("000000000000001_Migration1"), new MigrationMetadata("000000000000002_Migration2") }; var migrator = MockMigrator(new IMigrationMetadata[0], localMigrations); var migrations = migrator.GetLocalMigrations(); Assert.Equal(localMigrations.Length, migrations.Count); for (var i = 0; i < localMigrations.Length; i++) { Assert.Equal(localMigrations[i], migrations[i]); } }
private void Process(MigrationMetadataChangedExpression expression) { if (CustomMigrationProcessor == null || expression == null) { return; } if (MigrationMetadata.Equals(expression.MigrationMetadata)) { return; } RunCustomAction(() => { MigrationMetadata = expression.MigrationMetadata; CustomMigrationProcessor.MigrationMetadataChanged(MigrationMetadata, this); }); }
public virtual IReadOnlyList <SqlStatement> GenerateDeleteMigrationSql( [NotNull] IMigrationMetadata migration, [NotNull] SqlGenerator sqlGenerator) { Check.NotNull(migration, "migration"); Check.NotNull(sqlGenerator, "sqlGenerator"); // TODO: Figure out what needs to be done to fully generate the DELETE statement // below using the DML SQL generator. var stringBuilder = new StringBuilder(); stringBuilder .Append("DELETE FROM ") .Append(sqlGenerator.DelimitIdentifier(TableName)) .Append(" WHERE ") .Append(sqlGenerator.DelimitIdentifier("MigrationName")) .Append(" = ") .Append(sqlGenerator.GenerateLiteral(migration.Name)); return(new[] { new SqlStatement(stringBuilder.ToString()) }); }
public static string GetMigrationName([NotNull] this IMigrationMetadata metadata) { Check.NotNull(metadata, "metadata"); return(metadata.MigrationId.Substring(TimestampFormat.Length + 1)); }
/// <summary> /// Initializes a new instance. /// </summary> public MigrationEventArgs(IMigrationMetadata metadata, MigrationDirection direction) { _metadata = metadata; _direction = direction; }
public ImportedMigration(IMigration implementation, IMigrationMetadata metadata) { _implementation = implementation; _metadata = metadata; }
// В версии 2 не было поддержки миграций (исправляем только для SQL Server и SQL Server CE). private static void FixDatabase(IConnectionSettings connectionSettings, IMigrationMetadata migrationMetadata) { DbConnection connection = null; DbTransaction transaction = null; try { switch (connectionSettings.ProviderInvariantName) { case DataConfiguration.SqlServerProviderInvariantName: connection = new SqlConnection(connectionSettings.ConnectionString); break; case DataConfiguration.SqlServerCompactProviderInvariantName: connection = new SqlCeConnection(connectionSettings.ConnectionString); break; default: return; } try { connection.Open(); } catch (DbException exception) { Logger.Error(exception.Message, exception); return; // Ожидаем что база данных не существует. } string migrationId; using (var command = connection.CreateCommand()) { command.CommandText = "SELECT MigrationId FROM __MigrationHistory ORDER BY MigrationId"; DbDataReader dataReader = null; try { dataReader = command.ExecuteReader(); if (!dataReader.Read()) { throw new InvalidOperationException("!dataReader.Read()"); } migrationId = (string)dataReader["MigrationId"]; if (migrationId.Equals(migrationMetadata.Id)) { return; } if (dataReader.NextResult()) { throw new InvalidOperationException("reader.NextResult()"); } } catch (DbException exception) { Logger.Error(exception.Message, exception); // Ожидаем что таблицы не существует. return; } finally { if (null != dataReader) { dataReader.Close(); dataReader.Dispose(); } } } if (!migrationId.EndsWith("_InitialCreate", StringComparison.OrdinalIgnoreCase)) { throw new InvalidOperationException("migrationId == " + migrationId); } transaction = connection.BeginTransaction(); using (var command = connection.CreateCommand()) { command.Transaction = transaction; command.CommandText = "DELETE FROM __MigrationHistory WHERE MigrationId = @MigrationId"; AddParameterTo(command, "MigrationId", migrationId); command.ExecuteNonQuery(); } using (var command = connection.CreateCommand()) { command.Transaction = transaction; command.CommandText = "INSERT INTO __MigrationHistory (MigrationId, ContextKey, Model, ProductVersion) VALUES (@MigrationId, @ContextKey, @Model, @ProductVersion)"; AddParameterTo(command, "MigrationId", migrationMetadata.Id); AddParameterTo(command, "ContextKey", $"{typeof(Configuration).Namespace}.{nameof(Configuration)}"); AddParameterTo(command, "Model", Convert.FromBase64String(migrationMetadata.Target)); AddParameterTo(command, "ProductVersion", "6.1.3-40302"); command.ExecuteNonQuery(); } transaction.Commit(); } catch (Exception exception) { Logger.Error(exception.Message, exception); transaction?.Rollback(); throw; } finally { if (null != connection) { connection.Close(); connection.Dispose(); } } }
public void Update(IMigrationMetadata metadata, IDbConnection connection, IDbTransaction transaction, MigrationDirection direction, IDbCommandExecutor commandExecutor) { PersistedVersioning versioning = GetPersistedVersioning(connection, transaction, commandExecutor); versioning.Update(metadata, connection, transaction, direction, commandExecutor); }
public bool IsContained(IMigrationMetadata metadata) { return _history.Contains(metadata.Timestamp, metadata.ModuleName); }
private bool IsApplicable(IMigrationMetadata migration) { var comparer = new MigrationMetadataComparer(); return _applicableMigrations.Select(m => m.Migration.Metadata).Contains(migration, comparer); }
private static string GetMigrationDescription(IMigrationMetadata m) { string moduleName = (string.IsNullOrEmpty(m.ModuleName) ? MigrationExportAttribute.DefaultModuleName : m.ModuleName); return moduleName + ": " + m.Timestamp; }
protected virtual IReadOnlyList<IMigrationMetadata> GetDatabaseMigrations(out bool historyRepositoryExists) { IReadOnlyList<IMigrationMetadata> migrations; try { migrations = HistoryRepository.Migrations; historyRepositoryExists = true; } catch (DbException) { // TODO: Log the exception message. migrations = new IMigrationMetadata[0]; historyRepositoryExists = false; } return migrations; }
public ImportedMigration(IMigration implementation, IMigrationMetadata metadata, bool useModuleNameAsDefaultSchema) { _implementation = implementation; _metadata = metadata; _useModuleNameAsDefaultSchema = useModuleNameAsDefaultSchema; }
public override void GenerateMigrationMetadataClass( string @namespace, string className, IMigrationMetadata migration, IndentedStringBuilder stringBuilder) { Check.NotEmpty(@namespace, "namespace"); Check.NotEmpty(className, "className"); Check.NotNull(migration, "migration"); Check.NotNull(stringBuilder, "stringBuilder"); foreach (var ns in GetMetadataNamespaces(migration).OrderBy(n => n).Distinct()) { stringBuilder .Append("using ") .Append(ns) .AppendLine(";"); } stringBuilder .AppendLine() .Append("namespace ") .AppendLine(@namespace) .AppendLine("{"); using (stringBuilder.Indent()) { stringBuilder .Append("[ContextType(typeof(") .Append(migration.ContextType.GetNestedName()) .AppendLine("))]") .Append("public partial class ") .Append(className) .AppendLine(" : IMigrationMetadata") .AppendLine("{"); using (stringBuilder.Indent()) { GenerateMigrationProperty( "string IMigrationMetadata.MigrationId", () => stringBuilder .Append("return ") .Append(GenerateLiteral(migration.MigrationId)) .Append(";"), stringBuilder); stringBuilder.AppendLine().AppendLine(); GenerateMigrationProperty( "IModel IMigrationMetadata.TargetModel", () => ModelCodeGenerator.Generate(migration.TargetModel, stringBuilder), stringBuilder); } stringBuilder .AppendLine() .Append("}"); } stringBuilder .AppendLine() .Append("}"); }
private static string GetMigrationDescription(IMigrationMetadata m) { string moduleName = (string.IsNullOrEmpty(m.ModuleName) ? MigrationExportAttribute.DefaultModuleName : m.ModuleName); return(moduleName + ": " + m.Timestamp); }
public Aggregation(ImportedAggregateMigration migration, List<IMigrationMetadata> aggregatedMigrations) { Debug.Assert(aggregatedMigrations.All(m => m.ModuleName == migration.Metadata.ModuleName), "All migrations within an aggregation must belong to the same module."); _migration = migration; _aggregatedMigrations = aggregatedMigrations; _lastAggregatedMigration = aggregatedMigrations.Last(); }
public void Setup() { migration = new Mock <IMigration>(MockBehavior.Strict).Object; migrationMetadata = new Mock <IMigrationMetadata>(MockBehavior.Strict).Object; adapter = new MigrationWithMetaDataAdapter(migration, migrationMetadata); }
/// <summary> /// Constructor initialized <paramref name="migrationMetadata"/> to <see cref="MigrationMetadata"/> /// </summary> /// <param name="migrationMetadata"></param> public MigrationMetadataChangedExpression(IMigrationMetadata migrationMetadata) { Operation = (connection, transaction) => { }; MigrationMetadata = migrationMetadata; }