Napisałem taki kod, oczywiście patrzyłem jak inne pluginy są napisane w SQL, wyszło mi takie coś:
Spoiler
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <sqlx>
#include <cstrike>
#include <fun>
#include <colorchat>
new Handle:info, bool:connected;
new nazwa_gracza[33];
enum CVARS
{
host,
user,
pass,
db
};
new g_pCvars[CVARS];
new liczba[33];
public plugin_init()
{
register_plugin("TEST", "0.2", "Bl@ck");
g_pCvars[host] = register_cvar("host_sql", "xxx");
g_pCvars[user] = register_cvar("user_sql", "xxx", FCVAR_PROTECTED);
g_pCvars[pass] = register_cvar("password_sql", "xxx", FCVAR_PROTECTED);
g_pCvars[db] = register_cvar("database_sql", "xxx");
register_clcmd("say /test", "test");
register_clcmd("say /ile", "sprawdz");
}
public plugin_end() SQL_FreeHandle(info);
public test(id) liczba[id]++
public sprawdz(id) ColorChat(id, GREEN, "POSIADASZ %d PUNKTOW", liczba[id]);
public plugin_cfg()
{
new szHost[64], szUser[64], szPass[64], szDB[64];
get_pcvar_string(g_pCvars[host], szHost, charsmax(szHost));
get_pcvar_string(g_pCvars[user], szUser, charsmax(szUser));
get_pcvar_string(g_pCvars[pass], szPass, charsmax(szPass));
get_pcvar_string(g_pCvars[db], szDB, charsmax(szDB));
info = SQL_MakeDbTuple(szHost, szUser, szPass, szDB);
new len_full, temp_full[2024];
len_full += formatex(temp_full[len_full], charsmax(temp_full)-len_full, "CREATE TABLE IF NOT EXISTS `TESTOWE` (`name` VARCHAR(48), `liczba` INT(10))");
SQL_ThreadQuery(info, "ConnectSql_Handler", temp_full);
}
public ConnectSql_Handler(failstate, Handle:query, error[], errnum, data[], size)
{
if(failstate != TQUERY_SUCCESS)
{
connected = false;
return PLUGIN_CONTINUE;
}
connected = true;
return PLUGIN_CONTINUE;
}
public client_putinserver(id)
{
get_user_name(id, nazwa_gracza, 32)
resetData(id);
readData(id);
}
public client_disconnect(id)
{
saveData(id);
resetData(id);
}
public resetData(id)
{
liczba[id] = 0
}
public saveData(id)
{
if(!connected || !is_user_connected(id) || is_user_bot(id) || is_user_hltv(id) || !module_exists("MySQL"))
return PLUGIN_CONTINUE;
new len_full, temp_full[2048];
mysql_escape_string(nazwa_gracza, charsmax(nazwa_gracza));
len_full += formatex(temp_full[len_full], charsmax(temp_full)-len_full, "UPDATE `TESTOWE` SET `liczba` = '%d' WHERE `name` = '%s'", liczba[id], nazwa_gracza);
SQL_ThreadQuery(info, "saveDataHandler", temp_full);
return PLUGIN_CONTINUE;
}
public saveDataHandler(failstate, Handle:query, error[], errnum, data[], size)
{
if(failstate != TQUERY_SUCCESS)
{
return PLUGIN_CONTINUE;
}
return PLUGIN_CONTINUE;
}
public readData(id)
{
if(!connected || !is_user_connected(id) || is_user_bot(id) || is_user_hltv(id) || !module_exists("MySQL"))
return PLUGIN_CONTINUE;
new data[1], temp[2048], name[33];
data[0] = id;
mysql_escape_string(name, charsmax(name));
formatex(temp, charsmax(temp), "SELECT * FROM `TESTOWE` WHERE `name` = '%s'", nazwa_gracza);
SQL_ThreadQuery(info, "readDataHandler", temp, data, sizeof(data));
return PLUGIN_CONTINUE;
}
public readDataHandler(failstate, Handle:query, error[], errnum, data[], size)
{
new id = data[0];
if(failstate != TQUERY_SUCCESS)
{
return PLUGIN_CONTINUE;
}
if(SQL_MoreResults(query))
{
liczba[id] = SQL_ReadResult(query, SQL_FieldNameToNum(query,"liczba"))
}
else
{
new data[1];
data[0] = id;
if(!connected || !is_user_connected(id) || is_user_bot(id) || is_user_hltv(id) || !module_exists("MySQL"))
return PLUGIN_CONTINUE;
new temp[2048];
mysql_escape_string(nazwa_gracza, charsmax(nazwa_gracza));
format(temp, charsmax(temp), "INSERT INTO `TESTOWE` (name, liczba) VALUES ('%s', '0')", nazwa_gracza);
SQL_ThreadQuery(info, "readDataHandler2", temp, data, sizeof(data));
return PLUGIN_CONTINUE;
}
return PLUGIN_CONTINUE;
}
public readDataHandler2(failstate, Handle:query, error[], errnum, data[], size)
{
if(failstate != TQUERY_SUCCESS)
{
log_amx("Wczytywanie dla %s blad %s", nazwa_gracza, error);
return PLUGIN_CONTINUE;
}
return PLUGIN_CONTINUE;
}
stock mysql_escape_string(output[], len)
{
static const szReplaceIn[][] = { "\\", "\0", "\n", "\r", "\x1a", "'", "^"" };
static const szReplaceOut[][] = { "\\\\", "\\0", "\\n", "\\r", "\Z", "\'", "\^"" };
for(new i; i < sizeof szReplaceIn; i++)
replace_all(output, len, szReplaceIn[i], szReplaceOut[i]);
}
Kod ku mojemu zdziwieniu działa, ale czy dałoby się go jakoś go lepiej napisać? Czega mam unikać w robieniu zapisu sql?
Czy da się to:
liczba[id] = SQL_ReadResult(query, SQL_FieldNameToNum(query,"liczba"))
Odczytać to jakoś inaczej? W innych pluginach inaczej czasami to się robi w inny sposób. Dobry jest to sposób?
Ostanie pytanie, czy da się jakoś bardziej usprawnić ten zapis?
Jeszcze jedno, jak zapisać stringa w sql i go odczytać?
Użytkownik Black004 edytował ten post 31.07.2019 18:50


Dodatki SourceMod



Temat jest zamknięty









