Вопросы

Привет всем! 1. Хочу поинтересоваться, возможно ли одновременное сосуществование двух разных ORM_ID? К чему я веду? Например, есть функция загрузки данных игрока, ей присваивается ORM_ID по которому она и осуществляет запросы, но мне нужно после загрузки игрока загрузить автомобили, так же через ORM. Для того, чтобы это сделать, мне нужно вызвать orm_destroy и "убить" предыдущий ORM-сценарий, но тогда, в дальнейшем мне недоступно, к примеру, то же сохранение игрока. Как быть? Каким образом можно реализовать через ORM-сценарии другие функции загрузок: машин, домов, кланов и т.д. 2. И да, возможно ли сразу полная загрузка всех строк из таблицы, а не по отдельности для каждого игрока? (Ведь, cache_get_row_count тут уже не проканает...)

Поделиться сообщением


Ссылка на сообщение

5 ответов на этот вопрос

  • 0

@xqtOr, а Вы на WIKI читали за ORM? Кажется, там есть ответ на Ваш первый вопрос. Тык и тык.

Поделиться сообщением


Ссылка на сообщение
  • 0
16 минут назад, odosenok сказал:

@xqtOr, а Вы на WIKI читали за ORM? Кажется, там есть ответ на Ваш первый вопрос. Тык и тык.

Да, читал. Я, пошарив далеко не на первых страницах гугла понял, что нужно использовать orm_apply_cache
Вы дали первую ссылку (github) на систему регистрации основанную на ORM, именно эту заготовку я у себя и использую!
Давайте, я Вам постараюсь все внятно объяснить и с участками кода, дабы Вы поняли, чего я хочу добиться.
В системе, которую Вы скинули, которую я и использую, есть паблик загрузки данных игрока:
 

forward LoadingPlayerData(playerid);
public LoadingPlayerData(playerid)
{
	g_MysqlRaceCheck[playerid]++;

	// reset player data
	static const empty_player[E_PLAYERS];
	Player[playerid] = empty_player;

	GetPlayerName(playerid, Player[playerid][Name], MAX_PLAYER_NAME);

	// create orm instance and register all needed variables
	new ORM: ormid = Player[playerid][ORM_ID] = orm_create("players", g_SQL);

	orm_addvar_int(ormid, Player[playerid][ID], "id");
	orm_addvar_string(ormid, Player[playerid][Name], MAX_PLAYER_NAME, "username");
	orm_addvar_string(ormid, Player[playerid][Password], 65, "password");
	orm_addvar_string(ormid, Player[playerid][Salt], 17, "salt");
	orm_addvar_float(ormid, Player[playerid][X_Pos], "x");
	orm_addvar_float(ormid, Player[playerid][Y_Pos], "y");
	orm_addvar_float(ormid, Player[playerid][Z_Pos], "z");
	orm_addvar_float(ormid, Player[playerid][A_Pos], "angle");
	orm_addvar_int(ormid, Player[playerid][Interior], "interior");
	orm_setkey(ormid, "username");

	// tell the orm system to load all data, assign it to our variables and call our callback when ready
	orm_load(ormid, "OnPlayerDataLoaded", "dd", playerid, g_MysqlRaceCheck[playerid]);
	return 1;
}

В которой мы объявляем новый ORM-сценарий (кстати, здесь загрузка идет для конкретного подключившегося игрока, о чем, в дальнейшем, я буду говорить)

new ORM: ormid = Player[playerid][ORM_ID] = orm_create("players", g_SQL);

