Example #1
0
        public void ShouldRetrieveCurrentVersionFromDatabaseForComparison()
        {
            // Arrange
            var command = CreateCommand();

            var version1 = CreateVersionWithTask("1.1", "Task 1");

            archive.Setup(a => a.Versions).Returns(new[] { version1.Object });

            var versionObject = version1.Object.Version;

            var expectedVersion = new ClassicVersion("1.1");

            versionProvider.Setup(p => p.GetVersion(this.session.Object, versionObject)).Returns(expectedVersion);

            // Act
            command.Execute(new string[] { });

            // Assert
            VersionBase actualVersion = null;

            versionProvider.Verify(
                v =>
                v.HasExecutedScript(It.Is <VersionBase>(vo => CatchVersion(vo, out actualVersion)), It.IsAny <VersionBase>(),
                                    It.IsAny <IDatabaseTask>()));

            Assert.Same(expectedVersion, actualVersion);
        }
        /// <summary>
        /// Gets the specified version from the database.
        /// </summary>
        /// <param name="session">The database connection.</param>
        /// <param name="version">The version to get.</param>
        /// <returns>The version or null if the version has not been installed in the database.</returns>
        public VersionBase GetVersion(ISession session, VersionBase version)
        {
            var classicVersion = version as ClassicVersion;

            return
                (session.QueryOver <ClassicVersion>().Where(v => v.Version == classicVersion.Version).SingleOrDefault());
        }
        /// <summary>
        /// Inserts the specified version into the version table.
        /// </summary>
        /// <param name="version">The version to insert.</param>
        /// <param name="session">The database connection.</param>
        public void InsertVersion(VersionBase version, ISession session)
        {
            ClassicVersion classicVersion = version as ClassicVersion;

            if (!classicVersion.CreatedOn.HasValue)
            {
                classicVersion.CreatedOn = DateTime.UtcNow;
            }
            classicVersion.UpdatedOn = DateTime.UtcNow;
            session.SaveOrUpdate(version);
        }
        public void InsertVersion(VersionBase version, ISession session)
        {
            NumericVersion numericVersion = version as NumericVersion;

            if (!numericVersion.CreatedOn.HasValue)
            {
                numericVersion.CreatedOn = DateTime.UtcNow;
            }
            numericVersion.UpdatedOn = DateTime.UtcNow;
            session.SaveOrUpdate(version);
        }
        private void AddAllTasks(IDatabaseArchive archive, ITaskExecuter executer, VersionBase targetVersion, ISession session, bool targetVersionSpecified)
        {
            // If we're executing missing tasks, we need to go through each version and check whether any tasks are missing
            // In this case, if the target version is specified, we only look in that version
            var versions =
                archive.Versions.OrderBy(v => v.Version, this.VersionProvider.GetComparer())
                .Where(
                    v =>
                    !targetVersionSpecified || this.VersionProvider.GetComparer().Compare(targetVersion, v.Version) == 0);

            this.AddTasksForVersions(executer, versions, session);
        }
        /// <summary>
        /// Returns whether a script belongs to the current version and if so whether it has already been executed
        /// </summary>
        /// <param name="currentVersion"></param>
        /// <param name="targetVersion"></param>
        /// <param name="task"></param>
        /// <returns></returns>
        public bool HasExecutedScript(VersionBase currentVersion, VersionBase targetVersion, IDatabaseTask task)
        {
            if (currentVersion != null)
            {
                ClassicVersion currentClassicVersion = currentVersion as ClassicVersion;
                ClassicVersion targetClassicVersion  = targetVersion as ClassicVersion;
                if (currentClassicVersion.SystemVersion.Equals(targetClassicVersion.SystemVersion))
                {
                    return(currentClassicVersion.HasExecutedTask(task));
                }
            }

            return(false);
        }
        public bool HasExecutedScript(VersionBase currentVersion, VersionBase targetVersion, IDatabaseTask task)
        {
            if (currentVersion != null)
            {
                NumericVersion currentNumericVersion = currentVersion as NumericVersion;
                NumericVersion targetNumericVersion  = targetVersion as NumericVersion;
                if (currentNumericVersion.Version.Equals(targetNumericVersion.Version))
                {
                    return(currentNumericVersion.HasExecutedTask(task));
                }
            }

            return(false);
        }
