Example #1
0
        void ExecuteMicroUpdates()
        {
            Version currentDB;

            if (MainSupport.BaseParameters.All.ContainsKey("micro_updates"))
            {
                currentDB = Version.Parse(MainSupport.BaseParameters.All["micro_updates"]);
            }
            else
            {
                currentDB = Version.Parse(MainSupport.BaseParameters.Version);
            }

            while (DBUpdater.microUpdates.Exists(u => u.Source == currentDB))
            {
                var update = DBUpdater.microUpdates.Find(u => u.Source == currentDB);
                RunOneUpdate(update, String.Format("Устанавливаем микро-обновление {0}", StringWorks.VersionToShortString(update.Destanation)));
                currentDB = update.Destanation;
                MainSupport.BaseParameters.UpdateParameter(
                    QSMain.ConnectionDB,
                    "micro_updates",
                    StringWorks.VersionToShortString(currentDB)
                    );
            }
        }
Example #2
0
        public static void Main(string[] args)
        {
            Application.Init();
            QSMain.SubscribeToUnhadledExceptions();
            QSMain.GuiThread = System.Threading.Thread.CurrentThread;
            QSSupportLib.MainSupport.Init();
            CreateProjectParam();
            // Создаем окно входа
            Login LoginDialog = new Login();

            LoginDialog.Logo = Gdk.Pixbuf.LoadFromResource("BioGorod.Icons.logo.png");
            LoginDialog.SetDefaultNames("BioGorod");
            LoginDialog.DefaultLogin  = "******";
            LoginDialog.DefaultServer = "localhost";
            LoginDialog.UpdateFromGConf();

            ResponseType LoginResult;

            LoginResult = (ResponseType)LoginDialog.Run();
            if (LoginResult == ResponseType.DeleteEvent || LoginResult == ResponseType.Cancel)
            {
                return;
            }

            LoginDialog.Destroy();

            //Настройка базы
            CreateBaseConfig();

            //Настрока удаления
            ConfigureDeletion();

            //Настройка карты
            GMap.NET.MapProviders.GMapProvider.UserAgent = String.Format("{0}/{1} used GMap.Net/{2} ({3})",
                                                                         QSSupportLib.MainSupport.ProjectVerion.Product,
                                                                         StringWorks.VersionToShortString(QSSupportLib.MainSupport.ProjectVerion.Version),
                                                                         StringWorks.VersionToShortString(System.Reflection.Assembly.GetAssembly(typeof(GMap.NET.MapProviders.GMapProvider)).GetName().Version),
                                                                         Environment.OSVersion.VersionString
                                                                         );
            GMap.NET.MapProviders.GMapProvider.Language = GMap.NET.LanguageType.Russian;

            //Запускаем программу
            MainWin = new MainWindow();
            QSMain.ErrorDlgParrent = MainWin;
            if (QSMain.User.Login == "root")
            {
                return;
            }
            MainWin.Show();
            Application.Run();
        }
Example #3
0
        private static void NotAdminErrorAndExit(bool isMicro, Version from, Version to)
        {
            MessageDialog md = new MessageDialog(null, DialogFlags.DestroyWithParent,
                                                 MessageType.Error,
                                                 ButtonsType.Close,
                                                 String.Format(
                                                     "Для работы текущей версии программы необходимо провести{0} обновление базы ({1} -> {2}), " +
                                                     "но у вас нет для этого прав. Зайдите в программу под администратором.",
                                                     isMicro ? " микро" : "",
                                                     StringWorks.VersionToShortString(from),
                                                     StringWorks.VersionToShortString(to)
                                                     ));

            md.Show();
            md.Run();
            md.Destroy();
            Environment.Exit(1);
        }
Example #4
0
        public DBUpdateProcess(UpdateHop hop)
        {
            this.Build();

            updateHop             = hop;
            progressbarTotal.Text = String.Format("Обновление: {0} → {1}",
                                                  StringWorks.VersionToShortString(updateHop.Source),
                                                  StringWorks.VersionToShortString(updateHop.Destanation)
                                                  );

            string fileName = System.IO.Path.Combine(
                Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
                "Резервные копии",
                String.Format("{0}{1:yyMMdd-HHmm}.sql", MainSupport.ProjectVerion.Product, DateTime.Now)
                );

            entryFileName.Text = fileName;
        }