И работает этот сценарий вплоть до OnPlayerDisconnect, где срабатывает orm_destroy и данный сценарий удаляется.
Теперь, давайте создадим такую же функцию загрузки для транспорта (enum'ы я здесь прописывать не буду, просто сразу перейдем к функции)
И сразу же возникает вопрос, как нам загружать транспорт при коннекте, если загрузка идет для конкретного игрока, значит она будет и для конкретного транспорта... Тогда как к нему обращаться? Отсюда и вытекает способ с использованием orm_apply_cache, для загрузки сразу всех автомобилей из таблицы. Расписывать Enum с данными автомобиля я не стал, представим, что он есть.

forward OnVehiclesLoad();   
public OnVehiclesLoad()   
{   
	for(new r=0; r < cache_num_rows(); ++r)
	{   
    	new ORM:ormid = Vehicle[r][ORM_ID] = orm_create("vehicles");   // тут мы так же создаем ORM_ID с которым, впоследствии, будет конфликт
	
	    orm_addvar_int(ormid, Vehicle[r][ID], "ID"); //это наш ключ   
	    orm_addvar_int(ormid, Vehicle[r][ModelID], "ModelID");   
	    orm_addvar_int(ormid, Vehicle[r][Color1], "Color1");   
	    orm_addvar_string(ormid, Vehicle[r][Plate], 32, "Plate"); 
                                      
		orm_setkey(ormid, "ID");
                                      
	    orm_apply_cache(ormid, r);   
	}   
	return 1;   
}

Как Вы могли заметить, тут мы так же создаем ORM_ID, и вот в чем загвоздка, если мы будем это так использовать, то автомобили просто не будут загружаться, ибо мы уже используем этот ORM_ID в загрузке игроков. Если мы пропишем в эту функцию, в начале, orm_destroy(Player[playerid][ORM_ID]); тем самым убив предыдущий ORM сценарий, то наша функция выполнится, но сохранение игрока при дисконнекте, которое зависело от Player[playerid][ORM_ID] - не произойдет.

Отсюда и вопрос, как быть?
Да и дело не только в этом, допустим, загрузили мы авто таким способом, но как мы их свяжем с игроком? Устанавливать в качестве ключа - имя игрока и постоянно сравнивать строки? Тогда Vehicle[MAX_VEHICLES][E_VEHICLES] должно выглядеть как Vehicle[MAX_PLAYERS_NAME][E_VEHICLES]... а это уже выдаст ошибки при выполнении.
В общем, я не до конца понимаю, как реализовать различные загрузки данных и как их одновременно выполнять и завершать.

Поделиться сообщением


Ссылка на сообщение
  • 0

Так-с, начал юзать способ с orm_apply_cache который описал выше и отправлять запрос 

mysql_tquery(g_SQL, "SELECT * FROM `vehicles`", "OnVehiclesLoad", "d", playerid);

Получать авто я теперь могу, но только получать! (предварительно, в БД, от руки сам засунул пару строк).
Осталось 2 вопроса, как мне создавать строку в базе данных, при регистрации игрока без создания прямого запроса:

mysql_tquery(g_SQL, "INSERT INTO `vehicles` (`owner`,`model`) VALUES ('William_Wolf','562')"); // как пример запроса

И, самое главное - как связать эти строки с игроком? Как обращаться к определенной машине? Мне нужно каждый раз вытаскивать owner и сравнивать с ником?

Поделиться сообщением


Ссылка на сообщение
  • 0

Пока свою думу думал, нашел такой выход, но мы же с Вами понимаем, что это костыли и, при 10.000 строк в БД, это может очень негативно сказаться на скорости и работе, ибо если машина человека в БД на 9000 строке, то это фиаско... Я прокомментировал в коде...
Может можно это как-то более аккуратно сделать?

forward OnVehiclesLoad(playerid);
public OnVehiclesLoad(playerid)
{
	for(new r = 0; r < cache_num_rows(); ++r)
	{
    	new ORM: ormid = Vehicle[r][ORM_ID] = orm_create("vehicles");

	    orm_addvar_int(ormid, Vehicle[r][ID], "id");
	    orm_addvar_string(ormid, Vehicle[r][Owner], MAX_PLAYER_NAME, "owner");
		orm_addvar_int(ormid, Vehicle[r][Veh], "veh_1");
		orm_setkey(ormid, "owner");

	    orm_apply_cache(ormid, r);

		if(!strcmp(Vehicle[r][Owner], Player[playerid][Name], false, 25)) // каждую получаемую строку из бд, содержащюю данные о машине, сравниваем по параметру Owner с именем игрока, зашедшего на сервер
		{
			VehIdForPlayer[playerid] = r; // приравниваем к сторонней переменной номер строки в базе данных, по которому мы потом сможем обращаться к этой строке и вытаскивать нужные данные о машине, принадлежащей игроку
		}
	}
	return 1;
}

 

Поделиться сообщением


Ссылка на сообщение
  • 0

Со всем разобрался. Тема закрыта, если кому-то интересно, могу написать урок, такого на многих pawn порталах не найдете:D

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • Узбек
      От Узбек
      Всем добрый вечер ребят! 
      Я начинающий, сегодня я вам сливаю команду 2(шт) на технические работы
      Ловите 
       
    • nazpol9
      От nazpol9
      Привет всем.

      У меня имеется мод для самп сервера и VPS с Ubuntu, на котором я пытаюсь его запустить.

      В чем суть проблемы: при запуске samp03svr, сервер запускается, но на версии 0.3.DL R-1. Когда я пытаюсь запустить этот же мод локально на Windows, сервер работает на версии 0.3.7 и я могу зайти на него без клиента 0.3.DL.

      Для решения этой проблемы я уже пробовал заменять инклуды и исполнительные файлы теми, что есть в архивах на официальном сайте сампа, перекомпилировал мод, и ничего не изменилось.
       
      #include <a_samp> #include <a_mysql> #include <foreach> #include <Pawn.RakNet> #include <streamer> #include <sscanf2> #include <float2> #include <crashdetect> #include <fmt> #include <a_http> #include <Pawn.CMD> #include <Pawn.Regex> #include <requests> #include <callbacks> #include <MD5> #include <mxdate> #include <TOTP> #include <gvar> #include <md-sort> #include <nex-ac> #include <weapon-config> #include <discord-connector> #include <3DTryg> #include <textdraw-streamer>  
      plugins crashdetect.so streamer.so textdraw-streamer.so sscanf.so pawnraknet.so pawncmd.so mysql.so requests.so profiler.so pawnregex.so TOTP.so gvar.so discord-connector.so

      Если у кого-то будут какие-либо догадки, прошу ими поделиться, если понадобится больше информации - я постараюсь её предоставить.