MySQL get rows
#1

Code:
#define pinfo pDB[playerid]
#define pid playerid
#define ti strval(tmp)

enum
{
	GANG_CREATE,
	GANG_CREATE2,
	GANG_MEMBERS
};

forward updateGang(type, pid);
public updateGang(type, pid)
{
	switch(type)
	{
		case GANG_MEMBERS:
		{
			new rows, fields;
			cache_get_data(rows, fields);
			SendClientMessage(pid, -1, F("members: %i / %i",getMembers(pinfo[gang]), rows));
		}
		case GANG_CREATE2:
		{
			mysql_function_query(1, F("SELECT id FROM gaujos WHERE leader = %i", pinfo[DBID]), true, "updateGang", "ii", GANG_CREATE, pid);
		}
		case GANG_CREATE:
		{
			new tmp[11];
			cache_get_row(0, 0, tmp);
			addMember(pid, ti);
		}
	}
}

function::createGang(pid, name[])
{
	mysql_real_escape_string(name, name);
	mysql_function_query(1, F("INSERT INTO `gangs` (gang,leader) VALUES ('%s',%i)", name, pinfo[DBID]), true, "updateGang", "ii", GANG_CREATE2, pid);
}

function::addMember(pid, id)
{
	pinfo[gang] = id;
	mysql_function_query(1, F("UPDATE players SET gang = %i WHERE id = %i", id, pinfo[DBID]), false, "", "");
}

function::getMembers(id)
{
	new count = 0;
	foreach(new i : Player)
	{
		if(pDB[i][gang] == id)
			count++;
	}
	return count;
}

function::isPlayerInAnyGang(pid)
{
	if(pinfo[gang]) return 1;
	return 0;
}

YCMD:gang_new(playerid, params[], help)
{
	if(!isPlayerInAnyGang(pid))
	{
		createGang(pid, params);
	}
	return 1;
}

YCMD:gang_check(playerid, params[], help)
{
	mysql_function_query(1, F("SELECT * FROM players WHERE gang = '%i'", pinfo[gang]), true, "updateGang", "ii", GANG_MEMBERS, pid);
	return 1;
}
problem is when i type /gang_new hello
and then /gang_check
message are "members: 1 / 0".

why cache_get_data returns 0 rows?

mysql log:


[20:38:36] >> mysql_query_callback( Connection handle: 1 )
[20:38:36] Passing query INSERT INTO `gangs` (gang,leader) VALUES ('lollypop',71) | ii
[20:38:36] ProcessQueryThread(updateGang) - Query was successful. (INSERT INTO `gangs` (gang,leader) VALUES ('lollypop',71))
[20:38:36] ProcessQueryThread(updateGang) - Data caching enabled.
[20:38:36] CMySQLHandler::StoreResult() - No data to store.
[20:38:36] CMySQLHandler::ProcessQueryThread() - Data is getting passed to ->ProcessTick()
[20:38:36] updateGang(ii) - Threaded function called.
[20:38:36] >> mysql_query_callback( Connection handle: 1 )
[20:38:36] ProcessTick() - The cache has been cleared.
[20:38:36] Passing query SELECT id FROM gangs WHERE leader = 71 | ii
[20:38:36] ProcessQueryThread(updateGang) - Query was successful. (SELECT id FROM gangs WHERE leader = 71)
[20:38:36] ProcessQueryThread(updateGang) - Data caching enabled.
[20:38:36] CMySQLHandler::StoreResult() - Result was stored.
[20:38:36] CMySQLHandler::FreeResult() - Result was successfully free'd.
[20:38:36] CMySQLHandler::ProcessQueryThread() - Data is getting passed to ->ProcessTick()
[20:38:36] updateGang(ii) - Threaded function called.
[20:38:36] >> mysql_query_callback( Connection handle: 1 )
[20:38:36] ProcessTick() - The cache has been cleared.
[20:38:36] Passing query UPDATE players SET gang = 11 WHERE id = 71 |
[20:38:36] ProcessQueryThread() - Query was successful. (UPDATE players SET gang = 11 WHERE id = 71)
[20:38:36] CMySQLHandler::ProcessQueryThread() - Data is getting passed to ->ProcessTick()
[20:38:47] >> mysql_query_callback( Connection handle: 1 )
[20:38:47] Passing query SELECT * FROM players WHERE gang = '11' | ii
[20:38:47] ProcessQueryThread(updateGang) - Query was successful. (SELECT * FROM players WHERE gang = '11')
[20:38:47] ProcessQueryThread(updateGang) - Data caching enabled.
[20:38:47] CMySQLHandler::StoreResult() - Result was stored.
[20:38:47] CMySQLHandler::FreeResult() - Result was successfully free'd.

[20:38:47] CMySQLHandler::ProcessQueryThread() - Data is getting passed to ->ProcessTick()
[20:38:47] updateGang(ii) - Threaded function called.
[20:38:47] >> cache_get_data( Connection handle: 1 )
[20:38:47] ProcessTick() - The cache has been cleared.

and why result is free'd before threaded function is called?
Reply
#2

You need to setup a primary key (auto_increment integer) for the gangs table, and a new variable for it accordingly.
After inserting a new row in the gangs table, set it to mysql_insert_id();

As for your second question, look in the MySQL source code, specifically in ProcessQueryThread, you'll see why that is happening and why it's completely normal.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)