Example #8
0
        /// <summary>
        /// Writes the specified version.
        /// </summary>
        /// <param name='version'>
        /// The version to write.
        /// </param>
        /// <param name='arguments'>
        /// The command arguments.
        /// </param>
        private void WriteVersion(VersionBase version, HistoryArguments arguments)
        {
            string versionString = string.Format(
                "{0} Installed - {1}, Updated - {2}",
                version.VersionText,
                version.CreatedOnLocal,
                version.UpdatedOnLocal);

            this.MessageService.WriteLine(versionString);

            if (arguments.ShowTasks)
            {
                this.WriteTasks(version, arguments.SortOrder);
            }
        }
Example #9
0
        protected override void OnInitializing()
        {
            //保证下次从主目录启动
            VersionBase.RegApp();

            //更新其他的文件
            var file = DirectoryEx.Update.GetFile("package.xml");

            if (file != null)
            {
                XElement xe = XElement.Load(file.FullName);
                UpdateFiles(xe, DirectoryEx.Root, true);
            }
            UnzipExts();
        }
 public Boolean Equals(VersionBase <TValue> version)
 {
     if (ReferenceEquals(version, null))
     {
         return(false);
     }
     if (ReferenceEquals(version, this))
     {
         return(true);
     }
     return(Id == version.Id &&
            VersionedId == version.VersionedId &&
            Added == version.Added &&
            ValueEqualityComparer.Equals(Value, version.Value));
 }
Example #11
0
        private void AddNewTasks(IDatabaseArchive archive, ITaskExecuter executer, VersionBase currentVersion,
                                 VersionBase targetVersion, ISession session)
        {
            IEnumerable <IDatabaseVersion> versionsToExecute = archive.Versions
                                                               .OrderBy(v => v.Version, this.VersionProvider.GetComparer())
                                                               .Where(
                v =>
                currentVersion == null ||
                this.VersionProvider.GetComparer()
                .Compare(currentVersion, v.Version) <= 0)
                                                               .TakeWhile(
                v =>
                this.VersionProvider.GetComparer()
                .Compare(targetVersion, v.Version) >= 0);

            this.AddTasksForVersions(executer, versionsToExecute, session);
        }
Example #12
0
        public IDatabaseVersion Read(Stream stream, string manifestPath, IDatabaseArchive archive)
        {
            Validate.NotNull(() => stream);
            Validate.NotNull(() => manifestPath);
            Validate.NotNull(() => archive);

            XmlReader reader = XmlReader.Create(stream);

            reader.MoveToContent();
            XElement element = XElement.ReadFrom(reader) as XElement;

            string      versionString = element.Attributes().First(a => a.Name == "version").Value;
            VersionBase version       = this.VersionProvider.CreateVersion(versionString);

            DatabaseVersion databaseVersion = new DatabaseVersion(version, manifestPath, archive);

            databaseVersion.Tasks = CreateTasks(element, databaseVersion);

            return(databaseVersion);
        }
