/// <summary>
        /// Register an migration provider with the migration engine,
        /// 1. Intialize migration service container and services.
        /// </summary>
        /// <param name="migrationProvider"></param>
        /// <param name="sourceId"></param>
        internal void RegisterMigrationProvider(Guid sourceId, IMigrationProvider migrationProvider)
        {
            ServiceContainer serviceContainer;

            Debug.Assert(m_serviceContainers.ContainsKey(sourceId),
                         string.Format(MigrationToolkitResources.UnknownSourceId, sourceId));

            if (!m_serviceContainers.TryGetValue(sourceId, out serviceContainer))
            {
                throw new MigrationException(string.Format(
                                                 MigrationToolkitResources.Culture,
                                                 MigrationToolkitResources.UnknownSourceId,
                                                 sourceId));
            }

            m_serviceContainers[sourceId].AddService(typeof(IMigrationProvider), migrationProvider);
            m_migrationProviders.Add(sourceId, migrationProvider);

            migrationProvider.InitializeServices(m_serviceContainers[sourceId]);

            ConflictManager conflictManagementService = m_serviceContainers[sourceId].GetService(typeof(ConflictManager)) as ConflictManager;

            Debug.Assert(conflictManagementService != null, "conflictManager == NULL");
            migrationProvider.RegisterConflictTypes(conflictManagementService);

            foreach (MigrationAddin MigrationAddin in m_addinManagementService.GetMigrationSourceMigrationAddins(sourceId))
            {
                Debug.Assert(m_serviceContainers.ContainsKey(sourceId), "No ServiceContainer found for MigrationSource with Id: " + sourceId);
                MigrationContext MigrationContext = new MigrationContext(m_serviceContainers[sourceId], migrationProvider);
                m_migrationContextsByMigrationSource.Add(sourceId, MigrationContext);
                // Just need to create one MigrationContext that can be shared by all of the Addins for a migration source since the contents are read-only
                // to the Addin
                break;
            }
        }
        /// <summary>
        /// Gets the service object of the specified type.
        /// </summary>
        /// <param name="serviceType">An object that specifies the type of service object to get.</param>
        /// <returns>
        /// A service object of type <paramref name="serviceType"/>.
        /// -or-
        /// null if there is no service object of type <paramref name="serviceType"/>.
        /// </returns>
        object IServiceProvider.GetService(Type serviceType)
        {
            TraceManager.TraceInformation("WSSVC:Adapter:GetService - {0}", serviceType);

            if (serviceType == typeof(IAnalysisProvider))
            {
                if (analysisProvider == null)
                {
                    analysisProvider = new SharePointVCAnalysisProvider();
                }
                return(analysisProvider);
            }

            if (serviceType == typeof(IMigrationProvider))
            {
                if (migrationProvider == null)
                {
                    migrationProvider = new SharePointVCMigrationProvider();
                }
                return(migrationProvider);
            }

            if (serviceType == typeof(IServerPathTranslationService))
            {
                if (transalationProvider == null)
                {
                    transalationProvider = new SharePointVCAdapterTranslation();
                }
                return(transalationProvider);
            }

            return(null);
        }
예제 #3
0
 /// <summary>
 /// Instantiates a new instance of the <see cref="SimpleMigrator"/> class
 /// </summary>
 /// <param name="migrationProvider">Migration provider to use to find migration classes</param>
 /// <param name="databaseProvider"><see cref="IDatabaseProvider{TDatabase}"/> implementation to use</param>
 /// <param name="logger">Logger to use to log progress</param>
 public SimpleMigrator(
     IMigrationProvider migrationProvider,
     IDatabaseProvider <DbConnection> databaseProvider,
     ILogger logger = null)
     : base(migrationProvider, databaseProvider, logger)
 {
 }
