/*!
@file MySqlDB.cpp
@jason MySql Database operater
@author jason
@contact QQ: 345778630, email: rain_ywh@163.com
@version 1.0.0
@date 2009-03-10
history:
- 2009-03-10 1.0.0 jason
-# create MySqlDB.cpp file
*/
#include "mysqldb.h"
#include <assert.h>
// #ifdef _CONSOLE
#ifdef _WINDOW
void TRACE(const char* lpszFormat, ...)
{
char lpsz[1024] = {0};
va_list va_alist = {0};
va_start( va_alist, lpszFormat );
_vsnprintf( lpsz, 1024, lpszFormat, va_alist );
va_end( va_alist );
printf(lpsz);
};
#else
void TRACE(const char* lpszFormat, ...)
{
char lpsz[1024] = {0};
va_list va_alist = {0};
va_start( va_alist, lpszFormat );
_vsnprintf( lpsz, 1024, lpszFormat, va_alist );
va_end( va_alist );
OutputDebugString(lpsz);
};
#endif
char* _ConvertGBKToUtf8(char* rtnBuffer,const char* strGBK)
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, (LPWSTR)wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);
strcpy(rtnBuffer, szUtf8);
delete[] szUtf8;
delete[] wszUtf8;
return rtnBuffer;
}
char* _ConvertUtf8ToGBK(char* rtnBuffer,const char* strUtf8)
{
int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
unsigned short * wszGBK = new unsigned short[len+1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, (LPWSTR)wszGBK, len);
len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
char *szGBK=new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0, (LPCWSTR)wszGBK, -1, szGBK, len, NULL,NULL);
strcpy(rtnBuffer, szGBK);
delete[] szGBK;
delete[] wszGBK;
return rtnBuffer;
}
CMySqlDB::CMySqlDB(void)
{
m_numfields = 0;
m_numrows = 0;
m_pResult = NULL;
m_pFields = NULL;
m_row = NULL;
m_bUTF8 = FALSE;
mysql_init(&m_MySql);
mysql_options(&m_MySql,MYSQL_READ_DEFAULT_GROUP,"your_prog_name");
}
CMySqlDB::~CMySqlDB(void)
{
Close();
}
// connect mysql database
BOOL CMySqlDB::Connect(const char* host, const char* user, const char* passwd, const char *db, unsigned int port)
{
if ( !mysql_real_connect(&m_MySql, host, user, passwd, db, 0, NULL, 0) )
{
TRACE("Failed to connect to database: Error: %s\n", mysql_error(&m_MySql));
return FALSE;
}
return TRUE;
}
// set utf8 characterset
BOOL CMySqlDB::SetUTF8()
{
m_bUTF8 = SetCharacterset("utf8");
return m_bUTF8;
}
BOOL CMySqlDB::IsUTF8Set()
{
return m_bUTF8;
}
// set characterset
BOOL CMySqlDB::SetCharacterset(const char* strCharacterset)
{
// exp: strCharacterset = "utf8"
if ( mysql_set_character_set(&m_MySql, strCharacterset) != 0 )
{
TRACE("Failed to connect to database: Error: %s\n", mysql_error(&m_MySql));
return FALSE;
}
//printf("New client character set: %s\n",
// mysql_character_set_name(&m_MySql));
return TRUE;
}
// close the connection
void CMySqlDB::Close()
{
ReleaseResult();
mysql_close(&m_MySql);
}
// release Result
void CMySqlDB::ReleaseResult()
{
if (m_pResult)
{
mysql_free_result(m_pResult);
m_pResult = NULL;
}
}
// check is connect
BOOL CMySqlDB::IsConnect()
{
if ( mysql_ping(&m_MySql) != 0 )
{
TRACE("Failed to IsConnect to database: Error: %s\n", mysql_error(&m_MySql));
return FALSE;
}
return TRUE;
}
// open or close AutoCommit flag
BOOL CMySqlDB::AutoCommit(BOOL bOpen)
{
if ( mysql_autocommit(&m_MySql, bOpen) != 0 )
{
TRACE("Failed to AutoCommit: Error: %s\n", mysql_error(&m_MySql));
return FALSE;
}
return TRUE;
}
// Commits the current transaction.
BOOL CMySqlDB::Commit()
{
if ( mysql_commit(&m_MySql) != 0 )
{
TRACE("Failed to Commit: Error: %s\n", mysql_error(&m_MySql));
return FALSE;
}
return TRUE;
}
// Rolls back the current transaction
BOOL CMySqlDB::Rollback()
{
if ( mysql_rollback(&m_MySql) != 0 )
{
TRACE("Failed to Rollback: Error: %s\n", mysql_error(&m_MySql));
return FALSE;
}
return TRUE;
}
// open a database
BOOL CMySqlDB::OpenDB(const char *db)
{
if ( mysql_select_db(&m_MySql, db) != 0 )
{
TRACE("Failed to open database: Error: %s\n", mysql_error(&m_MySql));
return FALSE;
}
return TRUE;
}
// query with a sql string
BOOL CMySqlDB::Query(const char *stmt_str, UINT nStringLen)
{
int nLen = nStringLen;
if (nLen == 0) nLen = (UINT)strlen(stmt_str);
const char *pStrSQL = stmt_str;
if ( IsUTF8Set() )
{
char szSQL_UTF8[1024];
_ConvertGBKToUtf8(szSQL_UTF8, stmt_str);
pStrSQL = szSQL_UTF8;
nLen = (UINT)strlen(szSQL_UTF8);
}
if ( mysql_real_query(&m_MySql, pStrSQL, nLen) != 0 )
{
TRACE("Failed to query: Error: %s\n", mysql_error(&m_MySql));
return FALSE;
}
m_numfields = 0;
m_numrows = 0;
// free Result
ReleaseResult();
m_pResult = mysql_store_result(&m_MySql);
if (m_pResult) // there are rows
{
m_numfields = mysql_num_fields(m_pResult);
// retrieve rows, then call mysql_free_result(result)
m_numrows = mysql_num_rows(m_pResult);
// fetch fields
m_pFields = mysql_fetch_fields(m_pResult);
}
else // mysql_store_result() returned nothing; should it have?
{
if(mysql_field_count(&m_MySql) == 0)
{
// query does not return data
// (it was not a SELECT)
m_numrows = mysql_affected_rows(&m_MySql);
}
else // mysql_store_result() should have returned data
{
TRACE("Error: %s\n", mysql_error(&m_MySql));
return FALSE;
}
}
return TRUE;
}
// query with a formated sql string
BOOL CMySqlDB::QueryF(const char *lpszFormat, ...)
{
char lpsz[1024] = {0};
va_list va_alist = {0};
va_start( va_alist, lpszFormat );
_vsnprintf( lpsz, 1024, lpszFormat, va_alist );
va_end( va_alist );
UINT nStrLen = (UINT)strlen(lpsz);
return Query(lpsz, nStrLen);
}
// get fields num
UINT CMySqlDB::GetFieldsNum()
{
return m_numfields;
}
// get rows num
ULONGLONG CMySqlDB::GetRowsNum()
{
return m_numrows;
}
// get field name
const char* CMySqlDB::GetFieldName(UINT index)
{
assert(m_pFields != NULL);
assert(index <= m_numfields-1);
if (index > m_numfields-1)
{
index = m_numfields-1;
}
return m_pFields[index].name;
}
// get a row
BOOL CMySqlDB::FetchRow()
{
assert(m_pFields != NULL);
m_row = mysql_fetch_row(m_pResult);
if (m_row == NULL)
{
// TRACE("FetchRow Error: %s\n", mysql_error(&m_MySql));
return FALSE;
}
return TRUE;
}
// get a value in row
const char* CMySqlDB::GetFieldValue(char* szFieldValue, UINT index)
{
assert(m_row != NULL);
assert(m_pFields != NULL);
assert(index <= m_numfields-1);
if (index > m_numfields-1)
{
index = m_numfields-1;
}
strcpy(szFieldValue, (m_row[index] ? m_row[index] : "(NULL)"));
if ( IsUTF8Set() )
{
_ConvertUtf8ToGBK(szFieldValue, szFieldValue);
}
return szFieldValue;
}
int CMySqlDB::GetFieldValue(UINT index)
{
assert(m_row != NULL);
assert(m_pFields != NULL);
assert(index <= m_numfields-1);
if (index > m_numfields-1)
{
index = m_numfields-1;
}
char szFieldValue[50];
strcpy(szFieldValue, (m_row[index] ? m_row[index] : "0"));
if ( IsUTF8Set() )
{
_ConvertUtf8ToGBK(szFieldValue, szFieldValue);
}
return atoi(szFieldValue);
}
//// get a value for param row and field
//const char* CMySqlDB::GetFieldValue(ULONGLONG nRow, UINT nCol)
//{
// assert(nRow <= m_numrows-1);
// assert(nCol <= m_numfields-1);
// MYSQL_FIELD_OFFSET fieldOffset;
// fieldOffset = mysql_field_seek(m_pResult, nCol);
// //ULONGLONG rowOffs