Example #5
0
        protected void OnButtonOkClicked(object sender, EventArgs e)
        {
            try
            {
                if (checkCreateBackup.Active)
                {
                    if (ExecuteBackup())
                    {
                        return;
                    }
                }

                logger.Info("Обновляем базу данных до версии {0}", StringWorks.VersionToShortString(updateHop.Destanation));
                logger.Info("Проверяем все ли микро обновления установленны.");
                ExecuteMicroUpdates();

                logger.Info("Устанавливаем основное обновление.");
                RunOneUpdate(updateHop, String.Format("Обновление базы данных до версии {0}",
                                                      StringWorks.VersionToShortString(updateHop.Destanation)
                                                      ));

                if (MainSupport.BaseParameters.All.ContainsKey("micro_updates"))
                {
                    MainSupport.BaseParameters.RemoveParameter(QSMain.ConnectionDB,
                                                               "micro_updates");
                }

                MainSupport.LoadBaseParameters();

                logger.Info("Доустанавливаем микро обновления.");
                ExecuteMicroUpdates();

                progressbarTotal.Adjustment.Value = progressbarTotal.Adjustment.Upper;
                logger.Info("Обновление до версии {0}, завершено.", StringWorks.VersionToShortString(updateHop.Destanation));
                Success = true;
                Respond(Gtk.ResponseType.Ok);
            }
            catch (Exception ex)
            {
                QSMain.ErrorMessageWithLog("Ошибка при обновлении базы..", logger, ex);
                buttonOk.Sensitive = false;
                return;
            }
        }
Example #6
0
        /// <summary>
        /// Проверяем версию базы. Можно запускать неоднократно, вернет true если есть сообщение.
        /// </summary>
        public static bool Check()
        {
            ResultFlags = CheckBaseResult.Ok;

            if (string.IsNullOrWhiteSpace(MainSupport.BaseParameters.Product))
            {
                ResultFlags |= CheckBaseResult.IncorrectProduct;
                TextMessage  = "Название продукта в базе данных не указано.";
                return(true);
            }

            if (MainSupport.BaseParameters.Product != MainSupport.ProjectVerion.Product)
            {
                ResultFlags |= CheckBaseResult.IncorrectProduct;
                TextMessage  = "База данных от другого продукта.";
                logger.Fatal("База данных от другого продукта. (База: {0} Программа: {1})",
                             MainSupport.BaseParameters.Product,
                             MainSupport.ProjectVerion.Product
                             );
                return(true);
            }

            Version baseVersion;

            if (String.IsNullOrWhiteSpace(MainSupport.BaseParameters.Version) ||
                !Version.TryParse(MainSupport.BaseParameters.Version, out baseVersion))
            {
                ResultFlags |= CheckBaseResult.IncorrectVersion;
                TextMessage  = "Версия базы данных не определена.";
                return(true);
            }

            if (MainSupport.ProjectVerion.Version.Major != baseVersion.Major || MainSupport.ProjectVerion.Version.Minor != baseVersion.Minor)
            {
                TextMessage  = "Версия продукта не совпадает с версией базы данных.\n";
                TextMessage += String.Format("Версия продукта: {0}", StringWorks.VersionToShortString(MainSupport.ProjectVerion.Version));
                TextMessage += "\nВерсия базы данных: " + MainSupport.BaseParameters.Version;

                if (MainSupport.ProjectVerion.Version > baseVersion)
                {
                    ResultFlags |= CheckBaseResult.BaseVersionLess;
                }
                else
                {
                    ResultFlags |= CheckBaseResult.BaseVersionGreater;
                }
                return(true);
            }

            if (String.IsNullOrWhiteSpace(MainSupport.BaseParameters.Edition))
            {
                TextMessage  = "Редакция базы не указана!";
                ResultFlags |= CheckBaseResult.UnsupportEdition;
                return(true);
            }

            if (!MainSupport.ProjectVerion.AllowEdition.Contains(MainSupport.BaseParameters.Edition))
            {
                ResultFlags |= CheckBaseResult.UnsupportEdition;
                TextMessage  = "Редакция базы данных не поддерживается.\n";
                TextMessage += "Редакция продукта: " + MainSupport.ProjectVerion.Edition + "\nРедакция базы данных: " + MainSupport.BaseParameters.Edition;
                return(true);
            }

            return(false);
        }
