Jump to content


Photo

Как работает extDB2


Best Answer dos622 , 21 December 2015 - 21:37

ну как работает, создаеться уникальное соединение:

DBConId = str(round(random(999999)));
_result = call compile ("extDB2" callExtension format["9:ADD_DATABASE_PROTOCOL:nanmedatabase:SQL_CUSTOM_V2:%1:nanmedatabase", DBConId]);
 

(у автора мода есть стандартный пример)

а потом

DBConId  закидываются данный в базу или читаются

MY_EXT_LoadWr ={
private["_data","_query","_result"];
_data = _this;
_query = format["%1:%2:%3",0,DBConId,_data];
_result = call compile ("extDB2" callExtension _query);
(_result select 1) select 0
};

типо такого:

_playerData = format["loadPlayer:%1", _playerUID] call MY_EXT_LoadWr;

а в самом конфиге extDB2, формируеться обычны SQL запрос


[loadPlayer]
SQL1_1 = SELECT Worldspace, Inventory, Uniform, Vest, Backpack, Datestamp, Experience FROM character WHERE PlayerUID = ?
Number of Inputs = 1
SQL1_INPUTS = 1
OUTPUT = 1,2,3,4,5,6-STRING,7-STRIN

 

Go to the full post


  • Please log in to reply
51 replies to this topic

#21 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 23 December 2015 - 19:55

 

Попытаюсь объяснить:

Моделируем ситуацию, когда к одному и тому же значению в базе одновременно обращаются несколько клиентов с целью редактирования его. Например клиент №1 читает значение , обрабатывает его и записывает результат в базу, но в момент обработки клиентом №1, клиент №2 тоже считал, обработал, и уже записал свой результат (по каким либо причинам №2 сделал это на порядок быстрей №1, возможно выполнив процедуру над этими данными отличной от процедуры, которую выполнял клиент №1). Получается клиент №1 проигнорировал результат полученный и записанный клиентом №2, и перезаписал его своим, т.к. входящим значением для него было значение еще не измененное клиентом №2.

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

 

Просто в миссии над которой я работаю (пытаюсь работать), очень много общих значений динамически изменяемых (возможно несколькими, одновременно) клиентами. Но "возможно несколькими, одновременно" - получается, что невозможно  :).

 

Я правильно понял вас: все операции на сервере выполняются строго из сформированной очереди, последовательно и можно не париться?

 

Давайте пристальнее посмотрим на команду

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

Какова суть этой команды? Правильно, вызывать исполняемый код, на предмет обработки нового значения, при изменении значения некой глобальной, публичной переменной.

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

// При инициализации сервера, в неком месте

CostCondom = 1;  // 1 тугрик
publicVariable "CostCondom";
"CostCondom" addPublicVariableEventHandler {
	_newCost = _this select 1;
	/*
		производим запись новой стоимости презерватива в любой выбранный вами тип бызы данных
	*/
};

// На клиентах

if (isNil "CostCondom") then {
	hintSilent "Стоимость презервативов не определена. Приносим извинения за не удобство.";
} else {
	_costCondom = CostCondom;
	_newCostCondom = _costCondom * 2; // вычисляется новая стоимость
	CostCondom = _newCostCondom;
	publicVariableServer "CostCondom"; // новое значение стоимости отправляется серверу
};

Но самый разумный, и более правильный способ определять текущую стоимость, предоставить серверу, а с клиентов передавать некий набор данных, опираясь на которые сервер и будет определять текущую стоимость.


Edited by SteelRat, 23 December 2015 - 20:25.

  • 0

#22 OFFLINE   Dupont

Dupont

    Ефрейтор

  • Пользователи
  • 48 posts
  • Откуда:Eburg

Posted 23 December 2015 - 20:15

 

Давайте пристальнее посмотрим на команду

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

Какова суть этой команды? Правильно, вызывать исполняемый код, на предмет обработки нового значения, при изменении значения некой глобальной, публичной переменной.

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

 

 

Спс


