/// <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));
 }
Пример #11
0
        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;
        }