예제 #4
0
 object IServiceProvider.GetService(Type serviceType)
 {
     TraceManager.TraceInformation("POC:Adapter:GetService - {0}", serviceType.ToString());
     if (serviceType == typeof(IAnalysisProvider))
     {
         if (m_analysisProvider == null)
         {
             m_analysisProvider = new PocVCAnalysisProvider();
         }
         return(m_analysisProvider);
     }
     else if (serviceType == typeof(IMigrationProvider))
     {
         if (m_migrationProvider == null)
         {
             m_migrationProvider = new PocVCMigrationProvider();
         }
         return(m_migrationProvider);
     }
     else if (serviceType == typeof(IServerPathTranslationService))
     {
         if (m_serverPathTranslationProvider == null)
         {
             m_serverPathTranslationProvider = new PoCVCAdapterTranslation();
         }
         return(m_serverPathTranslationProvider);
     }
     return(new ArgumentException("Invalid Type :" + serviceType.Name));
 }
예제 #5
0
        /// <summary>
        /// Returns the actual implementation for requested service interfaces
        /// </summary>
        public object GetService(Type serviceType)
        {
            if (serviceType == typeof(IAnalysisProvider))
            {
                if (m_analysisProvider == null)
                {
                    m_analysisProvider = new SubversionVCAnalysisProvider();
                }
                return(m_analysisProvider);
            }
            else if (serviceType == typeof(IVCDiffProvider))
            {
                if (m_vcDiffProvider == null)
                {
                    m_vcDiffProvider = new SubversionVCDiffProvider();
                }
                return(m_vcDiffProvider);
            }
            if (serviceType == typeof(IMigrationProvider))
            {
                if (m_migrationProvider == null)
                {
                    m_migrationProvider = new SubversionVCMigrationProvider();
                }
                return(m_migrationProvider);
            }


            return(null);
        }
예제 #6
0
 public MigrationRunner(IMigrationProvider migrationProvider, IMigrationLog migrationLog, IMigrationSynchronizationContext synchronizationContext, IActivator <IMigration> activator)
 {
     this.migrationProvider      = migrationProvider;
     this.migrationLog           = migrationLog;
     this.activator              = activator;
     this.synchronizationContext = synchronizationContext;
 }
예제 #7
0
 public GenerateSQL(Configuration configuration, Settings settings, ISqlFormatter sql_formatter, IFileWriter file_writer, IMigrationProvider migration_provider)
 {
     _configuration      = configuration;
     _settings           = settings;
     _sql_formatter      = sql_formatter;
     _file_writer        = file_writer;
     _migration_provider = migration_provider;
 }
예제 #8
0
 public GenerateSQL(Configuration configuration, Settings settings, ISqlFormatter sql_formatter, IFileWriter file_writer, IMigrationProvider migration_provider)
 {
     _configuration = configuration;
     _settings = settings;
     _sql_formatter = sql_formatter;
     _file_writer = file_writer;
     _migration_provider = migration_provider;
 }
 /// <summary>
 /// Instantiates a new instance of the <see cref="SimpleMigrator{TDatabase, TMigrationBase}"/> class
 /// </summary>
 /// <param name="migrationProvider">Migration provider to use to find migration classes</param>
 /// <param name="databaseProvider">Database provider to use to interact with the version table, etc</param>
 /// <param name="logger">Logger to use to log progress and messages</param>
 public SimpleMigrator(
     IMigrationProvider migrationProvider,
     IDatabaseProvider <TConnection> databaseProvider,
     ILogger logger = null)
 {
     this.MigrationProvider = migrationProvider ?? throw new ArgumentNullException(nameof(migrationProvider));
     this.DatabaseProvider  = databaseProvider ?? throw new ArgumentNullException(nameof(databaseProvider));
     this.Logger            = logger;
 }
