|
Регистрация | Файлы | Правила | Альбомы | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
Патчи на рассмотрении Рассматриваемые к принятию патчи |
|
Опции темы | Поиск в этой теме | Опции просмотра |
11.09.2012, 22:32 | #1 |
Администратор
|
[patch]GOSSIP_NPC_FLAGS_CHECK
Ядро: 12157
Патч во вложении, копия http://paste2.org/p/2212329 Данный патч проверяет госсип меню на отсутствие пунктов с обязательными флагами в `gossip_menu_option`.`npc_option_npcflag`, которые есть в `creature_template`.`npcflag`. Пример: у нпц есть флаг UNIT_NPC_FLAG_BANKER, но нет пункта меню с таким флагом. |
2 пользователя(ей) сказали cпасибо: | schmoozerd (13.09.2012), Vladimir (12.09.2012) |
12.09.2012, 08:43 | #2 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Не сильно хорошо конечно что делается дополнительная выборка из базы, но тут зависит от сложности того же при пробежке по данным в памяти.
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
12.09.2012, 08:46 | #3 |
Администратор
|
Я сначала начал писать патч, используя текущий цикл по оптионам, но в том варианте пришлось бы создавать массив для госсипа, в котором были бы все нпц, использующие госсип.
Далее надо было бы отслеживать начало и конец оптионов меню, суммировать флаги и при переходе к следующему меню делать проверку. На мой взгляд, данный патч намного проще и менее ресурсоемкий.. |
12.09.2012, 10:04 | #4 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
Имхо такие проверки надо наоборот убирать из ядра и переносить в базу.
|
12.09.2012, 10:42 | #5 |
Администратор
|
В базу перенести такие проверки нельзя, это просто хранилище данных.
Если только речь идет о триггерах, функциях и процедурах. |
12.09.2012, 12:14 | #6 |
Пользователь
Регистрация: 06.01.2012
Сообщений: 98
Сказал(а) спасибо: 12
Поблагодарили 33 раз(а) в 21 сообщениях
|
Как по мне данные в базе - дело самой базы. Если они не правильные - база не корректная, а значит с такой базой нельзя запускаться и работать. Как вариант отдельная тулза которая проверяет базу на наличие ошибок.
Меньше проверок - быстрее работает. |
12.09.2012, 12:20 | #7 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
База может больше чем просто хранилищем данных, смотря как ее использовать.
Данную проверку наверное нельзя реализовать триггером, но можно написать хранимую процедуру, которая будет проверять валидность данных в базе, и вызывать ее каждый раз при запуске (если в этом вообще есть смысл, в чем я сомневаюсь). |
12.09.2012, 12:23 | #8 |
Администратор
|
zergtmn, если данный патч не нужен в ядре, тогда надо переместить тему в отвергнутые, права на это есть.
|
12.09.2012, 16:52 | #9 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Дополнительные проверки целостности базы нужны. Так как сейчас они делаются при старте сервера то не вижу в чем проблема с патчем чтобы говорить об отвергнутых. Я просто задал вопрос нельзя ли их без гемороя сделать чисто в коде - вижу что нельзя. Так что у меня других замечаний по патчу нет.
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
12.09.2012, 17:35 | #10 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
|
В тринити это (если я правильно понял что тут делают) сделано проще. При построении меню есть проверка флагов
Код:
if (!(itr->second.OptionNpcflag & npcflags)) continue; |
12.09.2012, 18:09 | #11 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
может не надо создавать тип, а использовать готовую коллекцию:
Код:
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; } |
12.09.2012, 18:20 | #12 | |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
Цитата:
|
|
Пользователь сказал cпасибо: | Evgeniy (12.09.2012) |
12.09.2012, 21:29 | #13 |
Администратор
|
Lordronn, в ядре есть подобная проверка:
Код:
if (gMenuItem.npc_option_npcflag & cInfo->npcflag) found_flags_uses = true; |
13.09.2012, 00:05 | #14 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
В ядре есть специальный режим опциональных проверок для базы - там всякие не всегда корректные результаты и т.д. Почему туда не перенести проверку раз она не влияет на работу сервера. Проверки базы делаемые всегда для того чтобы не дать загрузится некорректным значениям влияющим на работу сервера своим наличием.
Проверки на отсуnствующие данные могу быть и опциональными, чисто для девелоперов базы.
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
13.09.2012, 09:02 | #15 |
Администратор
|
Vladimir, я не осилил последний ваш пост.
Если бы знал, о чем речь, то сразу писал бы проверку там. |
13.09.2012, 09:08 | #16 |
Умный
Старожил
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
|
Тогда уж может вести и отдельный лог, куда сразу будут складываться исправления?
Актуально, например, для исправления параметров в item_template да и ещё много чего можно пустить автоматом исправляться (ну или хотя бы выводить в отдельный лог запрос исправления). В целом же я согласен скорее с zergtmn и Evgeniy тем более, что реализовать такие проверки силами самой базы (через триггеры, процедуры) вполне возможно. Давно пора использовать все возможности MySQL, о чём совсем недавно и писал сам Shmoo |
Пользователь сказал cпасибо: | lovepsone (13.09.2012) |
13.09.2012, 10:13 | #17 |
Администратор
|
KiriX, в данном случае нельзя сделать лог с исправлениями, т.к. оптионов нет, а телепаты в отпуске, чтобы сразу заложить все возможные варианты.
Насчет триггеров, функций и процедур: я давно уже поднимал вопрос об использовании этого функционала, но все осталось в ядре. Простой пример: удаление персонажа из базы. Если правильно настроить триггеры, то все записи будут автоматически удалены из связанных таблиц, не надо будет в ядре все это прописывать. Если ядро загнется в процессе удаления, то не факт, что целостность данных останется в норме. |
13.09.2012, 10:32 | #18 | |
Умный
Старожил
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
|
Цитата:
2) На счёт триггеров что-то как-то только говорят все (я не исключение ), а фактически не делается. А было бы полезно. Даже базоделателям можно много чего полезного из это извлечь. 3) Именно этот простой пример я и привёл в той теме, где шму про возможности базы заговорил |
|
13.09.2012, 10:42 | #19 |
Администратор
|
Кто-то говорит, а я во всю использую триггеры в своей работе.
Для мангоса пока не писал, т.к. при тесте патчей или работе над базой часто приходится накатывать базу с 0. Если будет необходимость, напишу, что потребуется. |
13.09.2012, 10:55 | #20 |
Умный
Старожил
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
|
На работе и у меня в оракловой базе и триггеры, и хранимые процедуры, и вторичные ключи используются. Я как раз о мангосе и говорил, что тут только разговоры.
|
13.09.2012, 16:42 | #22 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
|
13.09.2012, 17:21 | #23 |
MaNGOS Dev
Регистрация: 17.11.2011
Сообщений: 99
Сказал(а) спасибо: 35
Поблагодарили 80 раз(а) в 26 сообщениях
|
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. |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|
|