Edited by Dupont, 23 December 2015 - 20:34.

  • 0

#23 OFFLINE   Dupont

Dupont

    Ефрейтор

  • Пользователи
  • 48 posts
  • Откуда:Eburg

Posted 23 December 2015 - 20:34



CostCondom = 1;  // 1 тугрик
publicVariable "CostCondom";
"CostCondom" addPublicVariableEventHandler {
	_newCost = _this select 1;
	/*
		производим запись новой стоимости презерватива в любой выбранный вами тип бызы данных
	*/
};

// На клиентах

if (isNil "CostCondom") then {
	hintSilent "Стоимость презервативов не определена. Приносим извинения за не удобство.";
} else {
	_costCondom = CostCondom;
	_newCostCondom = _costCondom * 2; // вычисляется новая стоимость
	CostCondom = _newCostCondom;
	publicVariableServer "CostCondom"; // новое значение стоимости отправляется серверу
};

Но самый разумный, и более правильный способ определять текущую стоимость, предоставить серверу, а с клиентов передавать некий набор данных, опираясь на которые сервер и будет определять текущую стоимость.

 

Согласен на все 100. Но думаю, что пойду немного дальше, буду вызывать на выполнение хранимые процедуры/функции MySQL, с заданным набором параметров от клиента и пущай база возвращает результаты.

 

по сути проект превращается в обычное клиент-серверное приложение, диалоговая форма у конечного пользователя - это арма клиент, серверная часть - это арма сервер + полноценная субд.


  • 0

#24 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 23 December 2015 - 20:34

 

P.S.

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

 

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

А гарантию и идеализацию вы получите качественно написанным и производительным, кодом самой армочки.


  • 0

#25 OFFLINE   Dupont

Dupont

    Ефрейтор

  • Пользователи
  • 48 posts
  • Откуда:Eburg

Posted 23 December 2015 - 20:40

Всем спасибо за участие !!!


  • 0

#26 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 23 December 2015 - 20:41

 

Согласен на все 100. Но думаю, что пойду немного дальше, буду вызывать на выполнение хранимые процедуры/функции MySQL, с заданным набором параметров от клиента и пущай база возвращает результаты.

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

 

Рассмотрите лучше вариант

Клиенты - некий необходимый набор данных

Сервер - вычисление и запись в базу


  • 0

#27 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 23 December 2015 - 20:52

ЗЫ

И на последок.

Я вижу интересную тенденцию от БИСов.

Возьмём пресловутый дайз, мод был реализован на базе SQL, а вот стандалоне уже не работает с SQL!

Поднимается сервер с PHP, а данные хранятся в формате JSON, это из Jscript.

Интересно, с чего бы так.


  • 0

#28 OFFLINE   Dupont

Dupont

    Ефрейтор

  • Пользователи
  • 48 posts
  • Откуда:Eburg

Posted 23 December 2015 - 20:53

 

 

Согласен на все 100. Но думаю, что пойду немного дальше, буду вызывать на выполнение хранимые процедуры/функции MySQL, с заданным набором параметров от клиента и пущай база возвращает результаты.

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

 

Рассмотрите лучше вариант

Клиенты - некий необходимый набор данных

Сервер - вычисление и запись в базу

 

А зачем мне при выполнение функции в БД, еще какие либо значения из вне, кроме тех которые заранее предопределены и заранее переданы на выполнение???

 

Клиенты - некий необходимый набор данных

Сервер - вычисление и запись в базу

 

Так и планируется)


  • 0

#29 OFFLINE   Dupont

Dupont

    Ефрейтор

  • Пользователи
  • 48 posts
  • Откуда:Eburg

Posted 23 December 2015 - 20:58

ЗЫ

И на последок.

Я вижу интересную тенденцию от БИСов.

Возьмём пресловутый дайз, мод был реализован на базе SQL, а вот стандалоне уже не работает с SQL!

Поднимается сервер с PHP, а данные хранятся в формате JSON, это из Jscript.

Интересно, с чего бы так.

 