예제 #10
0
 /// <summary>
 /// Gets the providers supported by this Adapter.
 /// </summary>
 /// <param name="serviceType">IAnalysisProvider, IMigrationProvider, or ILinkProvider</param>
 /// <returns></returns>
 public object GetService(Type serviceType)
 {
     if (serviceType == typeof(IAnalysisProvider))
     {
         if (m_analysisProvider == null)
         {
             m_analysisProvider = new ClearQuestAnalysisProvider();
         }
         return(m_analysisProvider);
     }
     else if (serviceType == typeof(IMigrationProvider))
     {
         if (m_migrationProvider == null)
         {
             m_migrationProvider = new ClearQuestMigrationProvider();
         }
         return(m_migrationProvider);
     }
     else if (serviceType == typeof(ILinkProvider))
     {
         if (m_linkProvider == null)
         {
             m_linkProvider = new ClearQuestLinkProvider();
         }
         return(m_linkProvider);
     }
     else if (serviceType == typeof(IWITDiffProvider))
     {
         if (m_witDiffProvider == null)
         {
             m_witDiffProvider = new ClearQuestDiffProvider();
         }
         return(m_witDiffProvider);
     }
     else if (serviceType == typeof(ISyncMonitorProvider))
     {
         if (m_syncMonitorProvider == null)
         {
             m_syncMonitorProvider = new ClearQuestSyncMonitorProvider();
         }
         return(m_syncMonitorProvider);
     }
     else if (serviceType == typeof(IAddin))
     {
         if (m_userIdLookupAddin == null)
         {
             m_userIdLookupAddin = new ClearQuestUserIdLookupAddin();
         }
         return(m_userIdLookupAddin);
     }
     else
     {
         return(null);
     }
 }
 /// <summary>
 /// Return a service based on serviceType.
 /// </summary>
 /// <param name="serviceType"></param>
 /// <returns></returns>
 public object GetService(Type serviceType)
 {
     if (serviceType == typeof(IAnalysisProvider))
     {
         if (m_analysisProvider == null)
         {
             m_analysisProvider = new TfsFileSystemAnalysisProvider();
         }
         return(m_analysisProvider);
     }
     else if (serviceType == typeof(IServerPathTranslationService))
     {
         if (m_serverPathTranslationProvider == null)
         {
             m_serverPathTranslationProvider = new TfsFileSystemTranslationService();
         }
         return(m_serverPathTranslationProvider);
     }
     else if (serviceType == typeof(IMigrationProvider))
     {
         if (m_migrationProvider == null)
         {
             m_migrationProvider = new TfsFileSystemMigrationProvider();
         }
         return(m_migrationProvider);
     }
     else if (serviceType == typeof(IVCDiffProvider))
     {
         if (m_diffProvider == null)
         {
             m_diffProvider = new TfsFileSystemDiffProvider();
         }
         return(m_diffProvider);
     }
     else if (serviceType == typeof(ISyncMonitorProvider))
     {
         if (m_syncMonitorProvider == null)
         {
             m_syncMonitorProvider = new TfsFileSystemSyncMonitorProvider();
         }
         return(m_syncMonitorProvider);
     }
     else if (serviceType == typeof(IMigrationItemSerializer))
     {
         if (m_migrationItemSerializer == null)
         {
             m_migrationItemSerializer = new TfsFileSystemMigrationItemSerializer();
         }
         return(m_migrationItemSerializer);
     }
     return(null);
 }
예제 #12
0
        public virtual object GetService(Type serviceType)
        {
            if (serviceType == typeof(IAnalysisProvider))
            {
                if (m_analysisProvider == null)
                {
                    m_analysisProvider = new Tfs2010WitAnalysisProvider();
                }
                return(m_analysisProvider);
            }

            if (serviceType == typeof(IMigrationProvider))
            {
                if (m_migrationProvider == null)
                {
                    m_migrationProvider = new Tfs2010WitMigrationProvider();
                }
                return(m_migrationProvider);
            }

            if (serviceType == typeof(ILinkProvider))
            {
                if (m_linkProvider == null)
                {
                    m_linkProvider = new Tfs2010LinkProvider();
                }
                return(m_linkProvider);
            }

            if (serviceType == typeof(IWITDiffProvider))
            {
                if (m_witDiffProvider == null)
                {
                    m_witDiffProvider = new TfsWITDiffProvider();
                }
                return(m_witDiffProvider);
            }

            if (serviceType == typeof(ISyncMonitorProvider))
            {
                if (m_syncMonitorProvider == null)
                {
                    m_syncMonitorProvider = new TfsWITSyncMonitorProvider();
                }
                return(m_syncMonitorProvider);
            }

            return(null);
        }