Example #7
0
        public static void CheckMicroUpdates()
        {
            Version currentDB = new Version();

            if (MainSupport.BaseParameters.All.ContainsKey("micro_updates"))
            {
                currentDB = Version.Parse(MainSupport.BaseParameters.All["micro_updates"]);
            }

            var dbMainVersion = Version.Parse(MainSupport.BaseParameters.Version);

            if (currentDB < dbMainVersion)
            {
                currentDB = dbMainVersion;
            }

            logger.Info("Проверяем микро обновления базы(текущая версия:{0})", StringWorks.VersionToShortString(currentDB));
            var beforeUpdates = currentDB;

            while (microUpdates.Exists(u => u.Source == currentDB))
            {
                var update = microUpdates.Find(u => u.Source == currentDB);

                if (!QSMain.User.Admin)
                {
                    NotAdminErrorAndExit(true, update.Source, update.Destanation);
                }

                logger.Info("Обновляемся до {0}", StringWorks.VersionToShortString(update.Destanation));
                var trans = QSMain.ConnectionDB.BeginTransaction();
                try
                {
                    string sql;
                    using (Stream stream = update.Assembly.GetManifestResourceStream(update.Resource))
                    {
                        if (stream == null)
                        {
                            throw new InvalidOperationException(String.Format("Ресурс {0} указанный в обновлениях не найден.", update.Resource));
                        }
                        StreamReader reader = new StreamReader(stream);
                        sql = reader.ReadToEnd();
                    }

                    var cmd = QSMain.ConnectionDB.CreateCommand();
                    cmd.CommandText = sql;
                    cmd.Transaction = trans;
                    cmd.ExecuteNonQuery();
                    trans.Commit();
                    currentDB = update.Destanation;
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    QSMain.ErrorMessageWithLog("Ошибка при обновлении базы..", logger, ex);
                    return;
                }
            }

            if (currentDB != beforeUpdates)
            {
                MainSupport.BaseParameters.UpdateParameter(
                    QSMain.ConnectionDB,
                    "micro_updates",
                    StringWorks.VersionToShortString(currentDB)
                    );

                MessageDialogWorks.RunInfoDialog("Выполнено микро обновление базы {0} -> {1}.", StringWorks.VersionToShortString(beforeUpdates), StringWorks.VersionToShortString(currentDB));
            }
        }
Example #8
0
        public static void TryUpdate()
        {
            logger.Debug(System.Reflection.Assembly.GetCallingAssembly().FullName);
            Version currentDB  = Version.Parse(MainSupport.BaseParameters.Version);
            var     appVersion = MainSupport.ProjectVerion.Version;

            if (currentDB.Major == appVersion.Major && currentDB.Minor == appVersion.Minor)
            {
                return;
            }

            var update = updates.Find(u => u.Source == currentDB);

            if (update != null)
            {
                if (!QSMain.User.Admin)
                {
                    NotAdminErrorAndExit(false, update.Source, update.Destanation);
                }

                var dlg = new DBUpdateProcess(update);
                dlg.Show();
                dlg.Run();
                if (!dlg.Success)
                {
                    Environment.Exit(1);
                }
                dlg.Destroy();

                MainSupport.LoadBaseParameters();
                if (appVersion.Major != update.Destanation.Major && appVersion.Minor != update.Destanation.Minor)
                {
                    TryUpdate();
                }
            }
            else
            {
                logger.Error("Версия базы не соответствует программе, но обновление не найдено");
                ShowErrorAndExit(CheckBaseVersion.TextMessage +
                                 String.Format("\nОбновление базы для версии {0} не поддерживается.", StringWorks.VersionToShortString(currentDB)));
            }
        }
