Ru-MaNGOS  

Вернуться   Ru-MaNGOS > Ядро > Патчи > Патчи на рассмотрении

Важная информация

Патчи на рассмотрении Рассматриваемые к принятию патчи

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.09.2012, 22:32   #1
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 491
Сказал(а) спасибо: 56
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию [patch]GOSSIP_NPC_FLAGS_CHECK

Ядро: 12157
Патч во вложении, копия http://paste2.org/p/2212329

Данный патч проверяет госсип меню на отсутствие пунктов с обязательными флагами в `gossip_menu_option`.`npc_option_npcflag`, которые есть в `creature_template`.`npcflag`.

Пример: у нпц есть флаг UNIT_NPC_FLAG_BANKER, но нет пункта меню с таким флагом.
Вложения
Тип файла: diff GOSSIP_NPC_FLAGS_CHECK.diff (3.7 Кб, 6 просмотров)
virusav вне форума   Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
schmoozerd (13.09.2012), Vladimir (12.09.2012)
Старый 12.09.2012, 08:43   #2
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 440 раз(а) в 183 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Не сильно хорошо конечно что делается дополнительная выборка из базы, но тут зависит от сложности того же при пробежке по данным в памяти.
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума   Ответить с цитированием
Старый 12.09.2012, 08:46   #3
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 491
Сказал(а) спасибо: 56
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Я сначала начал писать патч, используя текущий цикл по оптионам, но в том варианте пришлось бы создавать массив для госсипа, в котором были бы все нпц, использующие госсип.
Далее надо было бы отслеживать начало и конец оптионов меню, суммировать флаги и при переходе к следующему меню делать проверку.

На мой взгляд, данный патч намного проще и менее ресурсоемкий..
virusav вне форума   Ответить с цитированием
Старый 12.09.2012, 10:04   #4
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Имхо такие проверки надо наоборот убирать из ядра и переносить в базу.
zergtmn вне форума   Ответить с цитированием
Старый 12.09.2012, 10:42   #5
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 491
Сказал(а) спасибо: 56
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

В базу перенести такие проверки нельзя, это просто хранилище данных.
Если только речь идет о триггерах, функциях и процедурах.
virusav вне форума   Ответить с цитированием
Старый 12.09.2012, 12:14   #6
Evgeniy
Пользователь
 
Регистрация: 06.01.2012
Сообщений: 98
Сказал(а) спасибо: 12
Поблагодарили 33 раз(а) в 21 сообщениях
Evgeniy На верном пути
По умолчанию

Как по мне данные в базе - дело самой базы. Если они не правильные - база не корректная, а значит с такой базой нельзя запускаться и работать. Как вариант отдельная тулза которая проверяет базу на наличие ошибок.
Меньше проверок - быстрее работает.
Evgeniy вне форума   Ответить с цитированием
Старый 12.09.2012, 12:20   #7
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

База может больше чем просто хранилищем данных, смотря как ее использовать.
Данную проверку наверное нельзя реализовать триггером, но можно написать хранимую процедуру, которая будет проверять валидность данных в базе, и вызывать ее каждый раз при запуске (если в этом вообще есть смысл, в чем я сомневаюсь).
zergtmn вне форума   Ответить с цитированием
Старый 12.09.2012, 12:23   #8
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 491
Сказал(а) спасибо: 56
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

zergtmn, если данный патч не нужен в ядре, тогда надо переместить тему в отвергнутые, права на это есть.
virusav вне форума   Ответить с цитированием
Старый 12.09.2012, 16:52   #9
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 440 раз(а) в 183 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Дополнительные проверки целостности базы нужны. Так как сейчас они делаются при старте сервера то не вижу в чем проблема с патчем чтобы говорить об отвергнутых. Я просто задал вопрос нельзя ли их без гемороя сделать чисто в коде - вижу что нельзя. Так что у меня других замечаний по патчу нет.
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума   Ответить с цитированием
Старый 12.09.2012, 17:35   #10
Lordronn
Умный
 
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
Lordronn Скоро придёт к известности
По умолчанию

В тринити это (если я правильно понял что тут делают) сделано проще. При построении меню есть проверка флагов

