using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Tango.SQLExaminer { public class ExaminerSequenceConfigurationRunner { public event EventHandler Log; public event EventHandler ScriptExecuting; public String SequenceFile { get; private set; } public Core.DataSource Source { get; private set; } public Core.DataSource Target { get; private set; } public String MachineSerialNumber { get; private set; } public String ScriptsFolder { get; private set; } public ExaminerSequenceConfiguration Configuration { get; private set; } public ExaminerSequenceConfigurationRunner(ExaminerSequenceConfiguration sequenceConfiguration, String scriptsFolder, Core.DataSource source, Core.DataSource target, String machineSerialNumber) { ScriptsFolder = scriptsFolder; Source = source; Target = target; MachineSerialNumber = machineSerialNumber; Configuration = sequenceConfiguration; } public ExaminerSequenceConfigurationRunner(String sequenceFile, String scriptsFolder, Core.DataSource source, Core.DataSource target, String machineSerialNumber) { SequenceFile = sequenceFile; ScriptsFolder = scriptsFolder; Source = source; Target = target; MachineSerialNumber = machineSerialNumber; Configuration = ExaminerSequenceConfiguration.FromFile(sequenceFile); } public Task Run() { return Task.Factory.StartNew(() => { ExaminerSequenceConfiguration sequence = Configuration; foreach (var item in sequence.Items.OrderBy(x => x.Index)) { ScriptExecuting?.Invoke(this, item); ExaminerConfigurationBuilder builder = new ExaminerConfigurationBuilder(Path.Combine(ScriptsFolder, item.FileName)); if (item.Direction == ExaminerSequenceItemDirection.SourceToTarget) { builder.SetSource(Source); builder.SetTarget(Target); } else { builder.SetSource(Target); builder.SetTarget(Source); } if (item.RequiresSerialNumber) { builder.SetMachineSerialNumber(MachineSerialNumber); } builder.Synchronize(); ExaminerProcess process = new ExaminerProcess(builder.Build(), item.Type == ExaminerSequenceItemType.Schema ? ExaminerProcessType.Schema : ExaminerProcessType.Data); process.Progress += (x, msg) => { if (msg != null && !msg.Contains("SQL Examiner")) { Log?.Invoke(this, msg); } }; var result = process.Execute().Result; if (result.ExitCode != ExaminerProcessExitCode.Success) { throw new InvalidDataException(String.Format("Synchronization script '{0}' has terminated with exit code '{1}'.", item.Name, result.ExitCode)); } } }); } } }