예제 #13
0
        public object GetService(Type serviceType)
        {
            if (serviceType == typeof(IAnalysisProvider))
            {
                if (m_analysisProvider == null)
                {
                    m_analysisProvider = new TfsVCAnalysisProvider();
                }
                return(m_analysisProvider);
            }
            else if (serviceType == typeof(IMigrationProvider))
            {
                if (m_migrationProvider == null)
                {
                    m_migrationProvider = new TfsVCMigrationProvider();
                }
                return(m_migrationProvider);
            }
            else if (serviceType == typeof(IVCDiffProvider))
            {
                if (m_vcDiffProvider == null)
                {
                    m_vcDiffProvider = new TfsVCDiffProvider();
                }
                return(m_vcDiffProvider);
            }
            else if (serviceType == typeof(IServerPathTranslationService))
            {
                if (m_serverPathTranslationProvider == null)
                {
                    m_serverPathTranslationProvider = new TFSVCServerPathTranslationService();
                }
                return(m_serverPathTranslationProvider);
            }
            else if (serviceType == typeof(ISyncMonitorProvider))
            {
                if (m_syncMonitorProvider == null)
                {
                    m_syncMonitorProvider = new TfsVCSyncMonitorProvider();
                }
                return(m_syncMonitorProvider);
            }

            return(null);
        }
 /// <summary>
 /// Return a service based on serviceType.
 /// </summary>
 /// <param name="serviceType"></param>
 /// <returns></returns>
 public object GetService(Type serviceType)
 {
     if (serviceType == typeof(IAnalysisProvider))
     {
         if (m_analysisProvider == null)
         {
             m_analysisProvider = new ClearCaseSelectedHistoryAnalysisProvider(true);
         }
         return(m_analysisProvider);
     }
     else if (serviceType == typeof(IServerPathTranslationService))
     {
         if (m_serverPathTranslationProvider == null)
         {
             m_serverPathTranslationProvider = new CCTranslationService();
         }
         return(m_serverPathTranslationProvider);
     }
     else if (serviceType == typeof(IMigrationProvider))
     {
         if (m_migrationProvider == null)
         {
             m_migrationProvider = new ClearCaseMigrationProvider(new TfsFileSystemMigrationItemSerializer(), "HWMLastSyncedTfsChangeset");
         }
         return(m_migrationProvider);
     }
     else if (serviceType == typeof(IVCDiffProvider))
     {
         if (m_diffProvider == null)
         {
             m_diffProvider = new ClearCaseDiffProvider();
         }
         return(m_diffProvider);
     }
     else if (serviceType == typeof(ISyncMonitorProvider))
     {
         if (m_syncMonitorProvider == null)
         {
             m_syncMonitorProvider = (ISyncMonitorProvider)m_analysisProvider.GetService(typeof(ISyncMonitorProvider));
         }
         return(m_syncMonitorProvider);
     }
     return(null);
 }
예제 #15
0
 /// <summary>
 /// Return a service based on serviceType.
 /// </summary>
 /// <param name="serviceType"></param>
 /// <returns></returns>
 public object GetService(Type serviceType)
 {
     if (serviceType == typeof(IAnalysisProvider))
     {
         if (m_analysisProvider == null)
         {
             m_analysisProvider = new ClearCaseAnalysisProvider();
         }
         return(m_analysisProvider);
     }
     else if (serviceType == typeof(IServerPathTranslationService))
     {
         if (m_serverPathTranslationProvider == null)
         {
             m_serverPathTranslationProvider = new CCTranslationService();
         }
         return(m_serverPathTranslationProvider);
     }
     else if (serviceType == typeof(IMigrationProvider))
     {
         if (m_migrationProvider == null)
         {
             m_migrationProvider = new ClearCaseMigrationProvider();
         }
         return(m_migrationProvider);
     }
     else if (serviceType == typeof(IVCDiffProvider))
     {
         if (m_diffProvider == null)
         {
             m_diffProvider = new ClearCaseDiffProvider();
         }
         return(m_diffProvider);
     }
     else if (serviceType == typeof(ISyncMonitorProvider))
     {
         if (m_syncMonitorProvider == null)
         {
             m_syncMonitorProvider = new ClearCaseSyncMonitorProvider();
         }
         return(m_syncMonitorProvider);
     }
     return(null);
 }