Код:
            if (!(itr->second.OptionNpcflag & npcflags))
                continue;
в PrepareGossipMenu
Lordronn вне форума   Ответить с цитированием
Старый 12.09.2012, 18:09   #11
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 591
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию

может не надо создавать тип, а использовать готовую коллекцию:
Код:
std::map<NPCFlags, char*> associative = std::map<NPCFlags, char*>();
associative[UNIT_NPC_FLAG_TRAINER]             = "UNIT_NPC_FLAG_TRAINER";
associative[UNIT_NPC_FLAG_VENDOR]             = "UNIT_NPC_FLAG_VENDOR";
associative[UNIT_NPC_FLAG_FLIGHTMASTER]     = "UNIT_NPC_FLAG_FLIGHTMASTER";
associative[UNIT_NPC_FLAG_INNKEEPER]      = "UNIT_NPC_FLAG_INNKEEPER";
associative[UNIT_NPC_FLAG_BANKER]         = "UNIT_NPC_FLAG_BANKER";
associative[UNIT_NPC_FLAG_PETITIONER]     = "UNIT_NPC_FLAG_PETITIONER";
associative[UNIT_NPC_FLAG_TABARDDESIGNER] = "UNIT_NPC_FLAG_TABARDDESIGNER";
associative[UNIT_NPC_FLAG_BATTLEMASTER]   = "UNIT_NPC_FLAG_BATTLEMASTER";
associative[UNIT_NPC_FLAG_AUCTIONEER]     = "UNIT_NPC_FLAG_AUCTIONEER";
associative[UNIT_NPC_FLAG_STABLEMASTER]   = "UNIT_NPC_FLAG_STABLEMASTER";
associative[UNIT_NPC_FLAG_GUILD_BANKER]   = "UNIT_NPC_FLAG_GUILD_BANKER";

uint32 gossip_npcflags_all = 0;
for (std::map<NPCFlags, char*>::const_iterator itr = associative.begin(); itr != associative.end(); ++itr)
    gossip_npcflags_all |= itr->first;

QueryResult* result = WorldDatabase.PQuery (
                            "SELECT "
                            "`creature_template`.`entry`, `creature_template`.`gossip_menu_id`, (`creature_template`.`npcflag` & %u) &~ BIT_OR(`gossip_menu_option`.`npc_option_npcflag`) AS `flags` "
                            "FROM "
                            "`creature_template`, `gossip_menu_option` "
                            "WHERE "
                            "`creature_template`.`gossip_menu_id`>0 "
                            "AND `creature_template`.`ScriptName`='' "
                            "AND `gossip_menu_option`.`menu_id`=`creature_template`.`gossip_menu_id` "
                            "GROUP BY "
                            "`creature_template`.`entry`, `creature_template`.`gossip_menu_id` "
                            "HAVING "
                            "`flags`>0", gossip_npcflags_all);
if (result)
{
    BarGoLink bar (result->GetRowCount());
    do
    {
        bar.step();

        Field* fields = result->Fetch();

        for (std::map<NPCFlags, char*>::const_iterator itr = associative.begin(); itr != associative.end(); ++itr)
        {
            if (fields[2].GetUInt32() & itr->first)
                sLog.outErrorDb("Table `creature_template` with `entry` = %u and `gossip_menu_id` = %u has flag %s in `npcflag` but gossip menu does not have option with that value in `npc_option_npcflag`.", fields[0].GetUInt32(), fields[1].GetUInt32(), itr->second);
        }
    }
    while (result->NextRow());

    delete result;
}
__________________
Konctantin вне форума   Ответить с цитированием
Старый 12.09.2012, 18:20   #12
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Цитата:
Сообщение от Vladimir Посмотреть сообщение
Дополнительные проверки целостности базы нужны. Так как сейчас они делаются при старте сервера то не вижу в чем проблема с патчем чтобы говорить об отвергнутых. Я просто задал вопрос нельзя ли их без гемороя сделать чисто в коде - вижу что нельзя. Так что у меня других замечаний по патчу нет.
Проблема в загрузке по несколько минут в дебаге. Причем с пустыми таблицами в characters. Всяких проверок конечно можно налепить много, но какой смысл их постоянно прогонять когда база не меняется?
zergtmn вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Evgeniy (12.09.2012)
Старый 12.09.2012, 21:29   #13
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 491
Сказал(а) спасибо: 56
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Lordronn, в ядре есть подобная проверка:
Код:
                if (gMenuItem.npc_option_npcflag & cInfo->npcflag)
                    found_flags_uses = true;
