PDA

Просмотр полной версии : [Вопрос] Настройки мода.



AlexDizaro
01.01.2016, 11:05
Как реализовать настройки в моде? Хотел на defin'ах :


#define MySQL_ConfigFile

#if !defined MySQL_ConfigFile
#define MYSQL_HOST "localhost"
#define MYSQL_USER "root"
#define MYSQL_DATABASE "palladium"
#define MYSQL_PASSWORD ""
#endif

Но комментировать (//#define MySQL_ConfigFile) что бы отключить не очень
Делать на переменных или все же можно как то сделать?

Хотелось бы что бы было примерно так :


#define MySQL_ConfigFile true

#if !MySQL_ConfigFile == true
#define ...


Может глупо, но все же хочу реализовать настройку мода, где надо будет поменять лишь значение бинда

Desulaid
01.01.2016, 12:34
Как-то так, карочи, если следовать вашей идее. Но варианта с таким вот использованием - его нет.


#if !defined MYSQL_CONNECT_SETTINGS

#define MYSQL_HOST "localhost"
#define MYSQL_USER "root"
#define MYSQL_DATABASE "palladium"
#define MYSQL_PASSWORD ""

#define MYSQL_CONNECT_ALL MYSQL_HOST, MYSQL_USER, MYSQL_DATABASE, MYSQL_PASSWORD

#define MYSQL_CONNECT_SETTINGS
#endif

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


/*
* Настройка подключения игрового мода с MySQL базой данных
*
*/

#if !defined mysql_included
#error File a_mysql.inc is not included
#endif

// Настройки подключения
#define MYSQL_HOST "localhost"
#define MYSQL_USER "root"
#define MYSQL_PASSWORD ""
#define MYSQL_DATABASE "base"

// id подключения
new cHandle;

// Подключение соединения с базой данных
// при старте сервера
public OnGameModeInit()
{
cHandle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DATABASE, MYSQL_PASSWORD);
if(mysql_errno())
print("[MySQL] Связь с базой данных не установлена\n* Проверьте введенные вами данные\n\n");
else
print("[MySQL] Связь с базой данных установлена\n\n");
#if defined MySQL__OnGameModeInit
MySQL__OnGameModeInit();
return 1;
#endif
}

#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif

#define OnGameModeInit MySQL__OnGameModeInit

#if defined MySQL__OnGameModeInit
forward MySQL__OnGameModeInit();
#endif

// Отключение соединения с базой данных
// при рестарте сервера
public OnGameModeExit()
{
mysql_close(cHandle);
print("[MySQL] Связь с базой данных была отключена\nИдет подключение ...\n\n");
#if defined MySQL__OnGameModeExit
MySQL__OnGameModeExit();
return 1;
#endif
}

#if defined _ALS_OnGameModeExit
#undef OnGameModeExit
#else
#define _ALS_OnGameModeExit
#endif

#define OnGameModeExit MySQL__OnGameModeExit

#if defined MySQL__OnGameModeExit
forward MySQL__OnGameModeExit();
#endif

$continue$
01.01.2016, 12:50
Не есть хорошим метод. Почему информацию о базе данных нельзя хранить в. * .cfg?

Как-то так, карочи, если следовать вашей идее. Но варианта с таким вот использованием - его нет.


#if !defined MYSQL_CONNECT_SETTINGS

#define MYSQL_HOST "localhost"
#define MYSQL_USER "root"
#define MYSQL_DATABASE "palladium"
#define MYSQL_PASSWORD ""

#define MYSQL_CONNECT_ALL MYSQL_HOST, MYSQL_USER, MYSQL_DATABASE, MYSQL_PASSWORD

#define MYSQL_CONNECT_SETTINGS
#endif

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


/*
* Настройка подключения игрового мода с MySQL базой данных
*
*/

#if !defined mysql_included
#error File a_mysql.inc is not included
#endif

// Настройки подключения
#define MYSQL_HOST "localhost"
#define MYSQL_USER "root"
#define MYSQL_PASSWORD ""
#define MYSQL_DATABASE "base"

// id подключения
new cHandle;

// Подключение соединения с базой данных
// при старте сервера
public OnGameModeInit()
{
cHandle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DATABASE, MYSQL_PASSWORD);
if(mysql_errno())
print("[MySQL] Связь с базой данных не установлена\n* Проверьте введенные вами данные\n\n");
else
print("[MySQL] Связь с базой данных установлена\n\n");
#if defined MySQL__OnGameModeInit
MySQL__OnGameModeInit();
return 1;
#endif
}

#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif

#define OnGameModeInit MySQL__OnGameModeInit

#if defined MySQL__OnGameModeInit
forward MySQL__OnGameModeInit();
#endif

// Отключение соединения с базой данных
// при рестарте сервера
public OnGameModeExit()
{
mysql_close(cHandle);
print("[MySQL] Связь с базой данных была отключена\nИдет подключение ...\n\n");
#if defined MySQL__OnGameModeExit
MySQL__OnGameModeExit();
return 1;
#endif
}

#if defined _ALS_OnGameModeExit
#undef OnGameModeExit
#else
#define _ALS_OnGameModeExit
#endif

#define OnGameModeExit MySQL__OnGameModeExit

#if defined MySQL__OnGameModeExit
forward MySQL__OnGameModeExit();
#endif

Desulaid
01.01.2016, 13:52
Не есть хорошим метод. Почему информацию о базе данных нельзя хранить в. * .cfg?

Действительно, почему?

AlexDizaro
01.01.2016, 16:50
Не есть хорошим метод. Почему информацию о базе данных нельзя хранить в. * .cfg?
Я и хотел это реализовать.
Что бы можно было переключаться между конфигом в файле и макросу.
Т.е можно в моде поставить
#define MySQL_ConfigFile true - и тогда данные будут в файле храниться иначе #define MySQL_Host...

Desulaid
01.01.2016, 17:10
Я и хотел это реализовать.
Что бы можно было переключаться между конфигом в файле и макросу.
Т.е можно в моде поставить
#define MySQL_ConfigFile true - и тогда данные будут в файле храниться иначе #define MySQL_Host...