Example #13
0
        /// <summary>
        /// Execute the command with the specified arguments.
        /// </summary>
        /// <param name='args'>
        /// The arguments.
        /// </param>
        /// <returns>Returns the result of Executing the Command</returns>
        protected override bool Execute(string[] args, HistoryArguments arguments, dbversion.Archives.IDatabaseArchive archive)
        {
            VersionBase requiredVersion = null;

            if (!string.IsNullOrEmpty(arguments.Version))
            {
                requiredVersion = this.VersionProvider.CreateVersion(arguments.Version);
            }

            using (var sessionFactory = this.SessionFactoryProvider.CreateSessionFactory())
            {
                using (var session = sessionFactory.OpenSession())
                {
                    using (var transaction = session.BeginTransaction())
                    {
                        if (!this.VersionProvider.VersionTableExists(session))
                        {
                            this.MessageService.WriteLine("No versions are currently installed.");
                            return(false);
                        }

                        var sortedVersions = this.GetSortedVersions(arguments, requiredVersion, session);

                        if (sortedVersions.Count() == 0 && requiredVersion != null)
                        {
                            this.MessageService.WriteLine(
                                string.Format("The specified version, {0}, was not found.", arguments.Version));
                            return(false);
                        }

                        foreach (var version in sortedVersions)
                        {
                            this.WriteVersion(version, arguments);
                        }

                        transaction.Commit();
                    }
                }
            }
            return(true);
        }
Example #14
0
        /// <summary>
        /// Checks whether all the tasks in the specified version have been run.
        /// </summary>
        /// <param name="version">The database version.</param>
        /// <param name="installedVersion">The current installed version.</param>
        /// <returns>true if all the tasks have been installed, otherwise false.</returns>
        private bool CheckTasks(IDatabaseVersion version, VersionBase installedVersion)
        {
            bool hasOutputVersion  = false;
            bool allTasksInstalled = true;

            foreach (var task in version.Tasks)
            {
                if (!this.VersionProvider.HasExecutedScript(installedVersion, version.Version, task))
                {
                    if (!hasOutputVersion)
                    {
                        this.MessageService.WriteLine(string.Format("Version {0} missing:", version.Version.VersionText));
                        hasOutputVersion = true;
                    }

                    this.MessageService.WriteLine("  " + task.FileName);
                    allTasksInstalled = false;
                }
            }

            return(allTasksInstalled);
        }
Example #15
0
        /// <summary>
        /// Writes the tasks.
        /// </summary>
        /// <param name='version'>
        /// The version containing the tasks.
        /// </param>
        /// <param name='sortOrder'>
        /// The order to write the tasks in.
        /// </param>
        private void WriteTasks(VersionBase version, HistoryOrder sortOrder)
        {
            IEnumerable <Task> sortedTasks;

            if (sortOrder == HistoryOrder.asc || sortOrder == HistoryOrder.Ascending)
            {
                sortedTasks = version.Tasks.OrderBy(t => t.ExecutionOrder);
            }
            else
            {
                sortedTasks = version.Tasks.OrderByDescending(t => t.ExecutionOrder);
            }

            foreach (var task in sortedTasks)
            {
                string taskString = string.Format(
                    "  {0} - {1}",
                    task.Name,
                    task.UpdatedOnLocal);

                this.MessageService.WriteLine(taskString);
            }
        }
Example #16
0
 private bool CatchVersion(VersionBase input, out VersionBase actualVersion)
 {
     actualVersion = input;
     return(true);
 }
Example #17
0
 private void AddTasksToExecuter(IDatabaseArchive archive, ITaskExecuter executer, VersionBase currentVersion, VersionBase targetVersion, bool executeMissingTasks, ISession session, bool targetVersionSpecified)
 {
     if (executeMissingTasks)
     {
         this.AddAllTasks(archive, executer, targetVersion, session, targetVersionSpecified);
     }
     else
     {
         this.AddNewTasks(archive, executer, currentVersion, targetVersion, session);
     }
 }