Я так понимаю, они использование джавы пытаются популяризировать в своих продуктах, это наверно и к лучшему. Начало положено вроде как в хеликоптере.


  • 0

#30 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 23 December 2015 - 21:00

 

А зачем мне при выполнение функции в БД, еще какие либо значения из вне, кроме тех которые заранее предопределены и заранее переданы на выполнение???

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

Вряд ли вы или кто либо другой может предусмотреть на 100 процентов развитие событий на перёд.


 

ЗЫ

И на последок.

Я вижу интересную тенденцию от БИСов.

Возьмём пресловутый дайз, мод был реализован на базе SQL, а вот стандалоне уже не работает с SQL!

Поднимается сервер с PHP, а данные хранятся в формате JSON, это из Jscript.

Интересно, с чего бы так.

 

Я так понимаю, они использование джавы пытаются популяризировать в своих продуктах, это наверно и к лучшему. Начало положено вроде как в хеликоптере.

 

От Jsctipt там только формат данных.

PHP


  • 0

#31 OFFLINE   Dupont

Dupont

    Ефрейтор

  • Пользователи
  • 48 posts
  • Откуда:Eburg

Posted 23 December 2015 - 21:14

 

 

А зачем мне при выполнение функции в БД, еще какие либо значения из вне, кроме тех которые заранее предопределены и заранее переданы на выполнение???

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

Вряд ли вы или кто либо другой может предусмотреть на 100 процентов развитие событий на перёд.

 

 

С этим готов поспорить, всегда можно отредактировать/расширить функционал в зависимости от потребностей, самое главное, что это все находится в одном месте (на своих местах) и даже через год, когда потребуется внести изменения , ты знаешь где это искать. Вроде как , четкое распределение предметных областей. Арма занята своим делом, СУБД своим. Больше чем на 1000% уверен, что спроектированная на данный момент структура базы будет менять в зависимости от все более возрастающих потребностей во время разработки и сопровождения. Ну как всегда вообщем, сначала хотели утюг, в итоге оказалось, что нужен самолет.


Edited by Dupont, 23 December 2015 - 21:24.

  • 0

#32 OFFLINE   dos622

dos622

    Ст. Прапорщик

  • Пользователи
  • 702 posts

Posted 23 December 2015 - 23:18


можно любые команды и запросы поддерживаемые СУБД помещать.

 

совершенно верно.


  • 0

#33 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 24 December 2015 - 17:45

 

 

 

А зачем мне при выполнение функции в БД, еще какие либо значения из вне, кроме тех которые заранее предопределены и заранее переданы на выполнение???

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

Вряд ли вы или кто либо другой может предусмотреть на 100 процентов развитие событий на перёд.

 

 

С этим готов поспорить, всегда можно отредактировать/расширить функционал в зависимости от потребностей, самое главное, что это все находится в одном месте (на своих местах) и даже через год, когда потребуется внести изменения , ты знаешь где это искать. Вроде как , четкое распределение предметных областей. Арма занята своим делом, СУБД своим. Больше чем на 1000% уверен, что спроектированная на данный момент структура базы будет менять в зависимости от все более возрастающих потребностей во время разработки и сопровождения. Ну как всегда вообщем, сначала хотели утюг, в итоге оказалось, что нужен самолет.

 

 

Знаете, тут даже спорить не о чем по одной и очень веской причине.

То как вы мыслите реализовать работу с базой делает из неё, то есть базы, проходной двор для любого мимо проходящего юзера тире клиента.

А у любого мимо проходящего юзера тире клиента вполне могут быть свои планы по поводу вашей базы, вы же открываете доступ к базе любому клиенту, это как громко объявить о приглашении по вандалить в базе. И самое весёлое, для этого не придётся даже запускать саму арму. Ибо вы сами делаете базу открытой для изменения данных кем угодно. 


  • 0

#34 OFFLINE   dos622

dos622

    Ст. Прапорщик

  • Пользователи
  • 702 posts

Posted 24 December 2015 - 21:55

SteelRat,