Как я уже говорил, такого варианта использования кода с вашей целью - его нет! Но можете взять mxINI или же стандартный file.INC и загружать инфу от туда, если данные не указывать, то ставится значение по умолчанию. Я делал команду (клицкай) (http://pro-pawn.ru/showthread.php?12814-Restart)с похожим алгоритмом. Можете как за основу посмотреть. Если найду время, то выложу в эту тему свой рабочий вариант, его только написать надо :3

Desulaid
01.01.2016, 18:03
Как я уже говорил, такого варианта использования кода с вашей целью - его нет! Но можете взять mxINI или же стандартный file.INC и загружать инфу от туда, если данные не указывать, то ставится значение по умолчанию. Я делал команду (клицкай) (http://pro-pawn.ru/showthread.php?12814-Restart)с похожим алгоритмом. Можете как за основу посмотреть. Если найду время, то выложу в эту тему свой рабочий вариант, его только написать надо :3

ADD: не совсем кфг файл, но ФАЙЛ.


/*

Загрузка данных из '../scriptfiles/mysql_settings.txt' для подключения с базой данных
(C) Copyright 2015, Untonyst =3

Пример содержимого файла mysql_settings.txt:

localhost,tensa,123qwe,base
хост, имя пользователя, пароль, имя базы данных

Аля большой костыль!
*/

// если нет инклуда a_mysql.inc, то исключим НАШ инклуд на стадии компиляции
#if !defined mysql_included
//#error File a_mysql.inc is not included
#endinput
#endif

// если нет инклуда sscanf2.inc, то исключим НАШ инклуд на стадии компиляции
#if !defined sscanf
//#error File sscanf2.inc is not included
#endinput
#endif

// настройки подключения по умолчанию, если файла настроек не обнаружено
#define DEFAUL_MYSQL_HOST "127.0.0.1"
#define DEFAUL_MYSQL_USER "root"
#define DEFAUL_MYSQL_PASSWORD ""
#define DEFAUL_MYSQL_DATABASE "base"

// id подключения
new cHandle;

public OnGameModeInit()
// подключение соединения с базой данных при старте сервера
{
new File:file_handle = fopen("mysql_settings.txt", io_read), buf[20*4+1], mysql_host[20], mysql_user[20], mysql_password[20], mysql_database[20];

if (!fexist("mysql_settings.txt"))
// если файла настроек нет, то используем данные по умолчанию
{
mysql_host = DEFAUL_MYSQL_HOST;
mysql_user = DEFAUL_MYSQL_USER;
mysql_password = DEFAUL_MYSQL_PASSWORD;
mysql_database = DEFAUL_MYSQL_DATABASE;
}
else
{
fread(file_handle, buf);
sscanf(buf, "p<,>s[20]s[20]s[20]s[20]", mysql_host, mysql_user, mysql_password, mysql_database);
fclose(file_handle);
// это так, для сведения
printf("===============\nХост: %s\nПользователь: %s\nПароль: %s\nБД: %s\n===============\n\n",mysql_host, mysql_user, mysql_password, mysql_database);
}

cHandle = mysql_connect(mysql_host, mysql_user, mysql_database, mysql_password);

if(mysql_errno())
print("[MySQL] Связь с базой данных не установлена\n* Проверьте введенные вами данные\n\n");
else
print("[MySQL] Связь с базой данных установлена\n\n");

#if defined MySQL__OnGameModeInit
MySQL__OnGameModeInit();
return 1;
#endif
}

#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif

#define OnGameModeInit MySQL__OnGameModeInit

#if defined MySQL__OnGameModeInit
forward MySQL__OnGameModeInit();
#endif

public OnGameModeExit()
// отключение соединения с базой данных при рестарте сервера
{
mysql_close(cHandle);
print("[MySQL] Связь с базой данных была отключена\nИдет подключение ...\n\n");
#if defined MySQL__OnGameModeExit
MySQL__OnGameModeExit();
return 1;
#endif
}

#if defined _ALS_OnGameModeExit
#undef OnGameModeExit
#else
#define _ALS_OnGameModeExit
#endif

#define OnGameModeExit MySQL__OnGameModeExit

#if defined MySQL__OnGameModeExit
forward MySQL__OnGameModeExit();
#endif

Все удовлетворены?

Daniel_Cortez
01.01.2016, 18:06
Я и хотел это реализовать.
Что бы можно было переключаться между конфигом в файле и макросу.
Т.е можно в моде поставить
#define MySQL_ConfigFile true - и тогда данные будут в файле храниться иначе #define MySQL_Host...
В таком случае, работайте с файловыми функциями: fopen, fclose, fread, fexist.
Впрочем, не могу сказать, что понимаю вашу логику. Зачем делать настройки в отдельном файле, когда возможности Pawn позволяют с лёгкостью сделать их в моде?

В английском языке ситуацию, в которой убивают два зайца одним выстрелом, называют "win-win". Так вот, здесь, наоборот, получается ситуация "lose-lose". Вы не только усложняете разработку для себя, но ещё и упрощаете жизнь хакерам, ведь скопипастить текст из файла куда легче, чем извлекать его из бинарника, да ещё и в 4-байтовой кодировке.

Для сравнения, в моде можно не просто сохранить настройки, но и зашифровать их и расшифровывать только при запуске сервера. Если кто-то украдёт ваш мод, то этому "кому-то" придётся изрядно попотеть, чтобы получить настройки: как минимум, нужно будет извлечь зашифрованные данные и вручную восстановить из опкодов AMX функцию для расшифровки, т.к. нормальных декомпиляторов для Pawn нет.

AlexDizaro
01.01.2016, 18:25
В таком случае, работайте с файловыми функциями: fopen, fclose, fread, fexist.
Впрочем, не могу сказать, что понимаю вашу логику. Зачем делать настройки в отдельном файле, когда возможности Pawn позволяют с лёгкостью сделать их в моде?

В английском языке ситуацию, в которой убивают два зайца одним выстрелом, называют "win-win". Так вот, здесь, наоборот, получается ситуация "lose-lose". Вы не только усложняете разработку для себя, но ещё и упрощаете жизнь хакерам, ведь скопипастить текст из файла куда легче, чем извлекать его из бинарника, да ещё и в 4-байтовой кодировке.

Для сравнения, в моде можно не просто сохранить настройки, но и зашифровать их и расшифровывать только при запуске сервера. Если кто-то украдёт ваш мод, то этому "кому-то" придётся изрядно попотеть, чтобы получить настройки: как минимум, нужно будет извлечь зашифрованные данные и вручную восстановить из опкодов AMX функцию для расшифровки, т.к. нормальных декомпиляторов для Pawn нет.

Я хочу сделать мод-платформу для себя
У которого будет гибкая настройка под мои нужды.

$continue$
02.01.2016, 17:46
В таком случае, работайте с файловыми функциями: fopen, fclose, fread, fexist.
Впрочем, не могу сказать, что понимаю вашу логику. Зачем делать настройки в отдельном файле, когда возможности Pawn позволяют с лёгкостью сделать их в моде?

В английском языке ситуацию, в которой убивают два зайца одним выстрелом, называют "win-win". Так вот, здесь, наоборот, получается ситуация "lose-lose". Вы не только усложняете разработку для себя, но ещё и упрощаете жизнь хакерам, ведь скопипастить текст из файла куда легче, чем извлекать его из бинарника, да ещё и в 4-байтовой кодировке.

Для сравнения, в моде можно не просто сохранить настройки, но и зашифровать их и расшифровывать только при запуске сервера. Если кто-то украдёт ваш мод, то этому "кому-то" придётся изрядно попотеть, чтобы получить настройки: как минимум, нужно будет извлечь зашифрованные данные и вручную восстановить из опкодов AMX функцию для расшифровки, т.к. нормальных декомпиляторов для Pawn нет.

В чем проблема, хранить зашифрованный пароль и прочии настройки в файле? (Ну или .cfg)
Linux же никто не мешает хранить Пароди от пользователей в файле.

vovandolg
02.01.2016, 21:28
Немного оффтопа
В чём то идея хорошая такого подключения, моды можно толкать при этом зная что его не раскодируют и не украдут, а в чём то и плохо, до паролей добраться легче, но опять же кто полезет из разрабов хостинга смотреть пароли если у них и так всё на ладошке в бд) всё таки это хорошая идея:smoke:

AlexDizaro
03.01.2016, 11:45
Немного оффтопа
В чём то идея хорошая такого подключения, моды можно толкать при этом зная что его не раскодируют и не украдут, а в чём то и плохо, до паролей добраться легче, но опять же кто полезет из разрабов хостинга смотреть пароли если у них и так всё на ладошке в бд) всё таки это хорошая идея:smoke:

