(4). 数据库操作类的实现(dbhelper.cpp)源码
#include"include/dbhelper.h"
DbHelper::DbHelper(char *user,char *pass,char *server,unsigned int port,char *defaultDb,
char *socket,unsigned int flag)
{
connect_arg=new Fields(user,pass,port,server,defaultDb,socket,flag);
Connect();
}
DbHelper::DbHelper(Fields &conf)
{
connect_arg=new Fields(conf);
Connect();
}
DbHelper::~DbHelper()
{
delete connect_arg;
DisConnect();
}
void DbHelper::DisConnect()
{
mysql_close(db);
freeResult();
setIsInit(false);
setIsConn(false);
}
void DbHelper::Init()
{
db=mysql_init(NULL);
if(db==NULL) //初始化失败
setIsInit(false);
else //初始化成功
setIsInit(true);
}
void DbHelper::Connect()
{
Init();
if(getIsInit())
{
if(mysql_real_connect(db,connect_arg->getServer(),connect_arg->getUser(),
connect_arg->getPass(),connect_arg->getDefaultDb(),connect_arg->getPort(),
connect_arg->getSocket(),connect_arg->getFlag())==NULL)
{ //连接失败
setIsConn(false);
}
else
{
//连接成功
setIsConn(true);
}
}
else
setIsConn(false); //设置连接失败
}
void DbHelper::ReConnect()
{
if(getIsConn())
DisConnect();
Connect();
}
bool DbHelper::execSQL(char *sql)
{
if(getIsConn())
{
freeResult();
if(mysql_real_query(db,sql,strlen(sql))==0)
{
MYSQL_RES *res=mysql_store_result(db);
if(res==NULL)
{
//无结果集
setHasResults(false);
}
else
{
//有结果集
setHasResults(true);
MYSQL_ROW row;
while((row=mysql_fetch_row(res))!=NULL)
{
result.push_back(row);
}
MYSQL_FIELD *tmpfield;
num_fields=mysql_num_fields(res);
for(int fi=0;fi<num_fields;fi++)
fields.push_back(make_pair(mysql_fetch_field_direct(res,fi),fi));
}
mysql_free_result(res);
return true;
}
else
{ //执行失败
return true;
}
}
else
{
return false;
}
}
void DbHelper::show()
{
if(hasResults())
{
for(ResultType::iterator iter=result.begin();iter != result.end();iter++)
{
for(int i=0;i<num_fields;i++)
std::cout<<(*iter)[i]<<" | \t";
std::cout<<std::endl;
}
}
else
{
//无结果集
std::cout<<"无结果集显示\n";
}
}
void DbHelper::showField()
{
int len=0;
for(FieldType::iterator iter=fields.begin();iter!=fields.end();iter++)
{
cout<<iter->first->name<<" | \t";
len+=string(iter->first->name).size()+string(" | ").size()+8;
}
cout<<endl;
for(int i=0;i<len;i++)
cout<<"-";
cout<<endl;
}
void DbHelper::showList(ListType::iterator beg,ListType::iterator end)
{
while(beg !=end)
{
cout<<*beg<<endl;
beg++;
}
}
ostream & operator<<(ostream &os,const DbHelper& r)
{
if(r.hasResults())
{
ResultType result=r.getResults();
unsigned int num_fields=r.getFieldNums();
for(ResultType::iterator iter=result.begin();iter !=result.end();iter++)
{
for(int i=0;i<num_fields;i++)
{
os<<(*iter)[i]<<" | \t";
}
os<<endl;
}
}
return os;
}
void DbHelper::freeResult()
{
result.clear();
fields.clear();
}
/*指定使用的数据库*/
bool DbHelper::useDb(char *database)
{
if(strlen(database)==0)
return false;
else
{
char *sql=new char[strlen(database)+1+4];
strcat(sql,"USE ");
strcat(sql,database);
bool issuccess=execSQL(sql);
delete[] sql;
return issuccess;
}
}
/*获取当前数据库名*/
char * DbHelper::currentDb()
{
char *sql="SELECT DATABASE();";
if(execSQL(sql))
{
ResultType r=getResults();
return r[0][0];
}
else
{
return NULL;
}
}