Example #9
0
        static void ShowDialog(bool updateRequired)
        {
            string message  = String.Empty;
            string tempPath = Path.Combine(Path.GetTempPath(),
                                           String.Format(@"QSInstaller-{0}.exe", Guid.NewGuid().ToString().Substring(0, 8)));

            bool        loadingComplete = false;
            ProgressBar updateProgress;

            updateProgress      = new ProgressBar();
            updateProgress.Text = "Новая версия скачивается, подождите...";
            VBox vbox = new VBox();

            vbox.PackStart(updateProgress, true, true, 0);
            WebClient webClient = new WebClient();

            webClient.DownloadFileCompleted += (sender, e) => Application.Invoke(delegate {
                loadingComplete = true;
                var isMapped    = updateWindow.IsMapped;
                updateWindow.Destroy();
                if (isMapped && e.Error == null && !e.Cancelled)
                {
                    logger.Info("Скачивание обновления завершено. Запускаем установку...");
                    Process File            = new Process();
                    File.StartInfo.FileName = tempPath;
                    try {
                        File.Start();
                        Environment.Exit(0);
                    } catch (Exception ex) {
                        ShowErrorDialog("Не удалось запустить скачанный файл.");
                        logger.Error(ex, "Не удалось запустить скачанный установщик.");
                    }
                }
                else if (e.Error != null)
                {
                    ShowErrorDialog("Не удалось скачать файл.");
                }
                logger.Error(e.Error, "Не удалось скачать файл обновления.");
            });
            webClient.DownloadProgressChanged += (sender, e) => Application.Invoke(delegate {
                updateProgress.Fraction = e.ProgressPercentage / 100.0;
            });
            updateWindow.SetSizeRequest(300, 25);
            updateWindow.Resizable = false;
            updateWindow.SetPosition(WindowPosition.Center);
            if (updateRequired)
            {
                updateWindow.DeleteEvent += delegate {
                    Environment.Exit(0);
                }
            }
            ;
            updateWindow.Add(vbox);

            if (updateResult.HasUpdate && !updateRequired)
            {
                message = String.Format("<b>Доступна новая версия программы!</b>\n" +
                                        "Доступная версия: {0} (У вас установлена версия {1})\n" +
                                        "Вы хотите скачать и установить новую версию?\n\n" +
                                        (updateResult.UpdateDescription != String.Empty ? "<b>Информация об обновлении:</b>\n{2}" : "{2}"),
                                        StringWorks.VersionToShortString(updateResult.NewVersion),
                                        StringWorks.VersionToShortString(MainSupport.ProjectVerion.Version),
                                        updateResult.UpdateDescription);
            }
            else if (updateResult.HasUpdate && updateRequired)
            {
                message = String.Format("<b>Доступна новая версия программы!</b>\n" +
                                        "Доступная версия: {0} (У вас установлена версия {1})\n" +
                                        "<b>Для продолжения работы вам необходимо установить данное обновление.</b>\n\n" +
                                        (updateResult.UpdateDescription != String.Empty ? "<b>Информация об обновлении:</b>\n{2}" : "{2}"),
                                        StringWorks.VersionToShortString(updateResult.NewVersion),
                                        StringWorks.VersionToShortString(MainSupport.ProjectVerion.Version),
                                        updateResult.UpdateDescription);
            }
            else if (!updateResult.HasUpdate && !updateRequired)
            {
                message = String.Format("<b>Ваша версия программного продукта: {0}</b>\n\n" +
                                        "На данный момент это самая последняя версия.\n" +
                                        "Обновление не требуется.",
                                        StringWorks.VersionToShortString(MainSupport.ProjectVerion.Version));
            }
            else if (!updateResult.HasUpdate && updateRequired)
            {
                ShowErrorDialog("Необходимое обновление программы не найдено.\n" + CheckBaseVersion.TextMessage);
                Environment.Exit(1);
            }

            try {
                UpdaterDialog updaterDialog = new UpdaterDialog(message, updateResult, updateRequired);
                ResponseType  result        = (ResponseType)updaterDialog.Run();
                updaterDialog.Destroy();

                if (result == ResponseType.Ok)
                {
                    updateWindow.ShowAll();
                    logger.Info("Скачивание обновления началось.");
                    logger.Debug("Скачиваем из {0} в {1}", updateResult.FileLink, tempPath);

                    webClient.DownloadFileAsync(new Uri(updateResult.FileLink), tempPath);
                    // Ждем окончания загрузки файла не возвращая управление, иначе в процессе скачивания продолжется работа, а это не надо во всех случаях
                    while (!loadingComplete)
                    {
                        if (Gtk.Application.EventsPending())
                        {
                            Gtk.Application.RunIteration();
                        }
                        else
                        {
                            Thread.Sleep(50);
                        }
                    }
                }
                else if (updateRequired)
                {
                    Environment.Exit(0);
                }
                else if (updateResult.HasUpdate)
                {
                    ConfigFileUpdater(result == ResponseType.Cancel || result == ResponseType.DeleteEvent);
                }
            } catch (Exception ex) {
                logger.Error(ex, "Ошибка доступа к серверу обновления.");
                ShowErrorDialog("Извините, сервер обновления не работает.");
            }
        }