Кажется меня так и никто не понял :sorry:
Под гибкой настройкой я имел ввиду возможность переключения в настройках возможность сохранения в файл или же в самом моде

Daniel_Cortez
03.01.2016, 13:21
В чем проблема, хранить зашифрованный пароль и прочии настройки в файле? (Ну или .cfg)
В том, что злоумышленнику достаточно будет только восстановить функцию для расшифровки. В Pawn это достаточно просто, на самом деле, т.к. используется совсем небольшой набор инструкций. В то же время, если хранить пароль внутри мода, будет больше возможностей спрятать его среди прочих данных. Или можно вообще составить пароль из других данных в моде (например, взять какие-нибудь случайные символы из строк, используемых под правила игры на сервере, сообщения об ошибках и т.п.) и этот пароль использовать для доступа к БД. Чтобы расшифровать такой пароль, злоумышленнику придётся не только восстановить функцию, но ещё и найти все те строки, которые используются для составления пароля.

DeimoS
03.01.2016, 15:03
Кажется меня так и никто не понял :sorry:
Под гибкой настройкой я имел ввиду возможность переключения в настройках возможность сохранения в файл или же в самом моде

Так опишите ситуацию более подробно. Что именно Вы хотите сделать, в каких ситуациях собираетесь использовать и для чего это вообще нужно. Прямо разжуйте на пальцах и тогда Вам сразу помогут. А угадывать желания по тексту тут никто не умеет

$continue$
03.01.2016, 17:15
В том, что злоумышленнику достаточно будет только восстановить функцию для расшифровки. В Pawn это достаточно просто, на самом деле, т.к. используется совсем небольшой набор инструкций. В то же время, если хранить пароль внутри мода, будет больше возможностей спрятать его среди прочих данных. Или можно вообще составить пароль из других данных в моде (например, взять какие-нибудь случайные символы из строк, используемых под правила игры на сервере, сообщения об ошибках и т.п.) и этот пароль использовать для доступа к БД. Чтобы расшифровать такой пароль, злоумышленнику придётся не только восстановить функцию, но ещё и найти все те строки, которые используются для составления пароля.