예제 #16
0
 public MigrationViewer(Configuration configuration, IMigrationProvider migration_provider)
 {
     _migration_provider = migration_provider;
     _configuration = configuration;
 }
예제 #17
0
 public MigrationRunner(IMigrationProvider migrationProvider, IMigrationLog migrationLog, IMigrationSynchronizationContext synchronizationContext)
     : this(migrationProvider, migrationLog, synchronizationContext, new ReflectionActivator <IMigration>())
 {
 }
예제 #18
0
 public MigrationViewer(Configuration configuration, IMigrationProvider migration_provider)
 {
     _migration_provider = migration_provider;
     _configuration      = configuration;
 }
 internal MigrationContext(IServiceContainer tookitServiceContainer, IMigrationProvider migrationProvider)
 {
     TookitServiceContainer = tookitServiceContainer;
 }
예제 #20
0
        static int Main(string[] args)
        {
            try {
                _settings           = Settings.Load();
                _file_writer        = new FileWriter();
                _configuration      = new Configuration(args);
                _sql_formatter      = new SQLServerFormatter(_configuration, _settings);
                _database_provider  = new SQLDatabaseProvider(_configuration, _settings, _sql_formatter);
                _migration_provider = new JsonFileMigrationProvider(_configuration, _settings, _database_provider);


                if (_configuration.WriteHelp)
                {
                    _humpback_command = new Help(_configuration);
                }
                else if (_configuration.Generate)
                {
                    Console.WriteLine("current project: " + _settings.CurrentProject);
                    _settings.EnsureDirectories();
                    _humpback_command = new Generator(_configuration, _settings, _file_writer);
                }
                else if (_configuration.List)
                {
                    _settings.EnsureDirectories();
                    _humpback_command = new MigrationViewer(_configuration, _migration_provider);
                }
                else if (_configuration.File)
                {
                    _settings.EnsureDirectories();
                    _humpback_command = new SourceEditor(_configuration, _migration_provider, new MigrationViewer(_configuration, _migration_provider));
                }
                else if (_configuration.Migrate)
                {
                    Console.WriteLine("current project: " + _settings.CurrentProject);
                    _settings.EnsureDirectories();
                    _humpback_command = new Migrate(_configuration, _database_provider, _migration_provider);
                }
                else if (_configuration.Sql)
                {
                    Console.WriteLine("current project: " + _settings.CurrentProject);
                    _settings.EnsureDirectories();
                    _humpback_command = new GenerateSQL(_configuration, _settings, _sql_formatter, _file_writer, _migration_provider);
                }
                else if (_configuration.Env)
                {
                    _humpback_command = new SettingsActions(_configuration, _settings);
                }

                _humpback_command.Execute();
            } catch (Exception e)  {
                Console.WriteLine(e.Message);
                if (_configuration != null && _configuration.Verbose)
                {
                    Console.WriteLine(e.ToString());
                }

                if (Debugger.IsAttached)
                {
                    Console.ReadLine();
                }
                return(-1);
            }
            if (Debugger.IsAttached)
            {
                Console.ReadLine();
            }
            return(0);
        }
예제 #21
0
 public SourceEditor(Configuration configuration, IMigrationProvider migration_provider, MigrationViewer viewer)
 {
     _migration_provider = migration_provider;
     _configuration      = configuration;
     list_viewer         = viewer;
 }
예제 #22
0
 public SourceEditor(Configuration configuration, IMigrationProvider migration_provider, MigrationViewer viewer)
 {
     _migration_provider = migration_provider;
     _configuration = configuration;
     list_viewer = viewer;
 }