но это не то, т.к. проверка идет по флагам существующих оптионов, а мой патч находит отсутствующие.
virusav вне форума   Ответить с цитированием
Старый 13.09.2012, 00:05   #14
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 440 раз(а) в 183 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

В ядре есть специальный режим опциональных проверок для базы - там всякие не всегда корректные результаты и т.д. Почему туда не перенести проверку раз она не влияет на работу сервера. Проверки базы делаемые всегда для того чтобы не дать загрузится некорректным значениям влияющим на работу сервера своим наличием.
Проверки на отсуnствующие данные могу быть и опциональными, чисто для девелоперов базы.
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума   Ответить с цитированием
Старый 13.09.2012, 09:02   #15
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 491
Сказал(а) спасибо: 56
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Vladimir, я не осилил последний ваш пост.
Если бы знал, о чем речь, то сразу писал бы проверку там.
virusav вне форума   Ответить с цитированием
Старый 13.09.2012, 09:08   #16
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 431 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Тогда уж может вести и отдельный лог, куда сразу будут складываться исправления?
Актуально, например, для исправления параметров в item_template да и ещё много чего можно пустить автоматом исправляться (ну или хотя бы выводить в отдельный лог запрос исправления).
В целом же я согласен скорее с zergtmn и Evgeniy тем более, что реализовать такие проверки силами самой базы (через триггеры, процедуры) вполне возможно. Давно пора использовать все возможности MySQL, о чём совсем недавно и писал сам Shmoo
KiriX вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
lovepsone (13.09.2012)
Старый 13.09.2012, 10:13   #17
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 491
Сказал(а) спасибо: 56
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

KiriX, в данном случае нельзя сделать лог с исправлениями, т.к. оптионов нет, а телепаты в отпуске, чтобы сразу заложить все возможные варианты.

Насчет триггеров, функций и процедур: я давно уже поднимал вопрос об использовании этого функционала, но все осталось в ядре.

Простой пример: удаление персонажа из базы.
Если правильно настроить триггеры, то все записи будут автоматически удалены из связанных таблиц, не надо будет в ядре все это прописывать.
Если ядро загнется в процессе удаления, то не факт, что целостность данных останется в норме.
virusav вне форума   Ответить с цитированием
Старый 13.09.2012, 10:32   #18
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 431 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Цитата:
Сообщение от virusav Посмотреть сообщение
KiriX, в данном случае нельзя сделать лог с исправлениями, т.к. оптионов нет, а телепаты в отпуске, чтобы сразу заложить все возможные варианты.

Насчет триггеров, функций и процедур: я давно уже поднимал вопрос об использовании этого функционала, но все осталось в ядре.

Простой пример: удаление персонажа из базы.
Если правильно настроить триггеры, то все записи будут автоматически удалены из связанных таблиц, не надо будет в ядре все это прописывать.
Если ядро загнется в процессе удаления, то не факт, что целостность данных останется в норме.
1) Я и не предполагаю, что исправить можно все возможные ошибки...
2) На счёт триггеров что-то как-то только говорят все (я не исключение ), а фактически не делается. А было бы полезно. Даже базоделателям можно много чего полезного из это извлечь.
3) Именно этот простой пример я и привёл в той теме, где шму про возможности базы заговорил
KiriX вне форума   Ответить с цитированием
Старый 13.09.2012, 10:42   #19
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 491
Сказал(а) спасибо: 56
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Кто-то говорит, а я во всю использую триггеры в своей работе.
Для мангоса пока не писал, т.к. при тесте патчей или работе над базой часто приходится накатывать базу с 0.

Если будет необходимость, напишу, что потребуется.
virusav вне форума   Ответить с цитированием
Старый 13.09.2012, 10:55   #20
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 431 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Цитата:
Сообщение от virusav Посмотреть сообщение
Кто-то говорит, а я во всю использую триггеры в своей работе.
Для мангоса пока не писал, т.к. при тесте патчей или работе над базой часто приходится накатывать базу с 0.

