public void Generate(IEnumerable<MigrationVersion> versions, TextWriter output, ScriptGenerationOptions options) { if (options.UseTransaction) { GenerateScriptForBeginTransaction(output); } if (options.TrackVersions) { GenerateScriptForVersionTrackingStorage(options.VersionTableName, output); } foreach (var version in versions) { if (options.TrackVersions) { GenerateScriptForVersionContinuityChecks(version, options.VersionTableName, options.UseTransaction, output); } bool hasSkipCondition = !String.IsNullOrEmpty(version.SkipCondition); if (hasSkipCondition) { GenerateScriptForSkipCondition(version, options, output); } GenerateScriptForApplyingVersionScript(version, options, output); GenerateScriptForDetectingFailedUpgrade(version, options, output); if (hasSkipCondition) { output.WriteLine("END"); } if (options.TrackVersions) { GenerateScriptToTrackVersion(version, options, output); output.WriteLine("END"); } } if (options.UseTransaction) { GenerateScriptForCommitTransaction(output); } }
protected virtual void GenerateScriptForApplyingVersionScript(MigrationVersion version, ScriptGenerationOptions options, TextWriter output) { output.WriteLine("PRINT N'Applying version {0} to schema {1}'", Escape(version.Version), Escape(version.Schema)); if (options.ProcessBatchedScripts) { string[] scriptParts = GetScriptParts(version.Script, options.BatchTerminator); foreach (string scriptPart in scriptParts) { output.WriteLine("exec sp_executesql N'{0}'", Escape(scriptPart)); } } else { output.WriteLine(version.Script); } }
protected virtual void GenerateScriptToTrackVersion(MigrationVersion version, ScriptGenerationOptions options, TextWriter output) { output.WriteLine(@"INSERT INTO [{0}] ([Schema], [Version], [NumericVersion], [Checksum], [Description], [DateAdded]) VALUES (N'{1}', N'{2}', {3}, '{4}', N'{5}', getutcdate())", options.VersionTableName, Escape(version.Schema), Escape(version.Version), version.NumericVersion, Escape(version.Checksum), Escape(version.Description)); }
protected virtual void GenerateScriptForSkipCondition(MigrationVersion version, ScriptGenerationOptions options, TextWriter output) { output.WriteLine(@"IF ({0}) BEGIN PRINT N'Skipping version {1} on schema {2} due to a matched skip condition' END ELSE BEGIN ", version.SkipCondition, Escape(version.Version), Escape(version.Schema)); }
protected virtual void GenerateScriptForDetectingFailedUpgrade(MigrationVersion version, ScriptGenerationOptions options, TextWriter output) { output.WriteLine(@"IF @@ERROR <> 0 BEGIN"); output.Write("PRINT N'Error occured while applying version {0} to schema {1}", Escape(version.Version), Escape(version.Schema)); if (options.UseTransaction) { output.WriteLine(", rolling back transaction'"); output.WriteLine("ROLLBACK TRANSACTION"); } else { output.WriteLine("'"); } output.WriteLine("RETURN"); output.WriteLine("END"); }
public GenerateMigrationScript() { MigrationScriptOptions = new MigrationScriptOptions(); ScriptGenerationOptions = new ScriptGenerationOptions(); }