⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 database.cpp

📁 MySql++ wrapper
💻 CPP
字号:
/** **	Database.cpp ** **	Published / author: 2001-02-15 / grymse@alhem.net **//*Copyright (C) 2001  Anders HedstromThis program is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public Licenseas published by the Free Software Foundation; either version 2of the License, or (at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.*/#ifdef _WIN32#pragma warning(disable:4786)#endif#include <string>#include <map>#ifdef WIN32#include <config-win.h>#include <mysql.h>#else#include <stdio.h>#include <stdlib.h>#include <string.h>#include <mysql/mysql.h>#include <stdarg.h>#endif#include "IError.h"#include "Database.h"Database::Database(const std::string& d,IError *e):database(d),m_errhandler(e),m_embedded(true){//	freedb(grabdb());		// open one connection}Database::Database(const std::string& h,const std::string& u,const std::string& p,const std::string& d,IError *e):host(h),user(u),password(p),database(d),m_errhandler(e),m_embedded(false){//	freedb(grabdb());		// open one connection}Database::~Database(){	for (opendb_v::iterator it = m_opendbs.begin(); it != m_opendbs.end(); it++)	{		OPENDB *p = *it;		mysql_close(&p -> mysql);	}	while (m_opendbs.size())	{		opendb_v::iterator it = m_opendbs.begin();		OPENDB *p = *it;		if (p -> busy)		{			error("destroying Database object before Query object");		}		delete p;		m_opendbs.erase(it);	}}void Database::OnMyInit(OPENDB *odb){  // using embedded server (libmysqld)  if (m_embedded)  {    mysql_options(&odb -> mysql, MYSQL_READ_DEFAULT_GROUP, "test_libmysqld_CLIENT");  }}void Database::RegErrHandler(IError *p){	m_errhandler = p;}Database::OPENDB *Database::grabdb(){	OPENDB *odb = NULL;	for (opendb_v::iterator it = m_opendbs.begin(); it != m_opendbs.end(); it++)	{		odb = *it;		if (!odb -> busy)		{			break;		}		else		{			odb = NULL;		}	}	if (!odb)	{		odb = new OPENDB;    if (!odb)    {      error("grabdb: OPENDB struct couldn't be created");      return NULL;    }		if (!mysql_init(&odb -> mysql))		{			error("mysql_init() failed - list size %d",m_opendbs.size());			delete odb;			return NULL;		}    // use callback to set mysql_options() before connect, etc    this -> OnMyInit(odb);    if (m_embedded)    {		  if (!mysql_real_connect(&odb -> mysql,NULL,NULL,NULL,database.c_str(),0,NULL,0) )		  {			  error("mysql_real_connect(NULL,NULL,NULL,%s,0,NULL,0) failed - list size %d",database.c_str(),m_opendbs.size());			  delete odb;			  return NULL;		  }    }    else    {		  if (!mysql_real_connect(&odb -> mysql,host.c_str(),user.c_str(),password.c_str(),database.c_str(),0,NULL,0) )		  {			  error("mysql_real_connect(%s,%s,***,%s,0,NULL,0) failed - list size %d",host.c_str(),user.c_str(),database.c_str(),m_opendbs.size());			  delete odb;			  return NULL;		  }    }		odb -> busy = true;		m_opendbs.push_back(odb);	}	else	{		if (mysql_ping(&odb -> mysql))		{			error("mysql_ping() failed when reusing an old connection from the connection pool");		}		odb -> busy = true;	}	return odb;}void Database::freedb(Database::OPENDB *odb){	if (odb)	{		odb -> busy = false;	}}void Database::error(const char *format, ...){	if (m_errhandler)	{		va_list ap;		char errstr[5000];		va_start(ap, format);#ifdef WIN32    vsprintf(errstr, format, ap);#else    vsnprintf(errstr, 5000, format, ap);#endif		va_end(ap);		m_errhandler -> error(*this, errstr);	}}void Database::error(Query& q,const char *format, ...){	if (m_errhandler)	{		va_list ap;		char errstr[5000];		va_start(ap, format);#ifdef WIN32    vsprintf(errstr, format, ap);#else    vsnprintf(errstr, 5000, format, ap);#endif		va_end(ap);		m_errhandler -> error(*this, q, errstr);	}}bool Database::Connected(){	OPENDB *odb = grabdb();	if (!odb)	{		return false;	}	int ping_result = mysql_ping(&odb -> mysql);	if (ping_result)	{		error("mysql_ping() failed");	}	freedb(odb);	return ping_result ? false : true;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -