amxmodx/dlls/mssql/mssql_amx.cpp
David Anderson 527ca0efb7 New DBI API.
2004-06-28 23:20:04 +00:00

305 lines
4.6 KiB
C++
Executable File

#include "mssql_amx.h"
using namespace std;
SQL::SQL()
{
isFree = true;
}
SQL::~SQL()
{
if (isFree)
Disconnect();
}
SQLResult::SQLResult()
{
isFree = true;
RowCount = 0;
FieldCount = 0;
sql = NULL;
}
SQLResult::~SQLResult()
{
if (!isFree)
FreeResult();
}
int SQL::Error(_com_error &e)
{
if (isFree)
return 0;
_bstr_t bstrSource(e.Description());
ErrorStr.assign((LPCSTR)bstrSource);
ErrorCode = e.Error();
return ErrorCode;
}
int SQL::Connect(const char *host, const char *user, const char *pass, const char *base)
{
Username.assign(user);
Password.assign(pass);
Database.assign(base);
Host.assign(host);
isFree = false;
int err = 0;
HRESULT hr;
cstr.assign("Provider=sqloledb;Network Library=DBMSSOCN;");
cstr.append("Data Source=");
cstr.append(Host);
cstr.append(";Initial Catalog=");
cstr.append(Database);
cstr.append(";User ID=");
cstr.append(Username);
cstr.append(";Password=");
cstr.append(Password);
try {
hr = cn.CreateInstance(__uuidof(ADODB::Connection));
cn->Open(cstr.c_str(), Username.c_str(), Password.c_str(), NULL);
} catch (_com_error &e) {
Error(e);
return false;
}
return 1;
}
void SQL::Disconnect()
{
Host.clear();
Username.clear();
Password.clear();
Database.clear();
isFree = true;
try {
cn->Close();
cn = NULL;
} catch (_com_error &e) {
Error(e);
return;
}
}
int SQL::Query(const char *query)
{
if (isFree)
{
ErrorCode = -1;
return -1;
}
SQLResult *p = new SQLResult;
int ret = p->Query(this, query);
if (ret < 1)
{
delete p;
return ret;
}
unsigned int i = 0;
int id = -1;
for (i=0; i < Results.size(); i++)
{
if (Results[i]->isFree)
{
id = i;
break;
}
}
if (id < 0) {
Results.push_back(p);
return Results.size();
} else {
SQLResult *r = Results[id];
Results[id] = p;
delete r;
return (id+1);
}
}
int SQLResult::Query(SQL *cn, const char *query)
{
isStart = false;
sql = cn;
try {
HRESULT hr = res.CreateInstance(__uuidof(ADODB::Recordset));
if (FAILED(hr)) {
return -1;
}
res->CursorType = ADODB::adOpenStatic;
res->Open((_bstr_t)query, (_bstr_t)cn->cstr.c_str(), ADODB::adOpenForwardOnly, ADODB::adLockReadOnly, ADODB::adCmdText);
isStart = true;
} catch (_com_error &e) {
cn->Error(e);
FreeResult();
return -1;
}
try {
res->MoveFirst();
} catch (_com_error &e) {
cn->Error(e);
FreeResult();
return 0;
}
if (NumRows()>0)
return 1;
return 0;
}
bool SQLResult::Nextrow()
{
if (isFree)
return false;
try {
if (res->ADOEOF)
return 0;
res->MoveNext();
if (res->ADOEOF)
return 0;
return 1;
} catch (_com_error &e) {
sql->Error(e);
return 0;
}
return 0;
}
void SQLResult::FreeResult()
{
if (isFree)
return;
isFree = true;
try {
res->Close();
} catch (_com_error &e) {
sql->Error(e);
return;
}
}
const char *SQLResult::GetField(unsigned int field)
{
if (isFree)
{
return "";
}
char buf[256];
try {
if (res->ADOEOF)
{
return "";
}
ADODB::FieldPtr pFld = NULL;
_variant_t index = (short)field;
pFld = res->Fields->GetItem(&index);
_variant_t FldVal = pFld->GetValue();
switch (FldVal.vt)
{
case (VT_BOOL):
if (FldVal.boolVal) {
return "1";
} else {
return "0";
}
break;
case (VT_BSTR):
LastResult.assign((LPCSTR)(_bstr_t)FldVal.bstrVal);
break;
case (VT_I4):
sprintf(buf, "%d", FldVal.iVal);
buf[255] = 0;
LastResult.assign(buf);
break;
case (VT_EMPTY):
sprintf(buf, "%d", FldVal.iVal);
buf[255] = 0;
LastResult.assign(buf);
break;
default:
LastResult.assign("");
break;
}
} catch (_com_error &e) {
sql->Error(e);
return 0;
}
return LastResult.c_str();
}
const char *SQLResult::GetField(const char *field)
{
if (isFree)
{
return "";
}
char buf[256];
try {
if (res->ADOEOF)
{
return "";
}
ADODB::FieldPtr pFld = NULL;
pFld = res->Fields->GetItem(field);
_variant_t FldVal = pFld->GetValue();
switch (FldVal.vt)
{
case (VT_BOOL):
if (FldVal.boolVal) {
return "1";
} else {
return "0";
}
break;
case (VT_BSTR):
LastResult.assign((_bstr_t)FldVal.bstrVal);
break;
case (VT_I4):
sprintf(buf, "%d", FldVal.iVal);
buf[255] = 0;
LastResult.assign(buf);
break;
case (VT_EMPTY):
sprintf(buf, "%d", FldVal.iVal);
buf[255] = 0;
LastResult.assign(buf);
break;
default:
LastResult.assign("");
break;
}
} catch (_com_error &e) {
sql->Error(e);
return 0;
}
return LastResult.c_str();
}
unsigned int SQLResult::NumRows()
{
if (isFree)
return 0;
return (unsigned int)(res->RecordCount);
}