AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   SQLx doesnt load after server totally rebooted (https://forums.alliedmods.net/showthread.php?t=63792)

Raizio 11-30-2007 07:05

SQLx doesnt load after server totally rebooted
 
All works fine, saving and loading when the server is up.. but when the server crashed or just shutted down and i boot it up again, it wont load the information for the player :S.

It's my first time with SQLx so any other fixes orso are welcome too =)


here are the pieces of code
Code:
public client_putinserver(id) {         set_task(0.5,"Load",id)     set_task(1.0,"DisplayInfo",id,"",0,"b")     set_task(1.0,"GainLevel",id,"",0,"b")     set_task(1.0,"ReSpawn",id,"",0,"b")     set_task(1.0,"Replenish",id,"",0,"b")     set_task(0.5,"checkforbuilding",id,"",0,"b")     jutsucooldown[id] = 0     strcomp[id] = 50 + g_iStrengthPoints[id] * 8         } public client_disconnect(id) {     remove_task(id,0)         Save(id,S_HUD);     Save(id,S_MISSION);     Save(id,S_STATS);     Save(id,S_EXP); } public Load(id) {     new Query[256],Authid[32];     get_user_authid(id,Authid,31);     format(Query,255,"SELECT * FROM stats WHERE Authid = '%s'",Authid);     SQL_ThreadQuery(g_SqlTuple,"LoadHandle",Query);     format(Query,255,"SELECT * FROM points WHERE Authid = '%s'",Authid);     SQL_ThreadQuery(g_SqlTuple,"LoadHandle",Query); } public LoadHandle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {     if(FailState == TQUERY_CONNECT_FAILED) {         return log_amx("Could not connect to SQL database.  [%d] %s", Errcode, Error);     }     else if(FailState == TQUERY_QUERY_FAILED) {         return log_amx("Load Query failed.  [%d] %s", Errcode, Error);     }     if(Errcode) {         return log_amx("Error on query: %s",Error)     }     new id = str_to_num(Data);     if(!SQL_MoreResults(Query)) {         server_print("Unknown player")         new Authid[32],Query[256];         get_user_authid(id,Authid,31);         format(Query,255,"INSERT INTO stats VALUES('%s','%s','%s','%s','%s','%s')",Authid,g_iLevel[id],g_iExp[id],g_szRank[id],g_szClan[id],g_szMission[id]);         SQL_ThreadQuery(g_SqlTuple,"InsertHandle",Query);         format(Query,255,"INSERT INTO points VALUES('%s','%s','%s','%s','%s','%s','%s','%s','%s')",Authid,g_iBonusPoints[id],g_iChakraPoints[id],g_iSpeedPoints[id],g_iStrengthPoints,g_iStaminaPoints[id],g_iMaxChakra[id],g_iDefencePoints[id],g_iBalance[id]);         SQL_ThreadQuery(g_SqlTuple,"InsertHandle",Query);     }     return PLUGIN_CONTINUE }

it also doesnt give any error.

alien 11-30-2007 19:51

Re: SQLx doesnt load after server totally rebooted
 
What do you mean by "load"? Because all I can see here is "storing" instead. Less briefly, you're calling Load() upon client_putinserver(), you select the player from the table and if none was returned (probably doesn't exist), you store it? There is no loading whatsoever.

Another thing: You need to realize, that using this:

Code:
format(Query,255,"SELECT * FROM stats WHERE Authid = '%s'",Authid);     SQL_ThreadQuery(g_SqlTuple,"LoadHandle",Query);     format(Query,255,"SELECT * FROM points WHERE Authid = '%s'",Authid);     SQL_ThreadQuery(g_SqlTuple,"LoadHandle",Query);

... will cause LoadHandle() to be called twice with different values for both queries. It means, that if both selects in Load() are unsuccessful, both inserts in LoadHandle() will be executed twice causing duplicated rows.