Example #18
0
        /// <summary>
        /// Gets the versions sorted in the correct order.
        /// </summary>
        /// <returns>
        /// The sorted versions.
        /// </returns>
        /// <param name='arguments'>
        /// The command arguments.
        /// </param>
        /// <param name='session'>
        /// The NHibernate session.
        /// </param>
        private IEnumerable <VersionBase> GetSortedVersions(HistoryArguments arguments, VersionBase version, NHibernate.ISession session)
        {
            var versions = this.VersionProvider.GetAllVersions(session);

            if (arguments.SortOrder == HistoryOrder.asc || arguments.SortOrder == HistoryOrder.Ascending)
            {
                versions = versions.OrderBy(v => v, this.VersionProvider.GetComparer());
            }
            else
            {
                versions = versions.OrderByDescending(v => v, this.VersionProvider.GetComparer());
            }

            if (version != null)
            {
                return(versions.Where(v => object.Equals(v, version)));
            }

            return(versions);
        }
Example #19
0
 public InsertVersionTask(IVersionProvider versionProvider, VersionBase version, IMessageService messageService)
     : base(String.Empty, -1, messageService)
 {
     this._versionProvider = versionProvider;
     this._version         = version;
 }
Example #20
0
        /// <summary>
        /// Creates a database at the specified version or upgrades the existing database to the specified version.
        /// </summary>
        /// <param name="archive">The archive containing the tasks to run.</param>
        /// <param name="version">The version of database to create.</param>
        /// <param name="executer">The object used to execute the tasks.</param>
        /// <param name="commit">true if any changes should be committed, false if they should be rolled back.</param>
        /// <param name="executeMissingTasks">true if any missing tasks detected should be executed, otherwise false.</param>
        /// <returns>Returns the result of Executing the Command</returns>
        /// <exception cref="VersionNotFoundException">
        /// Thrown if the version to create could not be found.
        /// </exception>
        /// <exception cref="TaskExecutionException">
        /// Thrown if an error occurs while executing one of the tasks in the archive.
        /// </exception>
        public bool Create(IDatabaseArchive archive, string version, ITaskExecuter executer, bool commit, bool executeMissingTasks)
        {
            using (var sessionFactory = this.SessionFactoryProvider.CreateSessionFactory())
            {
                using (var session = sessionFactory.OpenSession())
                {
                    // Set the session to always flush to make sure we execute everything
                    // in order
                    session.FlushMode = NHibernate.FlushMode.Always;

                    using (var transaction = session.BeginTransaction())
                    {
                        LogUpdateStart();

                        if (!this.VersionProvider.VersionTableExists(session))
                        {
                            this.VersionProvider.CreateVersionTable(session);
                        }

                        VersionBase currentVersion = this.VersionProvider.GetCurrentVersion(session);

                        //Log the current version
                        MessageService.WriteLine(currentVersion == null
                                                     ? "Current Database Version Unknown"
                                                     : string.Format("Current Database Version: {0}", currentVersion));

                        VersionBase targetVersion;
                        bool        targetVersionSpecified = !string.IsNullOrEmpty(version);
                        if (!targetVersionSpecified)
                        {
                            targetVersion = archive.Versions
                                            .OrderByDescending(v => v.Version, this.VersionProvider.GetComparer())
                                            .First()
                                            .Version;
                        }
                        else
                        {
                            targetVersion = this.VersionProvider.CreateVersion(version);
                        }

                        MessageService.WriteLine(string.Format("Target Version: {0}", targetVersion));

                        if (!archive.ContainsVersion(targetVersion))
                        {
                            MessageService.WriteLine(string.Format("Target Version Not Found in Archive"));
                            throw new VersionNotFoundException(targetVersion);
                        }

                        this.AddTasksToExecuter(archive, executer, currentVersion, targetVersion, executeMissingTasks,
                                                session, targetVersionSpecified);

                        executer.ExecuteTasks(session);

                        if (commit)
                        {
                            transaction.Commit();
                        }
                        else
                        {
                            transaction.Rollback();
                        }

                        LogUpdateComplete(commit);
                    }
                }
            }
            return(true);
        }
        public VersionBase GetVersion(ISession session, VersionBase requiredVersion)
        {
            var numericVersion = requiredVersion as NumericVersion;

            return(session.QueryOver <NumericVersion>().Where(v => v.Version == numericVersion.Version).SingleOrDefault());
        }