projects-jenz/zrstore/scripting/store/db.sp

99 lines
4.2 KiB
SourcePawn

Handle g_hDatabase = INVALID_HANDLE;
bool g_bMySQL = false;
#include "store/sql.sp"
void Store_DB_ConfigsExecuted_ConnectDatabase()
{
if(g_hDatabase == INVALID_HANDLE)
SQL_TConnect(SQLCallback_Connect, g_eCvars[g_cvarDatabaseEntry].sCache);
// If database has been connected. Skip connection and do some housekeeping here
else Store_DB_HouseKeeping(g_hDatabase);
if(g_eCvars[g_cvarDatabaseRetries].aCache > 0)
CreateTimer(view_as<float>(g_eCvars[g_cvarDatabaseTimeout].aCache), Timer_DatabaseTimeout);
}
public Action Timer_DatabaseTimeout(Handle timer, any userid)
{
// Database is connected successfully
if(g_hDatabase != INVALID_HANDLE)
return Plugin_Stop;
if(g_iDatabaseRetries < g_eCvars[g_cvarDatabaseRetries].aCache)
{
SQL_TConnect(SQLCallback_Connect, g_eCvars[g_cvarDatabaseEntry].sCache);
CreateTimer(view_as<float>(g_eCvars[g_cvarDatabaseTimeout].aCache), Timer_DatabaseTimeout);
++g_iDatabaseRetries;
}
else
{
SetFailState("Database connection failed to initialize after %d retrie(s)", g_eCvars[g_cvarDatabaseRetries].aCache);
}
return Plugin_Stop;
}
void Store_DB_HouseKeeping(Handle db)
{
// Do some housekeeping
char m_szQuery[600], m_szLogCleaningQuery[256];
char m_szDriver[12];
SQL_ReadDriver(db, STRING(m_szDriver));
// Remove expired and equipped items
if (StrEqual(m_szDriver, "mysql"))
{
// This query removes expired items that are equipped, and also remove the rows from store_equipment - it doesnt remove unequipped items!
Format(STRING(m_szQuery), "DELETE store_items, store_equipment "
... "FROM store_items, store_equipment "
... "WHERE store_items.unique_id = store_equipment.unique_id "
... "AND store_items.player_id = store_equipment.player_id "
... "AND store_items.date_of_expiration != 0 "
... "AND store_items.date_of_expiration < %d", GetTime());
// Ugly syntax, but MySQL DOES allow DELETE clauses between multiple tables in a single query
}
else
{
// This query removes rows from store_equipment that are linked to items that are expired, BUT DOESNT ACTUALLY REMOVE EXPIRED ITEMS FROM PLAYERS INVENTORIES! - This is done by the query after this one.
// ^ NOTE THAT THE BEHAVIOR OF THIS QUERY DIFFERS FROM THE MySQL ONE!
// For easier copy-pasting: DELETE FROM store_equipment WHERE ROWID IN (SELECT store_equipment.ROWID FROM store_items, store_equipment WHERE store_items.unique_id = store_equipment.unique_id AND store_items.player_id = store_equipment.player_id AND store_items.date_of_expiration != 0 AND store_items.date_of_expiration < %d);
Format(STRING(m_szQuery), "DELETE FROM store_equipment "
... "WHERE ROWID IN "
... "("
... "SELECT store_equipment.ROWID "
... "FROM store_items, store_equipment "
... "WHERE store_items.unique_id = store_equipment.unique_id "
... "AND store_items.player_id = store_equipment.player_id "
... "AND store_items.date_of_expiration != 0 "
... "AND store_items.date_of_expiration < %d"
... ") ", GetTime());
// SQLite doesnt allow DELETE clauses between multiple tables in a single query. GRRRR!!!
// Btw, ROWID is the default hidden SQLite primary key, because the store_equipment table doesnt have one
}
//SQL_TVoid(db, m_szQuery); //these just waste time. everything is permanent anyways on unloze
// Remove expired and unequipped items
Format(STRING(m_szQuery), "DELETE FROM store_items WHERE date_of_expiration != 0 AND date_of_expiration < %d", GetTime());
//SQL_TVoid(db, m_szQuery); //these just waste time. everything is permanent anyways on unloze
if (g_eCvars[g_cvarLogLast].aCache>0)
{
if (StrEqual(m_szDriver, "mysql"))
{
Format(STRING(m_szLogCleaningQuery), "DELETE FROM store_plugin_logs WHERE `date` < CURDATE()-%i", g_eCvars[g_cvarLogLast].aCache);
SQL_TVoid(db, m_szLogCleaningQuery);
Format(STRING(m_szLogCleaningQuery), "DELETE FROM store_logs WHERE `date` < CURDATE()-%i", g_eCvars[g_cvarLogLast].aCache);
SQL_TVoid(db, m_szLogCleaningQuery);
}
else
{
Format(STRING(m_szLogCleaningQuery), "DELETE FROM store_plugin_logs WHERE `date` < (SELECT DATETIME('now', '-%i day'))", g_eCvars[g_cvarLogLast].aCache);
SQL_TVoid(db, m_szLogCleaningQuery);
}
}
}