Either create 2 separate handlers or merge 2 select queries into 1 working with both tables.

Raizio 11-30-2007 20:17

Re: SQLx doesnt load after server totally rebooted
 
ah so thats why i got double rows..

well about the loading.. got any small little example of loading with SQLx?

and thanks for the help already :)

alien 11-30-2007 20:46

Re: SQLx doesnt load after server totally rebooted
 
NOT tested. Just as an example. It should be 'findmap' console command which will list maps with matching file name. Maps are stored in 'maps' table which includes only ID and map_name columns.

"findmap dust" - find every map in db with dust in name.

Code:
function findmap(id)   {     new       handler_data[56],       query_string[128];     handler_data[0] = id;     read_argv(1, handler_data[1], 54);     formatex(query_string, sizeof(query_string) - 1, "SELECT map_name FROM maps WHERE map_name LIKE '%%%s%%' ORDER BY map_name LIMIT 32", handler_data[1]);     SQL_ThreadQuery(db_tuple, "findmap_handler", query_string, handler_data, sizeof(handler_data);     return PLUGIN_HANDLED;   } function findmap_handler(fail_state, Handle:query, error[], error_code, handler_data[], handler_data_size)   {     owner_id = handler_data[0];     switch (fail_state)       {         case TQUERY_CONNECT_FAILED: console(owner_id, "/ ERROR: Database is offline. You cannot search maps at the moment.");         case TQUERY_QUERY_FAILED: console(owner_id, "/ ERROR: Unable to search maps. Please contact the administrator.");         case TQUERY_SUCCESS:           {             new n = SQL_NumResults(query);                         if (n > 0)               {                 new map_name[55];                             for (new i = 0; i < n; i++)                   {                     SQL_ReadResult(query, 0, map_name, 54);                     client_print(owner_id, print_console, "%d. %s", i + 1, map_name);                                                                                                             SQL_NextRow(query);                   }               }             else console(owner_id, "No map matches for '%s'.", handler_data[1]);           }        }     }

Des12 12-01-2007 20:09

Re: SQLx doesnt load after server totally rebooted
 
Yea, just use SQL_ReadResult

Raizio 12-12-2007 16:44

Re: SQLx doesnt load after server totally rebooted
 
alright, after messing around a while i finally got it fully working.

Thanks you guys, i really appreciate the help :)

Raizio 12-15-2007 15:59

Re: SQLx doesnt load after server totally rebooted
 
before i begin , sorry for the double post, but i felt this was needed a new reply.

Now it messes up the saving or loading.. im not sure.
It keeps giving people other people's stats and info, can anyone check if there is something wrong with the code?

Thanks in advance.

--Edit: it seems that copy and pasting this has messed up the indentation, my apologies.

