Beispiel #1
0
        /// <summary>
        ///     Проверяет параметры инициализации
        /// </summary>
        /// <param name="options">Параметры командной строки</param>
        private static bool CheckInitOptions(DbManagerOptions options)
        {
            if (!options.IsOneActionSelected)
            {
                Logger.Info("Не выбрано не одной или выбрано более чем одна операция.");
                return(false);
            }

            if (options.Backup || options.RestoreBackup)
            {
                if (String.IsNullOrEmpty(options.BackupDirPath))
                {
                    Logger.Info("Не указан путь к директории где должен храниться бэкап данных БД.");
                    return(false);
                }
            }

            Logger.Info(options.GetLogMessage());

            if (ConfigurationManager.ConnectionStrings.Count == 0)
            {
                Logger.Info("Не обнаружено строк подключения");
                return(false);
            }

            Logger.Info("Cтроки подключения:");

            foreach (var connectionString in ConfigurationManager.ConnectionStrings)
            {
                Logger.Info(connectionString.ToString());
            }

            return(true);
        }
Beispiel #2
0
        private static void ShowAll(DbManagerOptions options)
        {
            var migrator = new DbMigrator(new TMigrationConfig());

            Logger.Info("Возможный следующие миграции:");
            migrator.GetLocalMigrations().ForEach(m => Logger.Info(m));

            Logger.Info("Миграции примененные к базе данных:");
            migrator.GetDatabaseMigrations().ForEach(m => Logger.Info(m));
        }