Прибавляетем к паролю пару символов слева, по середине и в конец.
Используем Base64 (https://ru.m.wikipedia.org/wiki/Base64) (вот, кстати плагин (http://forum.sa-mp.com/showthread.php?t=271230))
И тогда мне будет очень, жаль "Тру хаскеров" которые будут это переводить. Алгоритм подстановки символов можно сделать через рандом.

А ещё можно одну часть пароля закодировать в Base64, а вторую часть например в sha512.
Потом скрепить строку и готово.
А кто чёрт возьми будет знать, что так сделано?

Daniel_Cortez
03.01.2016, 18:14
А ещё можно одну часть пароля закодировать в Base64, а вторую часть например в sha512.
Потом скрепить строку и готово.
А кто чёрт возьми будет знать, что так сделано?
Тот, кто может дизассемблировать мод и восстановить шифрующую функцию. Есть такие люди.
Кстати говоря, с плагином даже проще, чем с кастомной функцией: восстанавливать нужно только код на Pawn и чем меньше такого кода, тем проще расшифровать пароль.




Кажется меня так и никто не понял :sorry:
Под гибкой настройкой я имел ввиду возможность переключения в настройках возможность сохранения в файл или же в самом моде


new const DATABASE_CONFIG_FILE_NAME = "dbconf.txt";
#define DATABASE__USE_CONFIG_FILE
#define DATABASE__DEFAULT_HOST "localhost"
#define DATABASE__DEFAULT_USER "root"
#define DATABASE__DEFAULT_NAME "palladium"
#define DATABASE__DEFAULT_PASSWORD ""


#if !defined USE_MYSQL_CONFIG_FILE

new const database_host[] = DATABASE__DEFAULT_HOST;
new const database_user[] = DATABASE__DEFAULT_USER;
new const database_name[] = DATABASE__DEFAULT_NAME;
new const database_pass[] = DATABASE__DEFAULT_PASSWORD;

#else // !defined USE_MYSQL_CONFIG_FILE

new database_host[64] = DATABASE__DEFAULT_HOST;
new database_user[16] = DATABASE__DEFAULT_USER;
new database_name[32] = DATABASE__DEFAULT_NAME;
new database_pass[32] = DATABASE__DEFAULT_PASSWORD;

public OnGameModeInit()
{
new File:config_file_handle = fopen(DATABASE_CONFIG_FILE_NAME);
if (_:config_file_handle == 0)
{
printf(
"Warning: Couldn't open file %s! Applying default settings...",
DATABASE_CONFIG_FILE_NAME
);
database_host = DATABASE__DEFAULT_HOST;
database_user = DATABASE__DEFAULT_USER;
database_name = DATABASE__DEFAULT_NAME;
database_pass = DATABASE__DEFAULT_PASSWORD;
return;
}
static const read_warning_str[] =
"Warning: Length of the %s string exceeds the limit of %d characters.";
if (fread(config_file_handle, database_host) > sizeof(database_host) - 1)
printf(read_warning_str, "host", sizeof(database_host) - 1);
if (fread(config_file_handle, database_user) > sizeof(database_user) - 1)
printf(read_warning_str, "user", sizeof(database_user) - 1);
if (fread(config_file_handle, database_name) > sizeof(database_name) - 1)
printf(read_warning_str, "user", sizeof(database_name) - 1);
if (fread(config_file_handle, database_pass) > sizeof(database_pass) - 1)
printf(read_warning_str, "user", sizeof(database_pass) - 1);
fclose(config_file_handle);
#if defined mysql_config__OnGameModeInit
mysql_config__OnGameModeInit();
#endif
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
forward mysql_config__OnGameModeInit();
#define OnGameModeInit mysql_config__OnGameModeInit

#endif // !defined USE_MYSQL_CONFIG_FILE

P.S.: Код не тестировался, используйте на свой страх и риск.

vovandolg
26.02.2016, 23:45
P.S.: Код не тестировался, используйте на свой страх и риск.


D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "DATABASE_CONFIG_FILE_NAME"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_host"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_name"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_pass"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_user"
Что тут не так могло пойти?

DeimoS
26.02.2016, 23:58
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "DATABASE_CONFIG_FILE_NAME"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_host"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_name"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_pass"
D:\Program\ÀðáàéòåíÑÀÌÏ\pawnoÓËÜÒ\mod.pwn(44746) : warning 203: symbol is never used: "database_user"
Что тут не так могло пойти?

А ты "mysql_connect" не забыл изменить, вставив эти переменные?

vovandolg
27.02.2016, 00:10
//и куда его вписывать если он в инклуде как бы уже вписан
D:\Program\12\pawno12\mod.pwn(44747) : warning 203: symbol is never used: "DATABASE_CONFIG_FILE_NAME"




//Поменял в самом моде
ConnectMySQL(database_host, database_user, database_name, database_pass);
//и выбило
error 035: argument type mismatch (argument 1)

//Вот как построен коннект
stock ConnectMySQL(host[], user[], db[], pass[])
{
connects = mysql_connect(host, user, db, pass);
if(mysql_errno() == 0) printf("Подключение к базе успешно");
else return printf("Подключиться к базе не удалось");
mysql_function_query(connects,"SET NAMES cp1251",false,"","");
mysql_function_query(connects,"set character_set_client=\'cp1251\'",false,"","");
mysql_function_query(connects,"set character_set_results=\'cp1251\'",false,"","");
mysql_function_query(connects,"set collation_connection=\'cp1251_general_ci\'",false,"","");
mysql_function_query(connects,"SELECT * FROM `bizz`",true,"LoadBizz","");
mysql_function_query(connects,"SELECT * FROM `House`",true,"LoadProperty","");
mysql_function_query(connects,"SELECT * FROM `meria`",true,"OnLoadKaznaCallback","");
mysql_function_query(connects,"SELECT * FROM `other`",true,"OnLoadMaterialsCallback","");
return 1;
}

DeimoS
27.02.2016, 00:30
В общем, вот как у меня вышло без перехвата

#define USE_MYSQL_CONFIG_FILE
#define DATABASE__DEFAULT_HOST "localhost"
#define DATABASE__DEFAULT_USER "root"
#define DATABASE__DEFAULT_NAME "sa-mp"
#define DATABASE__DEFAULT_PASSWORD ""


#if !defined USE_MYSQL_CONFIG_FILE

new const database_host[] = DATABASE__DEFAULT_HOST;
new const database_user[] = DATABASE__DEFAULT_USER;
new const database_name[] = DATABASE__DEFAULT_NAME;
new const database_pass[] = DATABASE__DEFAULT_PASSWORD;

#else

new const DATABASE_CONFIG_FILE_NAME[] = "dbconf.txt";
new database_host[64] = DATABASE__DEFAULT_HOST;
new database_user[16] = DATABASE__DEFAULT_USER;
new database_name[32] = DATABASE__DEFAULT_NAME;
new database_pass[32] = DATABASE__DEFAULT_PASSWORD;

#endif


public OnGameModeInit()
{
#if defined USE_MYSQL_CONFIG_FILE
new File:config_file_handle = fopen(DATABASE_CONFIG_FILE_NAME);
if (_:config_file_handle == 0)
{
printf(
"Warning: Couldn't open file %s! Applying default settings...",
DATABASE_CONFIG_FILE_NAME
);
strcat(database_host, DATABASE__DEFAULT_HOST, 64);
strcat(database_user, DATABASE__DEFAULT_USER, 16);
strcat(database_name, DATABASE__DEFAULT_NAME, 32);
strcat(database_pass, DATABASE__DEFAULT_PASSWORD, 32);
}
static const read_warning_str[] =
"Warning: Length of the %s string exceeds the limit of %d characters.";
if (fread(config_file_handle, database_host) > sizeof(database_host) - 1)
printf(read_warning_str, "host", sizeof(database_host) - 1);
if (fread(config_file_handle, database_user) > sizeof(database_user) - 1)
printf(read_warning_str, "user", sizeof(database_user) - 1);
if (fread(config_file_handle, database_name) > sizeof(database_name) - 1)
printf(read_warning_str, "bd_name", sizeof(database_name) - 1);
if (fread(config_file_handle, database_pass) > sizeof(database_pass) - 1)
printf(read_warning_str, "bd_password", sizeof(database_pass) - 1);
fclose(config_file_handle);

strdel(database_host, strlen(database_host)-2, strlen(database_host));
strdel(database_user, strlen(database_user)-2, strlen(database_user));
strdel(database_name, strlen(database_name)-2, strlen(database_name));
strdel(database_pass, strlen(database_pass)-2, strlen(database_pass));
#endif

mysql_connect_ID = mysql_connect(database_host, database_user, database_name, database_pass);
return 1;
}
В коде DC достаточно недочётов. Сейчас попробую и версию с перехватом реализовать.

P.S. Только учти, что формат записей в конфиг-файле будет такой:

localhost
root
sa-mp


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

- - - Добавлено - - -

Собственно, вот, вроде, рабочая версия перехвата

#define USE_MYSQL_CONFIG_FILE
#define DATABASE__DEFAULT_HOST "localhost"
#define DATABASE__DEFAULT_USER "root"
#define DATABASE__DEFAULT_NAME "palladium"
#define DATABASE__DEFAULT_PASSWORD ""


#if !defined USE_MYSQL_CONFIG_FILE

new const database_host[] = DATABASE__DEFAULT_HOST;
new const database_user[] = DATABASE__DEFAULT_USER;
new const database_name[] = DATABASE__DEFAULT_NAME;
new const database_pass[] = DATABASE__DEFAULT_PASSWORD;

#else // !defined USE_MYSQL_CONFIG_FILE

new const DATABASE_CONFIG_FILE_NAME[] = "dbconf.txt";
new database_host[64] = DATABASE__DEFAULT_HOST;
new database_user[16] = DATABASE__DEFAULT_USER;
new database_name[32] = DATABASE__DEFAULT_NAME;
new database_pass[32] = DATABASE__DEFAULT_PASSWORD;

public OnGameModeInit()
{
new File:config_file_handle = fopen(DATABASE_CONFIG_FILE_NAME);
if (_:config_file_handle == 0)
{
printf(
"Warning: Couldn't open file %s! Applying default settings...",
DATABASE_CONFIG_FILE_NAME
);
strcat(database_host, DATABASE__DEFAULT_HOST, 64);
strcat(database_user, DATABASE__DEFAULT_USER, 16);
strcat(database_name, DATABASE__DEFAULT_NAME, 32);
strcat(database_pass, DATABASE__DEFAULT_PASSWORD, 32);
return;
}
static const read_warning_str[] =
"Warning: Length of the %s string exceeds the limit of %d characters.";
if (fread(config_file_handle, database_host) > sizeof(database_host) - 1)
printf(read_warning_str, "host", sizeof(database_host) - 1);
if (fread(config_file_handle, database_user) > sizeof(database_user) - 1)
printf(read_warning_str, "user", sizeof(database_user) - 1);
if (fread(config_file_handle, database_name) > sizeof(database_name) - 1)
printf(read_warning_str, "name", sizeof(database_name) - 1);
if (fread(config_file_handle, database_pass) > sizeof(database_pass) - 1)
printf(read_warning_str, "pass", sizeof(database_pass) - 1);
fclose(config_file_handle);

strdel(database_host, strlen(database_host)-2, strlen(database_host));
strdel(database_user, strlen(database_user)-2, strlen(database_user));
strdel(database_name, strlen(database_name)-2, strlen(database_name));
strdel(database_pass, strlen(database_pass)-2, strlen(database_pass));
#if defined mysql_config__OnGameModeInit
mysql_config__OnGameModeInit();
#endif
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
forward mysql_config__OnGameModeInit();
#define OnGameModeInit mysql_config__OnGameModeInit

#endif // !defined USE_MYSQL_CONFIG_FILE
И вот скрин того, как должен выглядеть файл:
http://i.imgur.com/v8dAA60.png
Если данные не указаны, под них обязательно должна быть пустая строка (даже если это последняя строка, как у меня, в случае с паролем)

vovandolg
27.02.2016, 00:53
Вопрос ещё, вот к примеру

#define DATABASE__DEFAULT_HOST "localhost"
хост можно же указать без файла вот тут или обязательно ковырять всё переделывать чтобы с инклуда читалось?

DeimoS
27.02.2016, 01:01
#define USE_MYSQL_CONFIG_FILE//Включение работы с файлом (если закомментировать, данные будут сразу браться из макросов)
//Значения по умолчанию
#define DATABASE__DEFAULT_HOST "localhost"
#define DATABASE__DEFAULT_USER "root"
#define DATABASE__DEFAULT_NAME "sa-mp"
#define DATABASE__DEFAULT_PASSWORD ""


#if !defined USE_MYSQL_CONFIG_FILE

new const database_host[] = DATABASE__DEFAULT_HOST;
new const database_user[] = DATABASE__DEFAULT_USER;
new const database_name[] = DATABASE__DEFAULT_NAME;
new const database_pass[] = DATABASE__DEFAULT_PASSWORD;

#else // !defined USE_MYSQL_CONFIG_FILE

#define DATABASE_CONFIG_FILE_NAME "dbconf.txt"//Имя файла, в котором будут хранится данные
#define DB_CONFIG_FIELD_HOST_NAME "Host"//Имя строки, в которой будет хранится адрес хостинга
#define DB_CONFIG_FIELD_USER_NAME "User"//Имя строки, в которой будет имя пользователя
#define DB_CONFIG_FIELD_DB_NAME "Database"//Имя строки, в которой будет хранится имя БД
#define DB_CONFIG_FIELD_PASS_NAME "Password"//Имя строки, в которой будет хранится пароль от БД
new database_host[64] = DATABASE__DEFAULT_HOST;
new database_user[16] = DATABASE__DEFAULT_USER;
new database_name[32] = DATABASE__DEFAULT_NAME;
new database_pass[32] = DATABASE__DEFAULT_PASSWORD;

public OnGameModeInit()
{
new config_file_handle = ini_openFile(DATABASE_CONFIG_FILE_NAME);
if (config_file_handle == -1)
{
printf("Warning: Не удалось открыть файл \"%s\"! Применение параметров по умолчанию ...", DATABASE_CONFIG_FILE_NAME);
config_file_handle = ini_createFile (DATABASE_CONFIG_FILE_NAME);
if (config_file_handle >= 0)
{
ini_setString (config_file_handle, DB_CONFIG_FIELD_HOST_NAME, database_host);
ini_setString (config_file_handle, DB_CONFIG_FIELD_USER_NAME, database_user);
ini_setString (config_file_handle, DB_CONFIG_FIELD_DB_NAME, database_name);
ini_setString (config_file_handle, DB_CONFIG_FIELD_PASS_NAME, database_pass);
printf("Файл \"%s\" успешно создан.", DATABASE_CONFIG_FILE_NAME);
}
else printf("Не удалось создать файл \"%s\". Код ошибки: %d", DATABASE_CONFIG_FILE_NAME, config_file_handle);
}
else
{
static const read_warning_str[] =
"Warning: Длина строки %s превышает лимит в %d символов.";
new read_error;
if (ini_getString(config_file_handle, "host", database_host) > sizeof(database_host) - 1)
printf(read_warning_str, DB_CONFIG_FIELD_HOST_NAME, sizeof(database_host) - 1), read_error = 1;
if (ini_getString(config_file_handle, "user", database_user) > sizeof(database_user) - 1)
printf(read_warning_str, DB_CONFIG_FIELD_USER_NAME, sizeof(database_user) - 1), read_error = 1;
if (ini_getString(config_file_handle, "user", database_name) > sizeof(database_name) - 1)
printf(read_warning_str, DB_CONFIG_FIELD_DB_NAME, sizeof(database_name) - 1), read_error = 1;
if (ini_getString(config_file_handle, "user", database_pass) > sizeof(database_pass) - 1)
printf(read_warning_str, DB_CONFIG_FIELD_PASS_NAME, sizeof(database_pass) - 1), read_error = 1;
if(!read_error) printf("Данные из \"%s\" успешно загружены", DATABASE_CONFIG_FILE_NAME);
}
ini_closeFile(config_file_handle);
#if defined mysql_config__OnGameModeInit
return mysql_config__OnGameModeInit();
#endif
}

#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
forward mysql_config__OnGameModeInit();
#define OnGameModeInit mysql_config__OnGameModeInit

#endif // !defined USE_MYSQL_CONFIG_FILE
Вот вариант для mxINI. Файл будет выглядеть так:
http://i.imgur.com/LjOxYU6.png
Если файла нет, сервер сам его создаст и запишет в него значения из макросов, в которых указаны значения по умолчанию.

$continue$
27.02.2016, 01:02
Кстати, говоря - велосипеды изобритаете.
Можно воспользоваться, готовой, накатыной лыжней.

тыч (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/CHandle.cpp#L157-L274), тыч (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/main.cpp#L89), тыч (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/natives.cpp#L202-L226), тыщ по ссылке (https://github.com/pBlueG/SA-MP-MySQL/blob/master/tests/test_data/mysql.ini)

DeimoS
27.02.2016, 01:03
Вопрос ещё, вот к примеру

#define DATABASE__DEFAULT_HOST "localhost"
хост можно же указать без файла вот тут или обязательно ковырять всё переделывать чтобы с инклуда читалось?

Сейчас хост читается из файла. Ты как хочешь сделать?

vovandolg
27.02.2016, 01:06
Он читается из текстового файла, а если допустим в этом же инклуде замутить?

DeimoS
27.02.2016, 01:11
Он читается из текстового файла, а если допустим в этом же инклуде замутить?

Ну убери всё, что касается чтения данных о хосте из файла и будет тебе счастье

$continue$
27.02.2016, 01:12
Меня - так понимаю, никто не хочет услышать:

Кстати, говоря - велосипеды изобритаете.
Можно воспользоваться, готовой, накатыной лыжней.

тыч (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/CHandle.cpp#L157-L274), тыч (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/main.cpp#L89), тыч (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/natives.cpp#L202-L226), тыщ по ссылке (https://github.com/pBlueG/SA-MP-MySQL/blob/master/tests/test_data/mysql.ini)

DeimoS
27.02.2016, 01:17
Меня - так понимаю, никто не хочет услышать:

Как ты видишь, твоя лыжа не подойдёт vovandolg. Все тебя услышали

vovandolg
27.02.2016, 01:24
Почитаю потом о других лыжах, может и пригодится куда)

- - - Добавлено - - -

Попытал вариант с mxINI:


[00:20:42] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'тут_название_бд'@'localhost' (using password: YES)
[00:20:42] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'тут_название_бд'@'localhost' (using password: YES)
[00:21:38] [ERROR] CMySQLQuery::Execute[OnPlayerRegCheck(d)] - (error #2006) MySQL server has gone away
[00:21:38] [WARNING] CMySQLQuery::Execute[OnPlayerRegCheck(d)] - lost connection, reconnecting..
[00:21:38] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'тут_название_бд'@'localhost' (using password: YES)
[00:21:45] [ERROR] CMySQLQuery::Execute[()] - (error #2006) MySQL server has gone away
[00:21:45] [WARNING] CMySQLQuery::Execute[()] - lost connection, reconnecting..
[00:21:45] [ERROR] CMySQLConnection::Connect - (error #1045) Access denied for user 'тут_название_бд'@'localhost' (using password: YES)



[00:20:42] Данные из "dbconf.txt" успешно загружены
[00:20:42] Подключиться к базе не удалось
Забыл сказать если это важно юзаю mysql R34
____________________________________________

Решил проблему, в не обратил внимание что в файле наименование значений от предыдущего варианта..

$continue$
27.02.2016, 03:29
Только, что начал писать систему, попробовал использовать mysql_connect_file, оказывается в сурсах на GitHub она есть (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/main.cpp#L89), ещё (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/CHandle.cpp#L157-L274), ещё (https://github.com/pBlueG/SA-MP-MySQL/blob/master/tests/test_data/mysql.ini), ещё (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/natives.cpp#L202-L226) ещё (https://github.com/pBlueG/SA-MP-MySQL/blob/master/a_mysql.inc.in#L160) и ещё (https://github.com/pBlueG/SA-MP-MySQL/blob/master/src/CHandle.cpp#L157-L274), а вот в скомпилированом плагине (release (https://github.com/pBlueG/SA-MP-MySQL/releases/tag/R39-4)) - ее нет. Даже если прописать:


native MySQL:mysql_connect_file(const file_name[] = "mysql.ini");

Сервер все равно будет возвращать ошибку о не задекларированной функции:

http://i.imgur.com/znhpUOB.png

Интересно в чем профит было в сурсах оставить функцию но из release ее удалить? (Я отпишусь на GitHub - maddinat0r/BlueG)


В итоге у меня вышло, что то такое: (не дописанный код, может быть все таки они скомпилируют плагин с данной функцией и тогда можно будет дописать систему. Ну или на крайний случаи можно собрать плагин самому)
Глобально:


const SETTING_MYSQl_NOT_FILE = 0;
const SETTING_MYSQL_FILE = 1;

static const NAME_MYSQl_CONFIG[] = !"mysql.ini";
static const MYSQL_HOST[] = !"127.0.0.1";
static const MYSQL_USER[] = !"root";
static const MYSQL_DATABASE[] = !"database";
static const MYSQL_PASSW0RD[] = !"pass";

Собственно, сама функция:


/*
Если верить логам, то mysql_connect адекватно работает с запакованными строками:
[02:06:00] [ERROR] CMySQLConnection::Connect - (error #2003) Can't connect to MySQL server on '127.0.0.1' (10061)
*/
ConfigMySQL(status_setting = SETTING_MYSQl_NOT_FILE)
{
if(status_setting == SETTING_MYSQl_NOT_FILE)
{
static host[(sizeof(MYSQL_HOST)) * (cellbits / charbits) + 1];
static user[(sizeof(MYSQL_USER)) * (cellbits / charbits) + 1];
static database[(sizeof(MYSQL_DATABASE)) * (cellbits / charbits) + 1];
static password[(sizeof(MYSQL_PASSW0RD)) * (cellbits / charbits) + 1];
strunpack(host, MYSQL_HOST, sizeof(host)); // дабы избежать багов в printf/format
strunpack(user, MYSQL_USER, sizeof(user)); // дабы избежать багов в printf/format
strunpack(database, MYSQL_DATABASE, sizeof(database)); // дабы избежать багов в printf/format
strunpack(password, MYSQL_PASSW0RD, sizeof(password)); // дабы избежать багов в printf/format
print(#Подключения к базе данных из стандартных настроек...);
mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DATABASE, MYSQL_PASSW0RD);
printf("Host: %s | User: %s | Database: %s | Password: %s", host, user, database, password);
}
else
{
// тут блок должен был заполнен работой с mysql_connect_file
}
}


Кому интересно - вопрос на GitHub'e (https://github.com/pBlueG/SA-MP-MySQL/issues/82)

vovandolg
27.02.2016, 03:33
Бл.. разобрался кое как с вариантом от DeimoS, всё робит вроде.

$continue$, У ваших вариантов с DeimoS есть плюсы и минусы какие нибудь ну в разнице кодов?

$continue$
27.02.2016, 03:50
У Дуймоса, используется mxini (include) (http://pastebin.com/KTNpnRbE), а я хотел воспользоваться нативной функции из плагина BlueG (mysql_connect_file) - там используется fstream (https://ru.wikipedia.org/wiki/Fstream) из STL C++ (https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%B0%D1%8F_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B0_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2). Вызов native не во всех случаях быстрей, чем код написанный на Pawn (http://pro-pawn.ru/showthread.php?13493-%D0%9C%D0%B8%D1%84%D1%8B-%D0%BE-Pawn-%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3%D0%B5-7). Возможно у Дуймоса - есть выигрыш в скорости, возможно нет. (не хочется тестировать. Это во первых - компиляция плагина [т.к, у нас же нет в release - mysql_file_connect], во вторых составления профайлера)

+ У меня идет экономия памяти, благодаря упаковки строки.

Приведу пример (когда mxini подтягивать ради config.ini, не менее чем глупо):
Я почти не работал с файлами. Умею. Но не работаю. Мне они кажутся не удобными. Мне нужно сделать подключение из файла к базе данных. У меня есть выбор либо использовать file.inc, либо подтянуть mxini. (я бы конечно, выбрал file.inc. А то это как купить оптически прицел за 10000$ и начать стрелять по воробьям. Так же и с mxini) И это ради одного файла конфигурации?
Я бы лучше вызвал функцию из плагина BlueG - чем стал использовать file.inc/mxini


P.S: Хотя, о чем это я в mxini тоже же вызываются native function.

Бл.. разобрался кое как с вариантом от DeimoS, всё робит вроде.

$continue$, У ваших вариантов с DeimoS есть плюсы и минусы какие нибудь ну в разнице кодов?

DeimoS
27.02.2016, 13:04
+ У меня идет экономия памяти, благодаря упаковки строки.

Приведу пример (когда mxini подтягивать ради config.ini, не менее чем глупо):
Я почти не работал с файлами. Умею. Но не работаю. Мне они кажутся не удобными. Мне нужно сделать подключение из файла к базе данных. У меня есть выбор либо использовать file.inc, либо подтянуть mxini. (я бы конечно, выбрал file.inc. А то это как купить оптически прицел за 10000$ и начать стрелять по воробьям. Так же и с mxini) И это ради одного файла конфигурации?
Я бы лучше вызвал функцию из плагина BlueG - чем стал использовать file.inc/mxini


P.S: Хотя, о чем это я в mxini тоже же вызываются native function.

Если ты прочтёшь вопрос из шапки темы, то поймёшь, что данные для MySQL - это лишь часть тех задач, которые наложены на файл с конфигами (точнее, это просто пример того, как реализовывается запись/вывод данных). В идеале в эти конфиги можно будет записывать кучу разной информации: от настройки MAX_PLAYERS (придётся преобразовать макрос в переменную, но не суть) и до какой-то внутреигровой настройки, типа цен на авто или же какое-то редактируемое прямо из игры сообщение-реклама для всего сервера, которое будет показываться по таймеру. В общем, тут всё ограничивается только твоим желанием и mxINI тебе поможет в реализации всего этого.

И да, ты, видимо, не в курсе, что тебе, по-сути, пришлось бы написать свой mxINI, если бы ты захотел нормально работать с file.inc. Ибо, например, та же функция fread возвращает строку полностью, в том числе и с "\n", пробелами и прочим, что придётся убирать вручную, дабы тот же mySQL смог нормально прочесть эти данные

DeimoS
29.02.2016, 09:10
#define USE_MYSQL_CONFIG_FILE//Включение работы с файлом (если закомментировать, данные будут сразу браться из макросов)
//Значения по умолчанию
#define DATABASE__DEFAULT_HOST "localhost"
#define DATABASE__DEFAULT_USER "root"
#define DATABASE__DEFAULT_NAME "sa-mp"
#define DATABASE__DEFAULT_PASSWORD ""


#if !defined USE_MYSQL_CONFIG_FILE

new const database_host[] = DATABASE__DEFAULT_HOST;
new const database_user[] = DATABASE__DEFAULT_USER;
new const database_name[] = DATABASE__DEFAULT_NAME;
new const database_pass[] = DATABASE__DEFAULT_PASSWORD;

#else // !defined USE_MYSQL_CONFIG_FILE

#define DATABASE_CONFIG_FILE_NAME "dbconf.txt"//Имя файла, в котором будут хранится данные
#define DB_CONFIG_FIELD_HOST_NAME "Host"//Имя строки, в которой будет хранится адрес хостинга
#define DB_CONFIG_FIELD_USER_NAME "User"//Имя строки, в которой будет имя пользователя
#define DB_CONFIG_FIELD_DB_NAME "Database"//Имя строки, в которой будет хранится имя БД
#define DB_CONFIG_FIELD_PASS_NAME "Password"//Имя строки, в которой будет хранится пароль от БД
new database_host[64] = DATABASE__DEFAULT_HOST;
new database_user[16] = DATABASE__DEFAULT_USER;
new database_name[32] = DATABASE__DEFAULT_NAME;
new database_pass[32] = DATABASE__DEFAULT_PASSWORD;

public OnGameModeInit()
{
new config_file_handle = ini_openFile(DATABASE_CONFIG_FILE_NAME);
if (config_file_handle == -1)
{
printf("Warning: Не удалось открыть файл \"%s\"! Применение параметров по умолчанию ...", DATABASE_CONFIG_FILE_NAME);
config_file_handle = ini_createFile (DATABASE_CONFIG_FILE_NAME);
if (config_file_handle >= 0)
{
ini_setString (config_file_handle, DB_CONFIG_FIELD_HOST_NAME, database_host);
ini_setString (config_file_handle, DB_CONFIG_FIELD_USER_NAME, database_user);
ini_setString (config_file_handle, DB_CONFIG_FIELD_DB_NAME, database_name);
ini_setString (config_file_handle, DB_CONFIG_FIELD_PASS_NAME, database_pass);
printf("Файл \"%s\" успешно создан.", DATABASE_CONFIG_FILE_NAME);
}
else printf("Не удалось создать файл \"%s\". Код ошибки: %d", DATABASE_CONFIG_FILE_NAME, config_file_handle);
}
else
{
static const read_warning_str[] =
"Warning: Длина строки %s превышает лимит в %d символов.";
new read_error;
if (ini_getString(config_file_handle, "host", database_host) > sizeof(database_host) - 1)
printf(read_warning_str, DB_CONFIG_FIELD_HOST_NAME, sizeof(database_host) - 1), read_error = 1;
if (ini_getString(config_file_handle, "user", database_user) > sizeof(database_user) - 1)
printf(read_warning_str, DB_CONFIG_FIELD_USER_NAME, sizeof(database_user) - 1), read_error = 1;
if (ini_getString(config_file_handle, "user", database_name) > sizeof(database_name) - 1)
printf(read_warning_str, DB_CONFIG_FIELD_DB_NAME, sizeof(database_name) - 1), read_error = 1;
if (ini_getString(config_file_handle, "user", database_pass) > sizeof(database_pass) - 1)
printf(read_warning_str, DB_CONFIG_FIELD_PASS_NAME, sizeof(database_pass) - 1), read_error = 1;
if(!read_error) printf("Данные из \"%s\" успешно загружены", DATABASE_CONFIG_FILE_NAME);
}
ini_closeFile(config_file_handle);
#if defined mysql_config__OnGameModeInit
mysql_config__OnGameModeInit();
#endif
}

#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
forward mysql_config__OnGameModeInit();
#define OnGameModeInit mysql_config__OnGameModeInit

#endif // !defined USE_MYSQL_CONFIG_FILE
Вот вариант для mxINI. Файл будет выглядеть так:
http://i.imgur.com/LjOxYU6.png
Если файла нет, сервер сам его создаст и запишет в него значения из макросов, в которых указаны значения по умолчанию.

В этом коде вот тут

#if defined mysql_config__OnGameModeInit
mysql_config__OnGameModeInit();
#endif
Ошибочка. Должно быть так

#if defined mysql_config__OnGameModeInit
return mysql_config__OnGameModeInit();
#endif
Исправил тот пост

vovandolg
02.03.2016, 20:00
В этом коде вот тут

#if defined mysql_config__OnGameModeInit
mysql_config__OnGameModeInit();
#endif
Ошибочка. Должно быть так

#if defined mysql_config__OnGameModeInit
return mysql_config__OnGameModeInit();
#endif
Исправил тот пост
Какая ошибка может вылезти если не поставить возврат?

DeimoS
02.03.2016, 21:55
Какая ошибка может вылезти если не поставить возврат?

Если более одного перехвата OnGameModeInit, компилятор начнёт ругаться на то, что OnGameModeInit должна возвращать какое-либо значение

Можно было и так сделать:

#if defined mysql_config__OnGameModeInit
mysql_config__OnGameModeInit();
#endif
return 1;
}
не принципиально

$continue$
02.03.2016, 22:27
Если все таки нужно в приципе могу скомпилировать плагины под Windows и Linux в субботу.

vovandolg
03.03.2016, 02:32
И в разработки закинь или куда там положено :3
Попробуем что там за вариант..