Code:
public Save(id,info) {     //Save all the data     new Query[256],Authid[64],Data[32];     get_user_authid(id,Authid,63);     switch(info) {         case S_EXP: {                         new bf_exp[256]                 new bf_level[256]                 new bf_neededexp[256]                 num_to_str(g_iExp[id],bf_exp,255)                         num_to_str(g_iLevel[id],bf_level,255)                         num_to_str(g_iNeededExp[id],bf_neededexp,255)                                                 format(Data,31,"%d",id)             format(Query,255,"UPDATE stats SET exp = '%s' WHERE Authid = '%s'",bf_exp,Authid);             SQL_ThreadQuery(g_SqlTuple,"QueryHandle",Query,Data,32);                         format(Query,255,"UPDATE stats SET neededexp = '%s' WHERE Authid = '%s'",bf_neededexp,Authid);             SQL_ThreadQuery(g_SqlTuple,"QueryHandle",Query,Data,32);             format(Query,255,"UPDATE stats SET level = '%s' WHERE Authid = '%s'",bf_level,Authid);             SQL_ThreadQuery(g_SqlTuple,"QueryHandle",Query,Data,32);         }         case S_HUD: {                         format(Query,255,"UPDATE stats SET rank = '%s' WHERE Authid = '%s'",g_szRank[id],Authid);                         SQL_ThreadQuery(g_SqlTuple,"QueryHandle",Query,Data,32);             format(Query,255,"UPDATE stats SET clan = '%s' WHERE Authid = '%s'",g_szClan[id],Authid);             SQL_ThreadQuery(g_SqlTuple,"QueryHandle",Query,Data,32);         }         case S_MISSION: {             format(Query,255,"UPDATE stats SET mission = '%s' WHERE Authid = '%s'",g_szMission[id],Authid);             SQL_ThreadQuery(g_SqlTuple,"QueryHandle",Query,Data,32);         }         case S_STATS: {                         format(Query,255,"UPDATE points SET bonuspoints = '%d' WHERE Authid = '%s'",g_iBonusPoints[id],Authid);                         SQL_ThreadQuery(g_SqlTuple,"QueryHandle",Query,Data,32);                         format(Query,255,"UPDATE points SET chakrapoints = '%d' WHERE Authid = '%s'",g_iChakraPoints[id],Authid);                         SQL_ThreadQuery(g_SqlTuple,"QueryHandle",Query,Data,32);                         format(Query,255,"UPDATE points SET speedpoints = '%d' WHERE Authid = '%s'",g_iSpeedPoints[id],Authid);                         SQL_ThreadQuery(g_SqlTuple,"QueryHandle",Query,Data,32);                         format(Query,255,"UPDATE points SET staminapoints = '%d' WHERE Authid = '%s'",g_iStaminaPoints[id],Authid);                         SQL_ThreadQuery(g_SqlTuple,"QueryHandle",Query,Data,32);                         format(Query,255,"UPDATE points SET defencepoints = '%d' WHERE Authid = '%s'",g_iDefencePoints[id],Authid);                         SQL_ThreadQuery(g_SqlTuple,"QueryHandle",Query,Data,32);                         format(Query,255,"UPDATE points SET maxchakra = '%d' WHERE Authid = '%s'",g_iMaxChakra[id],Authid);                         SQL_ThreadQuery(g_SqlTuple,"QueryHandle",Query,Data,32);                         format(Query,255,"UPDATE points SET strengthpoints = '%d' WHERE Authid = '%s'",g_iStrengthPoints[id],Authid);                         SQL_ThreadQuery(g_SqlTuple,"QueryHandle",Query,Data,32);                         format(Query,255,"UPDATE points SET balance = '%d' WHERE Authid = '%s'",g_iBalance[id],Authid);                         SQL_ThreadQuery(g_SqlTuple,"QueryHandle",Query,Data,32);                                                 format(Query,255,"UPDATE points SET maxhealth = '%d' WHERE Authid = '%s'",g_iTrueHealth[id],Authid);                         SQL_ThreadQuery(g_SqlTuple,"QueryHandle",Query,Data,32);         }     } } public Load(id) {     new Query[256],Authid[64],Data[2];     get_user_authid(id,Authid,63);     format(Data,1,"%d",id)     format(Query,255,"SELECT * FROM stats WHERE Authid = '%s'",Authid);     SQL_ThreadQuery(g_SqlTuple,"LoadHandle",Query,Data,1);     format(Query,255,"SELECT * FROM points WHERE Authid = '%s'",Authid);     SQL_ThreadQuery(g_SqlTuple,"LoadPointsHandle",Query,Data,1); } public QueryHandle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {     //I use QueryHandle for just inserting stuff into the db     //Basically it just handles how the query is done and checks for error     if(FailState == TQUERY_CONNECT_FAILED) {         return log_amx("Could not connect to SQL database.  [%d] %s", Errcode, Error);     }     else if(FailState == TQUERY_QUERY_FAILED)     {         return log_amx("Saving Query Failed.  [%d] %s", Errcode, Error);     }     if(Errcode) {         return log_amx("Error on query: %s",Error)     }     return PLUGIN_CONTINUE } public InsertHandle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {     if(FailState == TQUERY_CONNECT_FAILED) {         return log_amx("Could not connect to SQL database.  [%d] %s", Errcode, Error);     }     else if(FailState == TQUERY_QUERY_FAILED) {         return log_amx("Insert Query failed.  [%d] %s", Errcode, Error);     }     if(Errcode) {         return log_amx("Error on query: %s",Error)     }     server_print("New player added to database.")     return PLUGIN_CONTINUE } public LoadHandle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {     if(FailState == TQUERY_CONNECT_FAILED) {         return log_amx("Could not connect to SQL database.  [%d] %s", Errcode, Error);     }     else if(FailState == TQUERY_QUERY_FAILED) {         return log_amx("Load Player Info Query failed.  [%d] %s", Errcode, Error);     }     if(Errcode) {         return log_amx("Error on query: %s",Error)     }     new id = str_to_num(Data);     if(!SQL_MoreResults(Query)) {         server_print("Unknown player")         new Authid[64],Query[256];         get_user_authid(id,Authid,63);                 format(Query,255,"INSERT INTO stats VALUES('%s','1','0','%d','%s','%s','%s')",Authid,g_iNeededExp[id],g_szRank[id],g_szClan[id],g_szMission[id]);                 SQL_ThreadQuery(g_SqlTuple,"InsertHandle",Query);     }         while(SQL_MoreResults(Query))     {         g_iLevel[id] = SQL_ReadResult(Query,1);         g_iExp[id] = SQL_ReadResult(Query,2);         g_iNeededExp[id] = SQL_ReadResult(Query,3);         SQL_ReadResult(Query,4,g_szRank[id],63);                 SQL_ReadResult(Query,5,g_szClan[id],63);                 SQL_ReadResult(Query,6,g_szMission[id],63);         SQL_NextRow(Query);     }     return PLUGIN_CONTINUE } public LoadPointsHandle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {     if(FailState == TQUERY_CONNECT_FAILED) {         return log_amx("Could not connect to SQL database.  [%d] %s", Errcode, Error);     }     else if(FailState == TQUERY_QUERY_FAILED) {         return log_amx("Load Player Stats Query failed.  [%d] %s", Errcode, Error);     }     if(Errcode) {         return log_amx("Error on query: %s",Error)     }     new id = str_to_num(Data);     if(!SQL_MoreResults(Query)) {         server_print("Unknown player")         new Authid[64],Query[256];         get_user_authid(id,Authid,63);         format(Query,255,"INSERT INTO points VALUES('%s','5','%d','%d','%d','%d','%d','%d','%d','%d')",Authid,g_iChakraPoints[id],g_iSpeedPoints[id],g_iStrengthPoints,g_iStaminaPoints[id],g_iMaxChakra[id],g_iDefencePoints[id],g_iBalance[id],g_iTrueHealth[id]);         SQL_ThreadQuery(g_SqlTuple,"InsertHandle",Query);     }     while(SQL_MoreResults(Query))     {                 g_iBonusPoints[id] = SQL_ReadResult(Query,1);                 g_iChakraPoints[id] = SQL_ReadResult(Query,2);                 g_iSpeedPoints[id] = SQL_ReadResult(Query,3);                 g_iStrengthPoints[id] = SQL_ReadResult(Query,4);                 g_iStaminaPoints[id] = SQL_ReadResult(Query,5);                 g_iMaxChakra[id] = SQL_ReadResult(Query,6);                 g_iDefencePoints[id] = SQL_ReadResult(Query,7);                 g_iBalance[id] = SQL_ReadResult(Query,8);                 g_iTrueHealth[id] = SQL_ReadResult(Query,9);         SQL_NextRow(Query);     }     return PLUGIN_CONTINUE }


All times are GMT -4. The time now is 11:08.

Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.