added amb281 - multiple result sets for MySQL

This commit is contained in:
David Anderson
2007-10-22 21:31:02 +00:00
parent 2d737970d0
commit a86b1c5097
16 changed files with 150 additions and 5 deletions

View File

@ -61,6 +61,10 @@ namespace SourceMod
* Rewinds to the first row.
*/
virtual void Rewind() =0;
/**
* Transitions to the next result set, if any is available.
*/
virtual bool NextResultSet() =0;
};
struct QueryInfo

View File

@ -57,7 +57,7 @@ IDatabase *MysqlDriver::_Connect(DatabaseInfo *info, int *errcode, char *error,
info->database,
info->port,
NULL,
0) == NULL)
CLIENT_MULTI_STATEMENTS) == NULL)
{
if (errcode)
{

View File

@ -19,6 +19,7 @@
#if defined WIN32 || defined _WIN32
#include <winsock.h>
#endif
typedef unsigned long ulong;
#include <mysql.h>
#endif //_INCLUDE_SOURCEMOD_MYSQL_HEADERS_H

View File

@ -84,7 +84,9 @@ bool MysqlQuery::ExecuteR(QueryInfo *info, char *error, size_t maxlength)
{
snprintf(error, maxlength, "%s", mysql_error(m_pDatabase->m_pMysql));
}
} else {
}
else
{
MYSQL_RES *res = mysql_store_result(m_pDatabase->m_pMysql);
if (!res)
{
@ -105,7 +107,7 @@ bool MysqlQuery::ExecuteR(QueryInfo *info, char *error, size_t maxlength)
info->errorcode = 0;
info->success = true;
info->affected_rows = mysql_affected_rows(m_pDatabase->m_pMysql);
MysqlResultSet *rs = new MysqlResultSet(res);
MysqlResultSet *rs = new MysqlResultSet(res, m_pDatabase->m_pMysql);
info->rs = rs;
}
}

View File

@ -61,11 +61,12 @@ int MysqlResultRow::GetInt(unsigned int columnId)
return atoi(GetStringSafe(columnId));
}
MysqlResultSet::MysqlResultSet(MYSQL_RES *res) :
MysqlResultSet::MysqlResultSet(MYSQL_RES *res, MYSQL *mysql) :
m_pRes(res)
{
m_Rows = (unsigned int)mysql_num_rows(res);
m_Columns = (unsigned int)mysql_num_fields(res);
m_pMySQL = mysql;
if (m_Rows > 0)
{
@ -77,7 +78,49 @@ MysqlResultSet::MysqlResultSet(MYSQL_RES *res) :
MysqlResultSet::~MysqlResultSet()
{
if (m_pRes == NULL)
{
return;
}
mysql_free_result(m_pRes);
while (mysql_next_result(m_pMySQL) == 0)
{
m_pRes = mysql_store_result(m_pMySQL);
if (m_pRes != NULL)
{
mysql_free_result(m_pRes);
}
}
}
bool MysqlResultSet::NextResultSet()
{
if (!mysql_more_results(m_pMySQL))
{
return false;
}
mysql_free_result(m_pRes);
if (mysql_next_result(m_pMySQL) != 0
|| (m_pRes = mysql_store_result(m_pMySQL)) == NULL)
{
m_Rows = 0;
m_pRes = NULL;
m_Columns = 0;
m_kRow.m_CurRow = NULL;
return false;
}
m_Rows = (unsigned int)mysql_num_rows(m_pRes);
m_Columns = (unsigned int)mysql_num_fields(m_pRes);
if (m_Rows > 0)
{
NextRow();
}
m_kRow.m_Columns = m_Columns;
}
void MysqlResultSet::FreeHandle()

View File

@ -30,7 +30,7 @@ namespace SourceMod
class MysqlResultSet : public IResultSet
{
public:
MysqlResultSet(MYSQL_RES *res);
MysqlResultSet(MYSQL_RES *res, MYSQL *mysql);
~MysqlResultSet();
public:
void FreeHandle();
@ -44,7 +44,9 @@ namespace SourceMod
IResultRow *GetRow();
void NextRow();
void Rewind();
bool NextResultSet();
private:
MYSQL *m_pMySQL;
MYSQL_RES *m_pRes;
MysqlResultRow m_kRow;
unsigned int m_Columns;