тоесть? 


  • 0

#35 OFFLINE   Dupont

Dupont

    Ефрейтор

  • Пользователи
  • 48 posts
  • Откуда:Eburg

Posted 25 December 2015 - 09:43

Знаете, тут даже спорить не о чем по одной и очень веской причине.

То как вы мыслите реализовать работу с базой делает из неё, то есть базы, проходной двор для любого мимо проходящего юзера тире клиента.

А у любого мимо проходящего юзера тире клиента вполне могут быть свои планы по поводу вашей базы, вы же открываете доступ к базе любому клиенту, это как громко объявить о приглашении по вандалить в базе. И самое весёлое, для этого не придётся даже запускать саму арму. Ибо вы сами делаете базу открытой для изменения данных кем угодно. 

 

 

Не понимаю, каким образом я открою базу данных любому для изврата над данными :pardon: . База ведь не имеет открытый доступ. Хранимые процедуры и ф-ции по определению храняться в самой БД и доступны на выполнение, только  зарегистрированным пользователям имеющим соответствующие права, как собственно и данные. Или вы имеете ввиду какой то несанкционированный доступ к СУБД из миссии крутящейся на клиенте? Тогда и ваш подход к управлению данными ничем не отличается от моего в плане безопасности. Не могли бы вы поподробней описать, что вы имеете ввиду...

 

Может я опять как то криво изложил свой подход, попробую объяснить :) :

Есть вообщем некое значение V1 - (кол-во презиков на острове) хранящиеся в БД, есть набор процедур и функции определенных мной в БД, которые обрабатывают данное значение . Мне необходимо определить текущее значение и в зависимости от результата, провести какие либо манипуляции над ним и перезаписать его.

Клиент запускает вызов нужной хранимой процедуры на стороне сервера БД, с определенным списком параметров. Например увеличить кол-во презервативов на 100, если на данный момент оно меньше 1.

 

Арма клиент:        выполнить в бд "процедура_гондон_+(100)" ;   И ВСЕ, ТОЛЬКО ВЫЗОВ !!!

 

Так определена эта процедура в моей базе, в СУБД MySQL :

                                                                         

                                                      create procedure процедура_гондон_+ (in парам_кол int)

                                                      begin

                                                            LOCK TABLES contaception WRITE;

                                                            select V1 into lv_kol_gondon from contaception where name = "gondon";

                                                            if ( lv_kol_gondon < 1 )  then

                                                                  update contaception set V1 = V1 + парам_кол where name = "gondon";

                                                                  commit;        -------если автокоммит оффнут

                                                            end if;

                                                            UNLOCK TABLES;

                                                      end;

 

Как мы все можем заметить, выполнение хранимых процедур и ф-ций ко всему прочему несет в себе обалденный ПРОФИТ - сокращает сетевой трафик до минимума, т.к. мы не получаем и не передаем никаких промежуточных значений, анализируя данные и выполняя манипуляции над ними, все это делается на сервере БД. Все сводится к отправке необходимого набора параметров при старте и чтению результата в итоге (если это функция).

 

Как вы не запустив арму, либо незаконнектившись в серверу БД можете вообще , что то сделать с данными или выполнить хранимый в ней код, чет я аще вас не понимаю?


Edited by Dupont, 25 December 2015 - 14:07.

  • 0

#36 OFFLINE   dos622

dos622

    Ст. Прапорщик

  • Пользователи
  • 702 posts

Posted 25 December 2015 - 11:08

я бы еще добавил, что права доступа в mySQL раздаються не просто так:)

Плюс каждому разрешенному юзеру можно назначить с какого IP адреса он заходит в бд, по умолчанию 127.0.0.1 это локал хост. также брандмауром регулируеться доступ к порту БД. вариантов как закрыть масса. то что не знающие пользователи раздают всем права root и доступ со всей вселенной, это проблемы исключительно этих пользователей, но ни как не БД.


  • 0

#37 OFFLINE   Dupont

Dupont

    Ефрейтор

  • Пользователи
  • 48 posts
  • Откуда:Eburg

