Ru-MaNGOS

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

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

Принятые патчи Иногда выкладывают патчи, которые потом в итоге все-таки принимают в ядро.

Повод для гордости.

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.06.2010, 22:37   #1
Astellar
Гость
 
Сообщений: n/a
По умолчанию [10081][idea] Drop usage of DOTCONFDocument.

В общем смотрел я на это дело, смотрел. И подумал. А зачем нужен этот велосипед вообще?

Объясняю подробнее. Формат конфигов у нас очень простой. По сути это обычный INI файл вида ключ = значение. Кроме того, мы активно используем ACE Framework. ACE предоставляет класс ACE_Ini_ImpExp, который может делать абсолютно всё, что делается сейчас.

Если кому-то интересно, выложу патч, убирающий эту зависимость от стороннего кода. Благо работает прекрасно.
 
8 пользователя(ей) сказали cпасибо:
Feel the Power (19.06.2010), Konctantin (19.06.2010), lordinpvp (19.06.2010), LordJZ (18.06.2010), Viste (19.06.2010), Vladimir (20.06.2010)
Старый 19.06.2010, 02:15   #2
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Вообщемто согласен - используем чисто исторически с друвних времен.

Если конечно будет читать текущие конфиги с минимум особеностей то здравая идея.

Кстати насколько я помню ACE конфиги понимают кучу источников включая базы и registry. Соотвевеено использование стандартного API может позволить интересующимся для себя изменить форму хранения если сильно хочется.
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума  
2 пользователя(ей) сказали cпасибо:
Konctantin (19.06.2010), LordJZ (19.06.2010)
Старый 19.06.2010, 07:14   #3
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию

Цитата:
Если кому-то интересно, выложу патч
Интересно, выкладывайте...
__________________
Konctantin вне форума  
Старый 19.06.2010, 11:25   #4
Astellar
Гость
 
Сообщений: n/a
По умолчанию

Насчет хранения в базе не уверен, не видел там такого. А вот в реестре - да, хранит прекрасно. Но только под виндой, само собой.

Особенностей в общем-то две всего:

1. Нет возможности сконфигурировать чувствительность к регистру символов. Что мне в общем-то никогда не мешало.
2. Конфиг ожидается в формате
Код:
[Section1]
key = value
...

...

[SectionN]
key = value
...
в связи с чем придется добавить в верхушку каждого конфига по одной секции. А в будущем, возможно, сделать нормальное разбиение на секции.

Последний раз редактировалось Astellar; 20.06.2010 в 00:00.
 
Старый 19.06.2010, 11:34   #5
Astellar
Гость
 
Сообщений: n/a
По умолчанию

Сам патч выглядит следующим образом.
PHP код:
diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in
index f5ba807
..4da4e27 100644
--- a/src/mangosd/mangosd.conf.dist.in
+++ b/src/mangosd/mangosd.conf.dist.in
@@ -1,+1,@@
 
#####################################
 # MaNGOS Configuration file         #
 #####################################
+
+***91;
MangosdConf***93;
 
ConfVersion=2010051901
 
 
###################################################################################################################
diff --git a/src/realmd/realmd.conf.dist.in b/src/realmd/realmd.conf.dist.in
index 20e1792
..75c7a27 100644
--- a/src/realmd/realmd.conf.dist.in
+++ b/src/realmd/realmd.conf.dist.in
@@ -1,+1,@@
 
############################################
 # MaNGOS realmd configuration file         #
 ############################################
+
+***91;
RealmdConf***93;
 
ConfVersion=2007062001
 
 
###################################################################################################################
diff --git a/src/shared/Config/Config.cpp b/src/shared/Config/Config.cpp
index b4eeacd
..c1bee65 100644
--- a/src/shared/Config/Config.cpp
+++ b/src/shared/Config/Config.cpp
@@ -22,+22,@@
 
INSTANTIATE_SINGLETON_1(Config);
 
 
Config::Config()
-: 
mIgnoreCase(true), mConf(NULL)
+: 
mConf(NULL)
 {
 }
 
