416 lines
7.4 KiB
Plaintext
416 lines
7.4 KiB
Plaintext
|
/**
|
||
|
* AMX Mod Compatibility engine
|
||
|
* by the AMX Mod X Development Team
|
||
|
*/
|
||
|
|
||
|
#define MAX_CONNECTIONS 64
|
||
|
|
||
|
new Connections[MAX_CONNECTIONS+1] = {0}
|
||
|
new ConnectionTracker[MAX_CONNECTIONS+1] = {0}
|
||
|
new ConnectionErrors[MAX_CONNECTIONS+1][255]
|
||
|
new ConnectionQueries[MAX_CONNECTIONS+1] = {0}
|
||
|
new QueryPositions[MAX_CONNECTIONS+1]
|
||
|
|
||
|
MySQL_Natives()
|
||
|
{
|
||
|
register_native("mysql_connect", "__mysql_connect")
|
||
|
register_native("mysql_query", "__mysql_query")
|
||
|
register_native("mysql_error", "__mysql_error")
|
||
|
register_native("mysql_close", "__mysql_close")
|
||
|
register_native("mysql_nextrow", "__mysql_nextrow")
|
||
|
register_native("mysql_getfield", "__mysql_getfield")
|
||
|
register_native("mysql_getresult", "__mysql_getresult")
|
||
|
register_native("mysql_affected_rows", "__mysql_affected_rows")
|
||
|
register_native("mysql_num_fields", "__mysql_num_fields")
|
||
|
register_native("mysql_num_rows", "__mysql_num_rows")
|
||
|
register_native("mysql_field_name", "__mysql_field_name")
|
||
|
register_native("mysql_insert_id", "__mysql_insert_id")
|
||
|
}
|
||
|
|
||
|
MakeConnectionIndex(Handle:cn)
|
||
|
{
|
||
|
if (ConnectionTracker[0])
|
||
|
{
|
||
|
new idx = ConnectionTracker[ConnectionTracker[0]]
|
||
|
ConnectionTracker[0]--
|
||
|
Connections[idx] = _:cn
|
||
|
return idx
|
||
|
} else {
|
||
|
Connections[0]++
|
||
|
if (Connections[0] > MAX_CONNECTIONS)
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
Connections[Connections[0]] = _:cn
|
||
|
return Connections[0]
|
||
|
}
|
||
|
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
Handle:GetConnectionIndex(idx)
|
||
|
{
|
||
|
if (idx < 1 || idx > MAX_CONNECTIONS || !Connections[idx])
|
||
|
{
|
||
|
return Empty_Handle
|
||
|
}
|
||
|
|
||
|
return Handle:Connections[idx]
|
||
|
}
|
||
|
|
||
|
FreeConnectionIndex(idx)
|
||
|
{
|
||
|
Connections[idx] = 0
|
||
|
ConnectionTracker[0]++
|
||
|
ConnectionTracker[ConnectionTracker[0]] = idx
|
||
|
ConnectionErrors[idx][0] = 0
|
||
|
ConnectionQueries[idx] = 0
|
||
|
QueryPositions[idx] = 0
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Unlike the previous this does not check for a matching connection.
|
||
|
* Unless a plugin breaks I'm not going to take that step.
|
||
|
*/
|
||
|
|
||
|
public __mysql_connect(plid, num)
|
||
|
{
|
||
|
static host[255], user[128], pass[128], dbname[128], error[512]
|
||
|
new errcode
|
||
|
|
||
|
get_string(1, host, 254)
|
||
|
get_string(2, user, 127)
|
||
|
get_string(3, pass, 127)
|
||
|
get_string(4, dbname, 127)
|
||
|
|
||
|
new Handle:info = SQL_MakeDbTuple(host, user, pass, dbname)
|
||
|
new Handle:cn = SQL_Connect(info, errcode, error, 511)
|
||
|
|
||
|
if (cn == Empty_Handle)
|
||
|
{
|
||
|
set_string(5, error, get_param(6))
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
SQL_FreeHandle(info)
|
||
|
|
||
|
new idx = MakeConnectionIndex(cn)
|
||
|
if (idx == 0)
|
||
|
{
|
||
|
set_string(5, "Reached max unclosed connections", get_param(6))
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
ConnectionQueries[idx] = 0
|
||
|
|
||
|
return idx
|
||
|
}
|
||
|
|
||
|
public __mysql_query(plid, num)
|
||
|
{
|
||
|
static queryString[4096]
|
||
|
new cn_idx = get_param(1)
|
||
|
new Handle:cn
|
||
|
|
||
|
if ((cn=GetConnectionIndex(cn_idx)) == Empty_Handle)
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
vdformat(queryString, 4095, 2, 3)
|
||
|
|
||
|
new Handle:query = SQL_PrepareQuery(cn, "%s", queryString)
|
||
|
|
||
|
if (!SQL_Execute(query))
|
||
|
{
|
||
|
SQL_QueryError(query, ConnectionErrors[cn_idx], 254)
|
||
|
SQL_FreeHandle(query)
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
if (ConnectionQueries[cn_idx])
|
||
|
{
|
||
|
SQL_FreeHandle(Handle:ConnectionQueries[cn_idx])
|
||
|
}
|
||
|
|
||
|
ConnectionQueries[cn_idx] = _:query
|
||
|
QueryPositions[cn_idx] = 0
|
||
|
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
public __mysql_error(plid, num)
|
||
|
{
|
||
|
new cn_idx = get_param(1)
|
||
|
|
||
|
if (Connections[cn_idx] < 1)
|
||
|
{
|
||
|
static error[255]
|
||
|
format(error, 254, "Invalid connection index: %d", cn_idx)
|
||
|
set_string(2, error, get_param(3))
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
set_string(2, ConnectionErrors[cn_idx], get_param(3))
|
||
|
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
public __mysql_close(plid, num)
|
||
|
{
|
||
|
new cn_idx = get_param(1)
|
||
|
|
||
|
new Handle:cn = GetConnectionIndex(cn_idx)
|
||
|
|
||
|
if (cn == Empty_Handle)
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
new Handle:query = Handle:ConnectionQueries[cn_idx]
|
||
|
|
||
|
if (query != Empty_Handle)
|
||
|
{
|
||
|
SQL_FreeHandle(query)
|
||
|
}
|
||
|
|
||
|
SQL_FreeHandle(cn)
|
||
|
|
||
|
FreeConnectionIndex(cn_idx)
|
||
|
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
public __mysql_nextrow(plid, num)
|
||
|
{
|
||
|
new cn_idx = get_param(1)
|
||
|
|
||
|
new Handle:cn = GetConnectionIndex(cn_idx)
|
||
|
if (cn == Empty_Handle)
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
new Handle:query = Handle:ConnectionQueries[cn_idx]
|
||
|
if (query == Empty_Handle)
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
if (QueryPositions[cn_idx] != 0)
|
||
|
{
|
||
|
SQL_NextRow(query)
|
||
|
}
|
||
|
|
||
|
if (SQL_MoreResults(query))
|
||
|
{
|
||
|
return ++QueryPositions[cn_idx]
|
||
|
}
|
||
|
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
public __mysql_getresult(plid, num)
|
||
|
{
|
||
|
new cn_idx = get_param(1)
|
||
|
|
||
|
new Handle:cn = GetConnectionIndex(cn_idx)
|
||
|
if (cn == Empty_Handle)
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
new Handle:query = Handle:ConnectionQueries[cn_idx]
|
||
|
if (query == Empty_Handle)
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
if (!SQL_MoreResults(query))
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
static name[64]
|
||
|
get_string(2, name, 63)
|
||
|
new column = SQL_FieldNameToNum(query, name)
|
||
|
if (column == -1)
|
||
|
{
|
||
|
log_error(AMX_ERR_NATIVE, "Invalid column name: %s", name)
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
switch (num)
|
||
|
{
|
||
|
case 2:
|
||
|
{
|
||
|
return SQL_ReadResult(query, column)
|
||
|
}
|
||
|
case 3:
|
||
|
{
|
||
|
new Float:fma
|
||
|
SQL_ReadResult(query, column, fma)
|
||
|
set_param_byref(3, _:fma)
|
||
|
}
|
||
|
case 4:
|
||
|
{
|
||
|
static str[2048]
|
||
|
SQL_ReadResult(query, column, str, 2047)
|
||
|
set_string(3, str, get_param_byref(4))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
public __mysql_getfield(plid, num)
|
||
|
{
|
||
|
new cn_idx = get_param(1)
|
||
|
|
||
|
new Handle:cn = GetConnectionIndex(cn_idx)
|
||
|
if (cn == Empty_Handle)
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
new Handle:query = Handle:ConnectionQueries[cn_idx]
|
||
|
if (query == Empty_Handle)
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
if (!SQL_MoreResults(query))
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
switch (num)
|
||
|
{
|
||
|
case 2:
|
||
|
{
|
||
|
return SQL_ReadResult(query, get_param(2)-1)
|
||
|
}
|
||
|
case 3:
|
||
|
{
|
||
|
new Float:fma
|
||
|
SQL_ReadResult(query, get_param(2)-1, fma)
|
||
|
set_param_byref(3, _:fma)
|
||
|
}
|
||
|
case 4:
|
||
|
{
|
||
|
static str[2048]
|
||
|
SQL_ReadResult(query, get_param(2)-1, str, 2047)
|
||
|
set_string(3, str, get_param_byref(4))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
public __mysql_affected_rows(plid, num)
|
||
|
{
|
||
|
new cn_idx = get_param(1)
|
||
|
|
||
|
new Handle:cn = GetConnectionIndex(cn_idx)
|
||
|
if (cn == Empty_Handle)
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
new Handle:query = Handle:ConnectionQueries[cn_idx]
|
||
|
if (query == Empty_Handle)
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
return SQL_AffectedRows(query)
|
||
|
}
|
||
|
|
||
|
public __mysql_num_fields(plid, num)
|
||
|
{
|
||
|
new cn_idx = get_param(1)
|
||
|
|
||
|
new Handle:cn = GetConnectionIndex(cn_idx)
|
||
|
if (cn == Empty_Handle)
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
new Handle:query = Handle:ConnectionQueries[cn_idx]
|
||
|
if (query == Empty_Handle)
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
return SQL_NumColumns(query)
|
||
|
}
|
||
|
|
||
|
public __mysql_insert_id(plid, num)
|
||
|
{
|
||
|
new cn_idx = get_param(1)
|
||
|
|
||
|
new Handle:cn = GetConnectionIndex(cn_idx)
|
||
|
if (cn == Empty_Handle)
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
new Handle:query = Handle:ConnectionQueries[cn_idx]
|
||
|
if (query == Empty_Handle)
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
return SQL_GetInsertId(query)
|
||
|
}
|
||
|
|
||
|
public __mysql_num_rows(plid, num)
|
||
|
{
|
||
|
new cn_idx = get_param(1)
|
||
|
|
||
|
new Handle:cn = GetConnectionIndex(cn_idx)
|
||
|
if (cn == Empty_Handle)
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
new Handle:query = Handle:ConnectionQueries[cn_idx]
|
||
|
if (query == Empty_Handle)
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
return SQL_NumResults(query)
|
||
|
}
|
||
|
|
||
|
public __mysql_field_name(plid, num)
|
||
|
{
|
||
|
new cn_idx = get_param(1)
|
||
|
|
||
|
new Handle:cn = GetConnectionIndex(cn_idx)
|
||
|
if (cn == Empty_Handle)
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
new Handle:query = Handle:ConnectionQueries[cn_idx]
|
||
|
if (query == Empty_Handle)
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
new column = get_param(2) - 1
|
||
|
if (column < 0 || column >= SQL_NumColumns(query))
|
||
|
{
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
new field[64]
|
||
|
SQL_FieldNumToName(query, column, field, 63)
|
||
|
|
||
|
set_string(3, field, get_param(4))
|
||
|
|
||
|
return 1
|
||
|
}
|