Posted 25 December 2015 - 11:40

я бы еще добавил, что права доступа в mySQL раздаються не просто так :)

Плюс каждому разрешенному юзеру можно назначить с какого IP адреса он заходит в бд, по умолчанию 127.0.0.1 это локал хост. также брандмауром регулируеться доступ к порту БД. вариантов как закрыть масса. то что не знающие пользователи раздают всем права root и доступ со всей вселенной, это проблемы исключительно этих пользователей, но ни как не БД.

Согласен, причем разными ролями выданными конкретным юзерам , можно ограничить их действия над какими либо объектами базы, ну там: эту таблицу ты можешь только читать (GRANT SELECT ...), эту можно редактировать (GRANT UPDATE ...), а такую хранимую процедуры ты выполнить можешь (GRANT EXECUTE ...). Вообщем GRANT ...  и т.д. Вот и не понятно, что вообщем имел в виду SteelRat


Edited by Dupont, 25 December 2015 - 12:11.

  • 0

#38 OFFLINE   Dupont

Dupont

    Ефрейтор

  • Пользователи
  • 48 posts
  • Откуда:Eburg

Posted 25 December 2015 - 12:37

dos622, подскажите.

 

Работу с данными хочу своять так, чтоб на стороне клиента, не проскакивал ни один SQL запрос, только вызов хранимых процедур и функций.

 

Если в конфиг extDB2, куда пишутся запросы,  прописать вызов хранимой функции, работать будет?

 

 

Типа такого:

 

_playerData = format["callFunction1:%1,%2,%3", p1,p2,p3] call MY_EXT_LoadWr;

 

конфиг extDB2

 

[callFunction1]
SQL1_1 = call хранимая_функция_базы (?,?,?);

 ...
 блаблабля 

 ...

 

P.S.

(Пока к сожалению не могу добраться до компа с армой, чтоб вообще хоть мод скачать :pardon:)

 


Edited by Dupont, 25 December 2015 - 14:20.

  • 0

#39 OFFLINE   dos622

dos622

    Ст. Прапорщик

  • Пользователи
  • 702 posts

Posted 25 December 2015 - 22:10

 

dos622, подскажите.

 

Работу с данными хочу своять так, чтоб на стороне клиента, не проскакивал ни один SQL запрос, только вызов хранимых процедур и функций.

 

Если в конфиг extDB2, куда пишутся запросы,  прописать вызов хранимой функции, работать будет?

 

 

Типа такого:

 

_playerData = format["callFunction1:%1,%2,%3", p1,p2,p3] call MY_EXT_LoadWr;

 

конфиг extDB2

 

[callFunction1]
SQL1_1 = call хранимая_функция_базы (?,?,?);

 ...
 блаблабля 

 ...

 

P.S.

(Пока к сожалению не могу добраться до компа с армой, чтоб вообще хоть мод скачать :pardon:)

 

 

не так:)

клиент просто передает команду серверу, а сервер ее выполняет. 

 

что касаеться выполнение extDB

то в движение ExtDB приводиться:

"extDB2" callExtension _query;

где переменная _query имеет значение:

format["%1:%2:%3",0,ServerDBConId,_parameters];

сооветственно переменная _parameters

хранит в себе значения которые вы в нее передали вызовом функции:

call MY_EXT_LoadWr;

и имеет значение:

format["callFunction1:%1,%2,%3", p1,p2,p3]

где callFunction1

это сам SQL запрос.


  • 0

#40 OFFLINE   Dupont

Dupont

    Ефрейтор

  • Пользователи
  • 48 posts
  • Откуда:Eburg

Posted 26 December 2015 - 00:11


где callFunction1

это сам SQL запрос.

 

в разделе 

[callFunction1]

команда на выполнение функции 

SQL1_1 = call хранимая_функция_базы

 

или все таки SQL запрос должен быть: select, update, insert, delete?


Edited by Dupont, 26 December 2015 - 00:14.

  • 0




Яндекс.Метрика