예제 #1
0
        public static bool NHibernateStaleObjectStateExceptionHandler(Exception exception, IApplicationInfo application, UserBase user, IInteractiveMessage interactiveMessage)
        {
            var staleObjectStateException = ExceptionHelper.FindExceptionTypeInInner <NHibernate.StaleObjectStateException>(exception);

            if (staleObjectStateException != null)
            {
                var type       = OrmConfig.FindMappingByFullClassName(staleObjectStateException.EntityName).MappedClass;
                var objectName = DomainHelper.GetSubjectNames(type);

                string message;

                switch (objectName?.Gender)
                {
                case GrammaticalGender.Feminine:
                    message = "Сохраняемая <b>{0}</b> c номером <b>{1}</b> была кем то изменена.";
                    break;

                case GrammaticalGender.Neuter:
                    message = "Сохраняемое <b>{0}</b> c номером <b>{1}</b> было кем то изменено.";
                    break;

                case GrammaticalGender.Masculine:
                default:
                    message = "Сохраняемый <b>{0}</b> c номером <b>{1}</b> был кем то изменен.";
                    break;
                }
                message = String.Format(message + "\nВаши изменения не будут записаны, чтобы не потерять чужие изменения. \nПереоткройте вкладку.", objectName?.Nominative ?? type.Name, staleObjectStateException.Identifier);

                interactiveMessage.ShowMessage(QS.Dialog.ImportanceLevel.Warning, message);
                return(true);
            }
            return(false);
        }
예제 #2
0
        private void RunMicroUpdateOnly()
        {
            var currentDB     = CurrentDBVersion;
            var beforeUpdates = currentDB;
            var hops          = configuration.GetHopsToLast(currentDB).ToList();

            logger.Info("Начинаем микро обновление(текущая версия:{0})", VersionHelper.VersionToShortString(currentDB));

            foreach (var update in hops)
            {
                logger.Info("Обновляемся до {0}", VersionHelper.VersionToShortString(update.Destination));
                var trans = connection.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 = connection.CreateCommand();
                    cmd.CommandText = sql;
                    cmd.Transaction = trans;
                    cmd.ExecuteNonQuery();
                    trans.Commit();
                    currentDB = update.Destination;
                }
                catch (Exception ex) {
                    trans.Rollback();
                    throw ex;
                }
            }

            parametersService.micro_updates = VersionHelper.VersionToShortString(currentDB);
            interactiveMessage.ShowMessage(ImportanceLevel.Info, String.Format("Выполнено микро обновление базы {0} -> {1}.",
                                                                               VersionHelper.VersionToShortString(beforeUpdates),
                                                                               VersionHelper.VersionToShortString(currentDB)));
        }
예제 #3
0
        public static bool NHibernateFlushAfterException(Exception exception, IApplicationInfo application, UserBase user, IInteractiveMessage interactiveMessage)
        {
            var nhEx = ExceptionHelper.FindExceptionTypeInInner <NHibernate.AssertionFailure>(exception);

            if (nhEx != null && nhEx.Message.Contains("don't flush the Session after an exception occurs"))
            {
                interactiveMessage.ShowMessage(ImportanceLevel.Error, "В этом диалоге ранее произошла ошибка, в следстивии ее программа не может " +
                                               "сохранить данные. Закройте этот диалог и продолжайте работу в новом.");
                return(true);
            }
            return(false);
        }
예제 #4
0
        public static bool MySqlExceptionConnectionTimeoutHandler(Exception exception, IApplicationInfo application, UserBase user, IInteractiveMessage interactiveMessage)
        {
            var mysqlEx    = ExceptionHelper.FindExceptionTypeInInner <MySqlException>(exception);
            var exceptions = new[] { 1159, 1161 };

            if (mysqlEx != null && exceptions.Contains(mysqlEx.Number))
            {
                interactiveMessage.ShowMessage(ImportanceLevel.Error, "Возникла проблема с подключением к серверу, попробуйте снова.");
                return(true);
            }
            return(false);
        }
예제 #5
0
        public static bool MySqlException1055OnlyFullGroupBy(Exception exception, IApplicationInfo application, UserBase user, IInteractiveMessage interactiveMessage)
        {
            var mysqlEx = ExceptionHelper.FindExceptionTypeInInner <MySqlException>(exception);

            if (mysqlEx != null && mysqlEx.Number == 1055)
            {
                interactiveMessage.ShowMessage(ImportanceLevel.Error, "На сервере MariaDB\\MySQL включен режим 'only_full_group_by', " +
                                               "для нормальной работы программы нужно удалить это значение из опции sql_mode. Обычно по умолчанию этот режим " +
                                               "отключен, проверьте свой конфигурационный файл my.cnf");
                return(true);
            }
            return(false);
        }
예제 #6
0
        IPage MakePageAndCatchAborting(Func <string, IPage> makePage, string hash)
        {
            try {
                return(makePage(hash));
            }
            catch (Exception ex) when(ex.FindExceptionTypeInInner <AbortCreatingPageException>() != null)
            {
                var abortEx = ex.FindExceptionTypeInInner <AbortCreatingPageException>();

                interactiveMessage.ShowMessage(ImportanceLevel.Error, abortEx.Message, abortEx.Title);
                return(null);
            }
        }
예제 #7
0
        public static bool MySqlException1366IncorrectStringValue(Exception exception, IApplicationInfo application, UserBase user, IInteractiveMessage interactiveMessage)
        {
            var mysqlEx = ExceptionHelper.FindExceptionTypeInInner <MySqlException>(exception);

            if (mysqlEx != null && mysqlEx.Number == 1366)
            {
                interactiveMessage.ShowMessage(ImportanceLevel.Error, "При сохранении в базу данных произошла ошибка «Incorrect string value», " +
                                               "обычно это означает что вы вставили в поле диалога какие-то символы не поддерживаемые текущей кодировкой поля таблицы. " +
                                               "Например вы вставили один из символов Эмодзи, при этом кодировка полей в таблицах у вас трех-байтовая utf8, " +
                                               "для того чтобы сохранять такие символы в MariaDB\\MySQL базу данных, вам необходимо преобразовать все таблицы в " +
                                               "четырех-байтовую кодировку utf8mb4. Кодировка utf8mb4 используется по умолчанию в новых версиях MariaDB.");
                return(true);
            }
            return(false);
        }
예제 #8
0
        private void setInTablePerformers()
        {
            listPerformers = getPerformers();
            List <CellRendererToggle> referActive = new List <CellRendererToggle>();

            if (listPerformers.Count() > 3)
            {
                interactive.ShowMessage(ImportanceLevel.Warning, "  Указано более трех исполнителей.\n Очистите график работ и проверьте,\n что в заказе не указаны лишние исполнители.");
                listPerformers.Clear();
            }

            int i = 5;

            foreach (var emp in listPerformers)
            {
                getCellActive(ref referActive);
                var column = treeviewCost.AppendColumn(emp.PersonNameWithInitials(), referActive[i - 5], "active", i);
                column.Alignment = 0.5f;
                column.Expand    = true;
                i++;
            }
        }
예제 #9
0
 public void ShowMessage(ImportanceLevel level, string message, string title = null)
 {
     interactiveMessage.ShowMessage(level, message, title);
 }