@@ -
31,+31,@@ Config::~Config()
     
delete mConf;
 }
 
-
bool Config::SetSource(const char *filebool ignorecase)
+
bool Config::SetSource(const char *file)
 {
-    
mIgnoreCase ignorecase;
     
mFilename file;
 
     return 
Reload();
@@ -
42,43 +41,33 @@ bool Config::SetSource(const char *filebool ignorecase)
 
bool Config::Reload()
 {
     
delete mConf;
+    
mConf = new ACE_Configuration_Heap;
 
-    
mConf = new DOTCONFDocument(mIgnoreCase ?
-        
DOTCONFDocument::CASEINSENSETIVE :
-    
DOTCONFDocument::CASESENSITIVE);
-
-    if (
mConf->setContent(mFilename.c_str()) == -1)
+    if (
mConf->open() == 0)
     {
-        
delete mConf;
-        
mConf NULL;
-        return 
false;
+        
ACE_Ini_ImpExp config_importer(*mConf);
+        if (
config_importer.import_config(mFilename.c_str()) == 0)
+            return 
true;
     }
 
-    return 
true;
+    
delete mConf;
+    
mConf NULL;
+    return 
false;
 }
 
 
std::string Config::GetStringDefault(const charname, const chardef)
 {
-    if (!
mConf)
-        return 
std::string(def);
-
-    
DOTCONFDocumentNode const *node mConf->findNode(name);
-    if (!
node || !node->getValue())
-        return 
std::string(def);
-
-    return 
std::string(node->getValue());
+    
ACE_TString val;
+    return 
GetValue(nameval) ? val.c_str() : def;
 }
 
 
bool Config::GetBoolDefault(const charnamebool def)
 {
-    if (!
mConf)
-        return 
def;
-
-    
DOTCONFDocumentNode const *node mConf->findNode(name);
-    if (!
node || !node->getValue())
+    
ACE_TString val;
+    if (!
GetValue(nameval))
         return 
def;
 
-    const 
charstr node->getValue();
+    const 
charstr val.c_str();
     if (
strcmp(str"true") == || strcmp(str"TRUE") == ||
         
strcmp(str"yes") == || strcmp(str"YES") == ||
         
strcmp(str"1") == 0)
@@ -
90,25 +79,34 @@ bool Config::GetBoolDefault(const charnamebool def)
 
 
int32 Config::GetIntDefault(const charnameint32 def)
 {
-    if (!
mConf)
-        return 
def;
-
-    
DOTCONFDocumentNode const *node mConf->findNode(name);
-    if (!
node || !node->getValue())
-        return 
def;
-
-    return 
atoi(node->getValue());
+    
ACE_TString val;
+    return 
GetValue(nameval) ? atoi(val.c_str()) : def;
 }
 
 
 
float Config::GetFloatDefault(const charnamefloat def)
 {
+    
ACE_TString val;
+    return 
GetValue(nameval) ? (float)atof(val.c_str()) : def;
+}
+
+
bool Config::GetValue(const char *nameACE_TString &result)
+{
     if (!
mConf)
-        return 
def;
+        return 
false;
 
-    
DOTCONFDocumentNode const *node mConf->findNode(name);
-    if (!
node || !node->getValue())
-        return 
def;
+    
ACE_TString section_name;
+    
ACE_Configuration_Section_Key section_key;
+    
ACE_Configuration_Section_Key root_key mConf->root_section();
+
+    
int i 0;
+    while (
mConf->enumerate_sections(root_keyisection_name) == 0)
+    {
+        
mConf->open_section(root_keysection_name.c_str(), 0section_key);
+        if (
mConf->get_string_value(section_keynameresult) == 0)
+            return 
true;
+        ++
i;
+    }
 
-    return (float)
atof(node->getValue());
+    return 
false;
 }
diff --git a/src/shared/Config/Config.h b/src/shared/Config/Config.h
index 2960184.
.af72670 100644
--- a/src/shared/Config/Config.h
+++ b/src/shared/Config/Config.h
@@ -22,+22,@@
 
#include <Policies/Singleton.h>
 #include "Platform/Define.h"
 
-class DOTCONFDocument;
+class 
ACE_Configuration_Heap;
 
 class 
MANGOS_DLL_SPEC Config
 
{
@@ -
31,+31,@@ class MANGOS_DLL_SPEC Config
         Config
();
         ~
Config();
 
-        
bool SetSource(const char *filebool ignorecase true);
+        
bool SetSource(const char *file);
         
bool Reload();
 
         
std::string GetStringDefault(const charname, const chardef);
@@ -
43,+43,10 @@ class MANGOS_DLL_SPEC Config
 
     
private:
 
+        
bool GetValue(const char *nameACE_TString &result);
+
         
std::string mFilename;
-        
bool mIgnoreCase;
-        
DOTCONFDocument *mConf;
+        
ACE_Configuration_Heap *mConf;
 };
 
 
#define sConfig MaNGOS::Singleton<Config>::Instance()
diff --git a/src/shared/Config/ConfigEnv.h b/src/shared/Config/ConfigEnv.h
index e9801b6
..9f2c7d3 100644
--- a/src/shared/Config/ConfigEnv.h
+++ b/src/shared/Config/ConfigEnv.h
@@ -21,+21,@@
 
#define CONFIGENVIRONMENT_H
 
 #include "Common.h"
-#include "dotconfpp/dotconfpp.h"
+#include "ace/Configuration_Import_Export.h"
 #include "Config.h"
 
 #endif 
Удаление файлов DOTCONFDocument в патч не включено, ибо незачем.
Вложения
Тип файла: diff ace_config.diff (5.6 Кб, 7 просмотров)

Последний раз редактировалось Astellar; 19.06.2010 в 18:42.
 
Пользователь сказал cпасибо:
Vladimir (19.06.2010)
Старый 20.06.2010, 00:23   #6
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Я думаю лучше перенесу GetValue как

Код:
static bool GetValueHelper(ACE_Configuration_Heap *mConf, const char *name, ACE_TString &result)
в Config.cpp так как ради одного типа в private-методе включать в широко используемый заголовочный файл специализированный ACE-header не думаю что хорошо....
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума  
Старый 20.06.2010, 00:33   #7
Astellar
Гость
 
Сообщений: n/a
По умолчанию

Можно и так. Только там ведь forward declaration идёт. Заголовок подключается именно что в Config.cpp. Config.h в плане заголовочных файлов остался нетронутым.

Всё, понял про какой именно заголовок речь идёт. Который в ConfigEnv.h. Тогда да, надо менять.

Последний раз редактировалось Astellar; 20.06.2010 в 00:50.
 
Старый 20.06.2010, 00:49   #8
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Код:
diff --git a/src/shared/Config/ConfigEnv.h b/src/shared/Config/ConfigEnv.h
index e9801b6..9f2c7d3 100644
--- a/src/shared/Config/ConfigEnv.h
+++ b/src/shared/Config/ConfigEnv.h
@@ -21,7 +21,7 @@
 #define CONFIGENVIRONMENT_H
 
 #include "Common.h"
-#include "dotconfpp/dotconfpp.h"
+#include "ace/Configuration_Import_Export.h"
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума  
Старый 20.06.2010, 00:55   #9
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

С описанными изменениями в [10081]. Спасибо
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума  
 


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[10695] Cleanup some death state enums usage. newsbot CMaNGOS Commits 0 08.11.2010 01:50
[a bit of research] ACE Reactor usage. Astellar Патчи 4 25.06.2010 09:14
[10091][idea] Use ACE for CLI args parsing. Astellar Принятые патчи 7 21.06.2010 05:40
[10081] Use ACE config library instead dotconfpp newsbot CMaNGOS Commits 0 20.06.2010 01:00
[9723] Finaly cleanup usage ventorslot values. newsbot CMaNGOS Commits 0 10.04.2010 23:30


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


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