/// <summary> /// Executes the current command. /// </summary> /// <param name="parameters"></param> public void Execute(MigrationParameters parameters) { if(resolveDbPlatform) ResolveDbPlatform(parameters); if(resolveMigrationDefinition) ResolveMigrationDefinition(parameters); if(displayEnvironmentInformation) DisplayEnvironmentInformation(parameters); InternalExecute(parameters); }
public void ExecuteCommand() { MigrationParameters parameters = new MigrationParameters(); parameters.Environment = "dev"; parameters.PlatformAlias = "foodb"; IServiceProvider serviceProvider = new ServiceProvider(); serviceProvider.RegisterService(new DbPlatformRegistry()); IMigrationCommand migrationCommand = new InfoMigrationCommand(); migrationCommand.ServiceProvider = serviceProvider; migrationCommand.Execute(parameters); }
private static void ParseMigrationParameter(MigrationParameters parameters, string argument) { string arg = argument.ToLowerInvariant(); if(arg.StartsWith("/c")) parameters.ConnectionString = ExtractArgumentValue(argument).Trim('"'); else if(arg.StartsWith("/p")) parameters.PlatformAlias = ExtractArgumentValue(argument); else if(arg.StartsWith("/m")) parameters.MdlFileName = ExtractArgumentValue(argument); else if(arg.StartsWith("/e")) parameters.Environment = ExtractArgumentValue(argument); else if(arg.StartsWith("/o")) parameters.OutputFileName = ExtractArgumentValue(argument); }
private static MigrationParameters ParseMigrationParameters(Queue<string> arguments) { MigrationParameters parameters = new MigrationParameters(); // // First argument is the command name parameters.Command = ParseMigrationCommand(arguments.Dequeue()); // // If next argument is an integer, use it as a version or step long versionOrStep; if(arguments.Count > 0 && long.TryParse(arguments.Peek(), out versionOrStep)) { parameters.VersionOrStep = versionOrStep; arguments.Dequeue(); } foreach(string argument in arguments) ParseMigrationParameter(parameters, argument); return parameters; }
protected IDbPlatform ResolveDbPlatform(MigrationParameters parameters) { IDbPlatform dbPlatform; if (!string.IsNullOrEmpty(parameters.Environment) || (string.IsNullOrEmpty(parameters.ConnectionString) || string.IsNullOrEmpty(parameters.PlatformAlias))) { // // Environment name defaults to "development". if (string.IsNullOrEmpty(parameters.Environment)) parameters.Environment = DefaultEnvironmentName; string databaseWdiFilePath = Path.Combine(Directory.GetCurrentDirectory(), "database.wdi"); if (!File.Exists(databaseWdiFilePath)) throw new MigrationException(string.Format(Resources.CouldNotFindDatabaseWdi, Directory.GetCurrentDirectory())); using(StreamReader streamReader = new StreamReader(databaseWdiFilePath)) { DeploymentInfoParser deploymentInfoParser = new DeploymentInfoParser(); IDeploymentInfo deploymentInfo = deploymentInfoParser.ParseDeploymentInfo(streamReader); IEnvironment environment = GetEnvironment(parameters, deploymentInfo); ServiceProvider.RegisterService(environment); if(string.IsNullOrEmpty(parameters.PlatformAlias)) parameters.PlatformAlias = environment.Properties["platform"]; dbPlatform = ServiceProvider.GetService<DbPlatformRegistry>().ResolvePlatform(parameters.PlatformAlias); EnsurePlatformResolved(parameters, dbPlatform); // // Build connection string IDbConnectionStringBuilder connectionStringBuilder = dbPlatform.CreateConnectionStringBuilder(); foreach (string key in environment.Properties.AllKeys) { connectionStringBuilder.AppendKeyValuePair(key, environment.Properties[key]); } // foreach parameters.ConnectionString = connectionStringBuilder.ToString(); } // using } // if else { dbPlatform = ServiceProvider.GetService<DbPlatformRegistry>().ResolvePlatform(parameters.PlatformAlias); EnsurePlatformResolved(parameters, dbPlatform); } // else ServiceProvider.RegisterService(dbPlatform); return dbPlatform; }
private void DisplayEnvironmentInformation(MigrationParameters parameters) { System.Console.WriteLine(); System.Console.WriteLine(Resources.MigrationDefinitionInformation, parameters.MdlFileName); System.Console.WriteLine(Resources.EnvironmentInformation, parameters.Environment); System.Console.WriteLine(Resources.ConnectionStringInformation, parameters.ConnectionString); DbPlatformRegistry dbPlatformRegistry = ServiceProvider.GetService<DbPlatformRegistry>(); System.Console.WriteLine(Resources.PlatformInformation, resolveDbPlatform ? dbPlatformRegistry.GetPlatformName(dbPlatformRegistry.ResolvePlatform(parameters.PlatformAlias)) : ""); }
private void ResolveMigrationDefinition(MigrationParameters parameters) { // // If no MDL file specified, grab the first in the current directory // hoping it's the only one there if(string.IsNullOrEmpty(parameters.MdlFileName)) { var mdlFiles = new DirectoryInfo(Directory.GetCurrentDirectory()).GetFiles("*.mdl"); if(mdlFiles.Length == 0 && ensureMigrationDefinitionExists) throw new MigrationException(string.Format(Resources.NoMigrationDefinition, Directory.GetCurrentDirectory())); if(mdlFiles.Length == 1) parameters.MdlFileName = mdlFiles[0].FullName; } // if // // If extension is omitted, append ".mdl" if(string.IsNullOrEmpty(Path.GetExtension(parameters.MdlFileName))) parameters.MdlFileName = parameters.MdlFileName + ".mdl"; }
protected abstract void InternalExecute(MigrationParameters parameters);
private static IEnvironment GetEnvironment(MigrationParameters parameters, IDeploymentInfo deploymentInfo) { foreach(var e in deploymentInfo.Environments) if(e.Name.ToLowerInvariant().StartsWith(parameters.Environment.ToLowerInvariant())) { parameters.Environment = e.Name; return ProcessSystemEnvironmentOverrides(e); } // if throw new Exception(); }
private void EnsurePlatformResolved(MigrationParameters parameters, IDbPlatform dbPlatform) { if(dbPlatform == null) throw new MigrationException( string.Format(Resources.CouldNotResolvePlatformAlias, parameters.PlatformAlias)); }
static int Main(string[] args) { System.Console.WriteLine(Resources.CopyrightInformation, Assembly.GetExecutingAssembly().GetName().Version.ToString(4), ApplicationInfo.Milestone); if(args.Length == 0 || (args.Length == 1 && args[0] == "/?")) { System.Console.WriteLine(); System.Console.WriteLine(Resources.UsageInformation); return 1; } // if serviceProvider = new ServiceProvider(); serviceProvider.RegisterService(BuildDbPlatformRegistry()); serviceProvider.RegisterService<IMigrationService>(delegate(IServiceProvider sp) { MigrationService migrationService = new MigrationService( sp.GetService<IDbPlatform>(), sp.GetService<IMigrationVersionInfoManager>(), sp.GetService<IMigrationScriptExecutive>(), sp.GetService<INativeSqlResourceProvider>()); migrationService.Migrating += MigrationServiceMigrating; migrationService.Migrated += MigrationServiceMigrated; return migrationService; }); serviceProvider.RegisterService<IMigrationVersionInfoManager>(delegate(IServiceProvider sp) { return new DbMigrationVersionInfoManager( sp.GetService<IDbPlatform>(), sp.GetService<IDbCommandExecutionStrategy>(), "SchemaInfo"); }); serviceProvider.RegisterService<IMigrationScriptExecutive>(delegate(IServiceProvider sp) { return new DbMigrationScriptExecutive( sp.GetService<IDbCommandExecutionStrategy>()); }); serviceProvider.RegisterService(new DeploymentService()); serviceProvider.RegisterService(new ReverseEngineeringService()); serviceProvider.RegisterService(new UtcDateTimeTimestampProvider()); serviceProvider.RegisterService(new FileSystemNativeSqlResourceProvider(Directory.GetCurrentDirectory())); // // Prepare Migration Command Registry... MigrationCommandRegistry migrationCommandRegistry = new MigrationCommandRegistry(); migrationCommandRegistry.RegisterAssembly(typeof(Program).Assembly); try { // // Parse parameters MigrationParametersParser parametersParser = new MigrationParametersParser(); parameters = parametersParser.ParseMigrationParameters(args); // // If we have an output file name specified, use special IDbCommandExecutionStrategy if(!string.IsNullOrEmpty(parameters.OutputFileName)) serviceProvider.RegisterService(new FileDbCommandExecutionStrategy(parameters.OutputFileName)); else serviceProvider.RegisterService(new DbCommandExecutionStrategy()); // // ...and execute whatever command we need IMigrationCommand migrationCommand = migrationCommandRegistry.ResolveCommand(parameters.Command); migrationCommand.ServiceProvider = serviceProvider; migrationCommand.Execute(parameters); } // try catch(MdlParserException e) { using(new ConsoleStylingScope(ConsoleColor.Red)) System.Console.WriteLine(System.Environment.NewLine + "Compilation Exception: {0}", e.Message); return 2; } // catch catch(MdlCompilerException e) { using(new ConsoleStylingScope(ConsoleColor.Red)) System.Console.WriteLine(System.Environment.NewLine + "Compilation Exception: {0} ({1})", e.Message, e.Location); return 3; } // catch catch(MigrationException e) { using(new ConsoleStylingScope(ConsoleColor.Red)) System.Console.WriteLine(System.Environment.NewLine + "Migration Exception: {0} ({1})", e.Message, e.SqlStatement); return 4; } // catch catch(DbPlatformException e) { IDbPlatform dbPlatform = serviceProvider.GetService<DbPlatformRegistry>().ResolvePlatform(parameters.PlatformAlias); using(new ConsoleStylingScope(ConsoleColor.Red)) System.Console.WriteLine(System.Environment.NewLine + "{0} Exception: {1}", serviceProvider.GetService<DbPlatformRegistry>().GetPlatformName(dbPlatform), e.Message + e.StackTrace.ToString()); return 5; } // catch catch(DbException e) { IDbPlatform dbPlatform = serviceProvider.GetService<DbPlatformRegistry>().ResolvePlatform(parameters.PlatformAlias); using (new ConsoleStylingScope(ConsoleColor.Red)) System.Console.WriteLine(System.Environment.NewLine + "{0} Exception: {1}", serviceProvider.GetService<DbPlatformRegistry>().GetPlatformName(dbPlatform), e.Message + e.StackTrace.ToString()); return 6; } // catch catch(Exception e) { using(new ConsoleStylingScope(ConsoleColor.Red)) System.Console.WriteLine(System.Environment.NewLine + "Unknown Exception: {0}", e.ToString()); return 100; } // catch return 0; }