Beispiel #3
0
        private static void RestoreBackupDatabase(DbManagerOptions options)
        {
            Logger.Info("Восстановление данных БД из бэкапа: ");

            if (!Directory.Exists(options.BackupDirPath))
            {
                Logger.Error(String.Format("Указанная директория {0} не существует", options.BackupDirPath));
                return;
            }

            using (var context = new TContext())
            {
                var sqlConnectionStringBuilder = new SqlConnectionStringBuilder(context.Database.Connection.ConnectionString)
                {
                    InitialCatalog = "master"
                };

                var connectionString = sqlConnectionStringBuilder.ToString();

                var connection = new SqlConnection(connectionString);

                var databaseName           = context.Database.Connection.Database.Replace("[", "[[").Replace("]", "]]");
                var backupPathWithFileName = Path.Combine(options.BackupDirPath, String.Format("{0}.bak", databaseName));

                Logger.Info("Путь к бэкапу {0}", backupPathWithFileName);

                var commandBuilder = new StringBuilder(@" use master ");

                commandBuilder.AppendFormat(@"RESTORE DATABASE [{0}]
                                                           FROM DISK = '{1}' 
                                                        WITH REPLACE;

                                                        ALTER DATABASE [{0}] SET MULTI_USER ", databaseName, backupPathWithFileName);

                var command = connection.CreateCommand();

                if (options.CommandTimeoutInSeconds.HasValue)
                {
                    command.CommandTimeout = options.CommandTimeoutInSeconds.Value;
                }

                command.CommandText = commandBuilder.ToString();
                try
                {
                    connection.Open();
                    command.ExecuteNonQuery();
                }
                finally
                {
                    connection.Close();
                }
                Logger.Info("Данные БД успешно восстановлены из бэкапа");
            }
        }
Beispiel #4
0
        /// <summary>
        /// </summary>
        private static void BackupDatabase(DbManagerOptions options)
        {
            Logger.Info("Создание бэкапа данных БД: ");

            if (!Directory.Exists(options.BackupDirPath))
            {
                Directory.CreateDirectory(options.BackupDirPath);
            }

            using (var context = new TContext())
            {
                if (context.Database.Exists())
                {
                    var connection   = context.Database.Connection;
                    var databaseName = connection.Database.Replace("[", "[[").Replace("]", "]]");

                    var backupPathWithFileName = Path.Combine(options.BackupDirPath, String.Format("{0}.bak", databaseName));
                    var commandText            = string.Format(@" use master 
                                                        BACKUP DATABASE [{0}]
                                                        TO DISK = '{1}'
                                                           WITH FORMAT,
                                                              MEDIANAME = '{2}',
                                                              NAME = '{2}';", databaseName, backupPathWithFileName, databaseName);
                    var command = connection.CreateCommand();

                    if (options.CommandTimeoutInSeconds.HasValue)
                    {
                        command.CommandTimeout = options.CommandTimeoutInSeconds.Value;
                    }

                    command.CommandText = commandText;
                    try
                    {
                        connection.Open();
                        command.ExecuteNonQuery();
                    }
                    finally
                    {
                        connection.Close();
                    }
                    Logger.Info("Бэкап данных БД создан успешно");
                }
                else
                {
                    Logger.Info("База данных не обнаружена");
                }
            }
        }
Beispiel #5
0
        /// <summary>
        ///     Установка миграций
        /// </summary>
        /// <param name="options">Опции командной строки</param>
        private static void UpdateDatabase(DbManagerOptions options)
        {
            Logger.Info("Обновление БД : ");

            var migrator = new DbMigrator(new TMigrationConfig());

            migrator.SeedEnabled        = options.SeedEnabled;
            migrator.SeedForTestEnabled = options.SeedForTestEnabled;

            var migrationIdProvider = new MigrationIdProvider();

            var targetMigrationId = migrationIdProvider.GetMigrationId(migrator, options.Version, options.Migration, false);

            migrator.Update(targetMigrationId);

            Logger.Info("Успешно проведено обновление до миграции {0}", targetMigrationId);
        }
Beispiel #6
0
        /// <summary>
        ///     Проверяет установленные миграции исходя из параметров командной строки
        /// </summary>
        /// <param name="options">Опции командной строки</param>
        /// <returns>Результат проверки миграций</returns>
        private static string Check(DbManagerOptions options)
        {
            Logger.Info("Проверка установленных миграций : ");

            var migrationChecker = new MigrationChecker <TContext>(new TMigrationConfig());

            if (!string.IsNullOrEmpty(options.Migration))
            {
                return(migrationChecker.CheckByMigrationName(options.Migration));
            }

            if (!string.IsNullOrEmpty(options.Version))
            {
                return(migrationChecker.CheckByVersion(options.Version));
            }

            return(migrationChecker.CheckLastMigration());
        }
Beispiel #7
0
        /// <summary>
        ///     Откат базы данных
        /// </summary>
        /// <param name="options">Опции командной строки</param>
        private static void DowngradeDatabase(DbManagerOptions options)
        {
            Logger.Info("Откат БД : ");

            var migrator = new DbMigrator(new TMigrationConfig());

            var migrationIdProvider = new MigrationIdProvider();

            var targetMigrationId = migrationIdProvider.GetMigrationId(migrator, options.Version, options.Migration, true);

            migrator.Downgrade(targetMigrationId);

            Logger.Info(
                string.IsNullOrEmpty(targetMigrationId)
                    ? "Успешно проведен откат к чистой БД"
                    : "Успешно проведен откат к миграции {0}",
                targetMigrationId);
        }
Beispiel #8
0
        public static int Run(string[] args)
        {
            var exitCode = 0;

            var options = new DbManagerOptions();

            Failover.Execute(() =>
            {
                Parser.Default.ParseArguments(args, options);

                if (!CheckInitOptions(options))
                {
                    Logger.Info(options.GetUsage());
                    return;
                }

                if (options.ShowAll)
                {
                    ShowAll(options);
                    return;
                }


                if (options.Backup)
                {
                    BackupDatabase(options);
                    return;
                }

                if (options.RestoreBackup)
                {
                    RestoreBackupDatabase(options);
                    return;
                }

                if (options.Upgrade)
                {
                    UpdateDatabase(options);
                    return;
                }
                if (options.Downgrade)
                {
                    DowngradeDatabase(options);
                    return;
                }
                if (options.Check)
                {
                    Logger.Info(Check(options));
                    return;
                }
                if (options.Recreate)
                {
                    DropDataBase();
                    UpdateDatabase(options);
                }
                if (options.DropDatabase)
                {
                    DropDataBase();
                }
            }, exception => { exitCode = -1; });

            if (options.Wait)
            {
                Console.ReadKey();
            }

            return(exitCode);
        }