예제 #23
0
        public async Task <IEnumerable <MigrationHistory> > ExecuteAsync(IMigrationProvider provider, CancellationToken cancellationToken = default)
        {
            // Find starting point.
            await using var latest = await provider.GetLatestAsync(cancellationToken);

            if (latest == null)
            {
                this.logger.LogWarning("No any available migrations to apply.");
                return(Enumerable.Empty <MigrationHistory>());
            }

            var histories = await this.connection.ListHistoryAsync(latest.Version.Major, cancellationToken);

            var current = histories.LastOrDefault();

            if (current != null)
            {
                // Make sure the latest migration to apply is really latest.
                if ((await this.connection.ListHistoryAsync(latest.Version.Major + 1, cancellationToken)).Any() || current.Version > latest.Version)
                {
                    this.logger.LogWarning("Cannot apply the latest migration {Latest} due to the database is already applied by newer version.", latest);
                    return(Enumerable.Empty <MigrationHistory>());
                }

                if (current.Version == latest.Version)
                {
                    this.logger.LogInformation("The database is already in the latest version {Current}.", current.Version);
                    return(Enumerable.Empty <MigrationHistory>());
                }
            }
            else
            {
                // Find the latest major version of the database.
                for (var i = latest.Version.Major - 1; i >= 0; i--)
                {
                    histories = await this.connection.ListHistoryAsync(i, cancellationToken);

                    if (histories.Any())
                    {
                        break;
                    }
                }

                current = histories.LastOrDefault();
            }

            // Execute migrations.
            var result = new List <MigrationHistory>();

            if (current == null)
            {
                this.logger.LogInformation("No any migrations have been applied to the database yet.");
            }
            else
            {
                this.logger.LogInformation("The current database version is {Current}.", current.Version);
            }

            for (; ;)
            {
                // Find next migration.
                IMigration?migration;

                if (current == null)
                {
                    // The database is a brand new.
                    migration = (await provider.GetAsync(new(0, 0), cancellationToken)) !;
                }
                else if (current.Version.Minor == 0)
                {
                    // The database is in the first (0) minor version. We are safe to jump to next major version to speed up.
                    migration = await provider.GetAsync(current.Version.IncreaseMajor(), cancellationToken);

                    if (migration == null)
                    {
                        // No next major version is available, switch to next minor version instead.
                        migration = await provider.GetAsync(current.Version.IncreaseMinor(), cancellationToken);

                        if (migration == null)
                        {
                            // No more migrations.
                            break;
                        }
                    }
                }
                else
                {
                    // The database is in the middle of major version. Apply all remaining minor versions.
                    migration = await provider.GetAsync(current.Version.IncreaseMinor(), cancellationToken);

                    if (migration == null)
                    {
                        // No more minor versions. Try to skip the next major version if it is possible to speed up.
                        migration = await provider.GetAsync(current.Version.IncreaseMajor().IncreaseMajor(), cancellationToken);

                        if (migration == null)
                        {
                            // The next major version is the latest one. Apply all its minor versions.
                            migration = await provider.GetAsync(new(current.Version.Major + 1, 1), cancellationToken);

                            if (migration == null)
                            {
                                // No more migrations.
                                break;
                            }
                        }
                    }
                }

                // Execute migration.
                await using (migration)
                {
                    this.logger.LogInformation("Applying migration: {Migration}", migration);

                    foreach (var statement in await migration.ListStatementAsync(cancellationToken))
                    {
                        await this.connection.ExecuteMigrationAsync(statement);
                    }

                    current = new MigrationHistory(migration.Version, DateTime.Now);
                }

                await this.connection.CreateHistoryAsync(current);

                result.Add(current);
            }

            this.logger.LogInformation("{Count} migration(s) has been applied successfully.", result.Count);

            return(result);
        }
예제 #24
0
 public Migrate(ConfigurationOptions.Configuration configuration, IDatabaseProvider database_provider, IMigrationProvider migration_provider)
 {
     _configuration      = configuration;
     _database_provider  = database_provider;
     _migration_provider = migration_provider;
 }