Если будет необходимость, напишу, что потребуется.
На работе и у меня в оракловой базе и триггеры, и хранимые процедуры, и вторичные ключи используются. Я как раз о мангосе и говорил, что тут только разговоры.
KiriX вне форума   Ответить с цитированием
Старый 13.09.2012, 11:21   #21
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 491
Сказал(а) спасибо: 56
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Для этого нужно создать отдельное обсуждение, а не флудить в топике патча.
virusav вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
RomanRom2 (13.09.2012)
Старый 13.09.2012, 16:42   #22
RomanRom2
WowCore Dev
 
Аватар для RomanRom2
 
Регистрация: 31.03.2010
Сообщений: 465
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
RomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всем
По умолчанию

Цитата:
Сообщение от virusav Посмотреть сообщение
Простой пример: удаление персонажа из базы.
для этого необязательно использовать триггеры.
RomanRom2 вне форума   Ответить с цитированием
Старый 13.09.2012, 17:21   #23
schmoozerd
MaNGOS Dev
 
Регистрация: 17.11.2011
Сообщений: 99
Сказал(а) спасибо: 35
Поблагодарили 80 раз(а) в 26 сообщениях
schmoozerd Скоро придёт к известности
По умолчанию

To throw in an alternative:

For checks like the ones above we can use _only_ a sql-script with some SELECT output.
Then there would no fancy output (that flag 2 == NPC_FLAG_QUESTGIVER), but the integrity check could be done as well.

And it should be enough, as this is only really required to be used by DB-developers, not normal routine

As example for this case here:
Код:
diff --git a/contrib/dbIntegrityChecks/001_checkGossipOptionFlags.sql b/contrib/dbIntegrityChecks/001_checkGossipOptionFlags.sql
new file mode 100644
index 0000000..031281d
--- /dev/null
+++ b/contrib/dbIntegrityChecks/001_checkGossipOptionFlags.sql
@@ -0,0 +1,16 @@
+-- This is a helper script to select gossip menu's that don't provide all gossip-options that might be required by npc-flags.
+
+SET @GOSSIP_SELECT_FLAGS=0x00000010/*TRAINER*/ | 0x00000080/*VENDOR*/ | 0x00002000/*FLIGHTMASTER*/ | 0x00010000/*INNKEEPER*/ | 0x00020000/*BANKER*/ | 0x00040000/*PETITIONER*/ | 0x00080000/*TABARDDESIGNER*/ | 0x00100000/*BATTLEMASTER*/ | 0x00200000/*AUCTIONEER*/ | 0x00400000/*STABLEMASTER*/ | 0x00800000/*GUILD_BANKER*/;
+
+SELECT ct.entry, ct.gossip_menu_id,
+       (ct.npcflag & @GOSSIP_SELECT_FLAGS) &~ BIT_OR(gmo.npc_option_npcflag) AS `flags`
+FROM creature_template AS ct, gossip_menu_option AS gmo
+WHERE
+ ct.gossip_menu_id > 0
+ AND ct.ScriptName=''
+ AND gmo.menu_id=ct.gossip_menu_id
+GROUP BY
+ ct.entry, ct.gossip_menu_id
+HAVING
+ `flags`>0;
+

Последний раз редактировалось schmoozerd; 13.09.2012 в 17:23.
schmoozerd вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Implement Wailing Caverns escort event. Patch by Xfurry Original patch by... newsbot ScriptDev2 Commits 0 23.02.2011 02:17
Fix MaNGOS-9519-ScriptDev2.patch to correctly work with 10790. Patch inspired by... newsbot ScriptDev2 Commits 0 06.12.2010 23:40
Fix MaNGOS-9519-ScriptDev2.patch to correctly work with 10790. Patch inspired by... newsbot ScriptDev2 Commits 0 06.12.2010 23:00
Added correct version of All allong the watchtowers patch. Patch by virusav. DB... newsbot ScriptDev2 Commits 1 16.09.2010 23:03


Текущее время: 06:37. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot