fixed various bugs in the sql natives and manager
added a basic test plugin --HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40875
This commit is contained in:
parent
e334e5f7e7
commit
eb54cbb4f5
@ -123,7 +123,7 @@ SMCParseResult DBManager::ReadSMC_NewSection(const char *name, bool opt_quotes)
|
|||||||
}
|
}
|
||||||
} else if (m_ParseState == DBPARSE_LEVEL_MAIN) {
|
} else if (m_ParseState == DBPARSE_LEVEL_MAIN) {
|
||||||
s_CurInfo = ConfDbInfo();
|
s_CurInfo = ConfDbInfo();
|
||||||
s_CurInfo.database = m_StrTab.AddString(name);
|
s_CurInfo.name = m_StrTab.AddString(name);
|
||||||
m_ParseState = DBPARSE_LEVEL_DATABASE;
|
m_ParseState = DBPARSE_LEVEL_DATABASE;
|
||||||
} else if (m_ParseState == DBPARSE_LEVEL_DATABASE) {
|
} else if (m_ParseState == DBPARSE_LEVEL_DATABASE) {
|
||||||
m_ParseLevel++;
|
m_ParseLevel++;
|
||||||
@ -229,6 +229,7 @@ bool DBManager::Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *dname = pInfo->info.driver;
|
||||||
if (!pInfo->realDriver)
|
if (!pInfo->realDriver)
|
||||||
{
|
{
|
||||||
/* Try to assign a real driver pointer */
|
/* Try to assign a real driver pointer */
|
||||||
@ -238,6 +239,7 @@ bool DBManager::Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool
|
|||||||
{
|
{
|
||||||
m_pDefault = FindOrLoadDriver(m_DefDriver.c_str());
|
m_pDefault = FindOrLoadDriver(m_DefDriver.c_str());
|
||||||
}
|
}
|
||||||
|
dname = m_DefDriver.size() ? m_DefDriver.c_str() : "default";
|
||||||
pInfo->realDriver = m_pDefault;
|
pInfo->realDriver = m_pDefault;
|
||||||
} else {
|
} else {
|
||||||
pInfo->realDriver = FindOrLoadDriver(pInfo->info.driver);
|
pInfo->realDriver = FindOrLoadDriver(pInfo->info.driver);
|
||||||
@ -260,7 +262,7 @@ bool DBManager::Connect(const char *name, IDBDriver **pdr, IDatabase **pdb, bool
|
|||||||
}
|
}
|
||||||
*pdb = NULL;
|
*pdb = NULL;
|
||||||
|
|
||||||
UTIL_Format(error, maxlength, "Driver \"%s\" not found", pInfo->driver);
|
UTIL_Format(error, maxlength, "Driver \"%s\" not found", dname);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -334,7 +336,7 @@ HandleError DBManager::ReadHandle(Handle_t hndl, DBHandleType dtype, void **ptr)
|
|||||||
|
|
||||||
HandleSecurity sec(NULL, g_pCoreIdent);
|
HandleSecurity sec(NULL, g_pCoreIdent);
|
||||||
|
|
||||||
return g_HandleSys.ReadHandle(hndl, dtype, &sec, ptr);
|
return g_HandleSys.ReadHandle(hndl, type, &sec, ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
HandleError DBManager::ReleaseHandle(Handle_t hndl, DBHandleType type, IdentityToken_t *token)
|
HandleError DBManager::ReleaseHandle(Handle_t hndl, DBHandleType type, IdentityToken_t *token)
|
||||||
@ -397,7 +399,7 @@ IDBDriver *DBManager::FindOrLoadDriver(const char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
char filename[PLATFORM_MAX_PATH];
|
char filename[PLATFORM_MAX_PATH];
|
||||||
UTIL_Format(filename, sizeof(filename), "dbi.%s", name);
|
UTIL_Format(filename, sizeof(filename), "dbi.%s.ext", name);
|
||||||
|
|
||||||
IExtension *pExt = g_Extensions.LoadAutoExtension(filename);
|
IExtension *pExt = g_Extensions.LoadAutoExtension(filename);
|
||||||
if (!pExt || !pExt->IsLoaded() || m_drivers.size() <= last_size)
|
if (!pExt || !pExt->IsLoaded() || m_drivers.size() <= last_size)
|
||||||
|
@ -26,7 +26,7 @@ public:
|
|||||||
tacc.ident = g_pCoreIdent;
|
tacc.ident = g_pCoreIdent;
|
||||||
|
|
||||||
hQueryType = g_HandleSys.CreateType("IQuery", this, 0, &tacc, &acc, g_pCoreIdent, NULL);
|
hQueryType = g_HandleSys.CreateType("IQuery", this, 0, &tacc, &acc, g_pCoreIdent, NULL);
|
||||||
hStmtType = g_HandleSys.CreateType("IPreparedQuery", this, hQueryType, &tacc, &acc, NULL, NULL);
|
hStmtType = g_HandleSys.CreateType("IPreparedQuery", this, hQueryType, &tacc, &acc, g_pCoreIdent, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void OnSourceModShutdown()
|
virtual void OnSourceModShutdown()
|
||||||
|
@ -260,10 +260,20 @@ native bool:SQL_HasResultSet(Handle:query);
|
|||||||
* Retrieves the number of rows in the last result set.
|
* Retrieves the number of rows in the last result set.
|
||||||
*
|
*
|
||||||
* @param query A query (or statement) Handle.
|
* @param query A query (or statement) Handle.
|
||||||
|
* @return Number of rows in the current result set.
|
||||||
* @error Invalid query Handle.
|
* @error Invalid query Handle.
|
||||||
*/
|
*/
|
||||||
native SQL_GetRowCount(Handle:query);
|
native SQL_GetRowCount(Handle:query);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the number of fields in the last result set.
|
||||||
|
*
|
||||||
|
* @param query A query (or statement) Handle.
|
||||||
|
* @return Number of fields in the current result set.
|
||||||
|
* @error Invalid query Handle.
|
||||||
|
*/
|
||||||
|
native SQL_GetFieldCount(Handle:query);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the name of a field by index.
|
* Retrieves the name of a field by index.
|
||||||
*
|
*
|
||||||
|
108
plugins/testsuite/sqltest.sp
Normal file
108
plugins/testsuite/sqltest.sp
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
#include <sourcemod>
|
||||||
|
|
||||||
|
public Plugin:myinfo =
|
||||||
|
{
|
||||||
|
name = "SQL Testing Lab",
|
||||||
|
author = "AlliedModders LLC",
|
||||||
|
description = "Tests basic function calls",
|
||||||
|
version = "1.0.0.0",
|
||||||
|
url = "http://www.sourcemod.net/"
|
||||||
|
};
|
||||||
|
|
||||||
|
public OnPluginStart()
|
||||||
|
{
|
||||||
|
RegServerCmd("sql_test_normal", Command_TestSql1)
|
||||||
|
RegServerCmd("sql_test_stmt", Command_TestSql2)
|
||||||
|
}
|
||||||
|
|
||||||
|
PrintQueryData(Handle:query)
|
||||||
|
{
|
||||||
|
if (!SQL_HasResultSet(query))
|
||||||
|
{
|
||||||
|
PrintToServer("Query Handle %x has no results", query)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
new rows = SQL_GetRowCount(query)
|
||||||
|
new fields = SQL_GetFieldCount(query)
|
||||||
|
|
||||||
|
decl String:fieldNames[fields][32]
|
||||||
|
PrintToServer("Fields: %d", fields)
|
||||||
|
for (new i=0; i<fields; i++)
|
||||||
|
{
|
||||||
|
SQL_FieldNumToName(query, i, fieldNames[i], 32)
|
||||||
|
PrintToServer("-> Field %d: \"%s\"", i, fieldNames[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
PrintToServer("Rows: %d", rows)
|
||||||
|
decl String:result[255]
|
||||||
|
new row
|
||||||
|
while (SQL_FetchRow(query))
|
||||||
|
{
|
||||||
|
row++
|
||||||
|
PrintToServer("Row %d:", row)
|
||||||
|
for (new i=0; i<fields; i++)
|
||||||
|
{
|
||||||
|
SQL_FetchString(query, i, result, sizeof(result))
|
||||||
|
PrintToServer(" [%s] %s", fieldNames[i], result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Action:Command_TestSql1(args)
|
||||||
|
{
|
||||||
|
new String:error[255]
|
||||||
|
new Handle:db = SQL_DefConnect(error, sizeof(error))
|
||||||
|
if (db == INVALID_HANDLE)
|
||||||
|
{
|
||||||
|
PrintToServer("Failed to connect: %s", error)
|
||||||
|
return Plugin_Handled
|
||||||
|
}
|
||||||
|
|
||||||
|
new Handle:query = SQL_Query(db, "SELECT * FROM gaben")
|
||||||
|
if (query == INVALID_HANDLE)
|
||||||
|
{
|
||||||
|
SQL_GetError(db, error, sizeof(error))
|
||||||
|
PrintToServer("Failed to query: %s", error)
|
||||||
|
} else {
|
||||||
|
PrintQueryData(query)
|
||||||
|
CloseHandle(query)
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseHandle(db)
|
||||||
|
|
||||||
|
return Plugin_Handled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Action:Command_TestSql2(args)
|
||||||
|
{
|
||||||
|
new String:error[255]
|
||||||
|
new Handle:db = SQL_DefConnect(error, sizeof(error))
|
||||||
|
if (db == INVALID_HANDLE)
|
||||||
|
{
|
||||||
|
PrintToServer("Failed to connect: %s", error)
|
||||||
|
return Plugin_Handled
|
||||||
|
}
|
||||||
|
|
||||||
|
new Handle:stmt = SQL_PrepareQuery(db, "SELECT * FROM gaben WHERE gaben > ?", error, sizeof(error))
|
||||||
|
if (stmt == INVALID_HANDLE)
|
||||||
|
{
|
||||||
|
PrintToServer("Failed to prepare query: %s", error)
|
||||||
|
} else {
|
||||||
|
SQL_BindParamInt(stmt, 0, 1)
|
||||||
|
if (!SQL_Execute(stmt))
|
||||||
|
{
|
||||||
|
SQL_GetError(stmt, error, sizeof(error))
|
||||||
|
PrintToServer("Failed to execute query: %s", error)
|
||||||
|
} else {
|
||||||
|
PrintQueryData(stmt)
|
||||||
|
}
|
||||||
|
CloseHandle(stmt)
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseHandle(db)
|
||||||
|
|
||||||
|
return Plugin_Handled;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
7
plugins/testsuite/sqltest.sql
Normal file
7
plugins/testsuite/sqltest.sql
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
CREATE TABLE gaben (gaben int primary key, fat varchar(32));
|
||||||
|
|
||||||
|
INSERT INTO gaben VALUES(1, 'what the');
|
||||||
|
INSERT INTO gaben VALUES(2, 'Bee''s Knees!');
|
||||||
|
INSERT INTO gaben VALUES(3, 'newell');
|
||||||
|
INSERT INTO gaben VALUES(4, 'CRAB CAKE.');
|
Loading…
Reference in New Issue
Block a user