Ejemplo n.º 1
0
////////protected
void CMySql::Connect()
{
	mysql_init(_Mysql);

	//建立连接后, 自动调用设置字符集语句
	if (!_charSet.empty())  {
		if (mysql_options(_Mysql, MYSQL_SET_CHARSET_NAME, _charSet.c_str())) {
			_errno = mysql_errno(_Mysql);
			throw mysql_execfail(string("CMySql::Connect: mysql_options MYSQL_SET_CHARSET_NAME ") + _charSet + ":" + mysql_error(_Mysql));
		} 

	}
	//设置连接超时时间
	if (mysql_options(_Mysql, MYSQL_OPT_CONNECT_TIMEOUT, (const char*)&_connect_timeout_s)) {
		_errno = mysql_errno(_Mysql);
        std::ostringstream oss;
        oss << _connect_timeout_s;
		throw mysql_execfail(string("CMySql::Connect: mysql_options MYSQL_OPT_CONNECT_TIMEOUT ") + oss.str() + ":" + mysql_error(_Mysql));
	}
	//设置读超时时间
	if (mysql_options(_Mysql, MYSQL_OPT_READ_TIMEOUT, (const char*)&_read_timeout_s)) {
		_errno = mysql_errno(_Mysql);
        std::ostringstream oss;
        oss << _read_timeout_s;
		throw mysql_execfail(string("CMySql::Connect: mysql_options MYSQL_OPT_READ_TIMEOUT ") + oss.str() + ":" + mysql_error(_Mysql));
	}
	//设置写超时时间
	if (mysql_options(_Mysql, MYSQL_OPT_WRITE_TIMEOUT, (const char*)&_write_timeout_s)) {
		_errno = mysql_errno(_Mysql);
        std::ostringstream oss;
        oss << _write_timeout_s;
		throw mysql_execfail(string("CMySql::Connect: mysql_options MYSQL_OPT_WRITE_TIMEOUT ") + oss.str() + ":" + mysql_error(_Mysql));
	}

	/*
	   if (mysql_real_connect(_Mysql,_host.c_str(),_user.c_str(),_pass.c_str()
	   , NULL, _port, NULL, 0) == NULL)
	   throw mysql_execfail(string("CMySql::Connect: mysql_real_connect to ") + _host + ":" + mysql_error(_Mysql));
	 */
	// 支持存储过程调用 -- haritema
	if (mysql_real_connect(_Mysql, _host.c_str(), _user.c_str(), _pass.c_str()
				, NULL, _port, NULL, CLIENT_MULTI_STATEMENTS) == NULL)
	{
		_errno = mysql_errno(_Mysql);
		throw mysql_execfail(string("CMySql::Connect: mysql_real_connect to ") + _host + ":" + mysql_error(_Mysql));
	}
	_bIsConn = true;
}
Ejemplo n.º 2
0
////////protected
void CMySql::Connect()
{
	mysql_init(_Mysql);

    if(!_charSet.empty())  {
        if (mysql_options(_Mysql, MYSQL_SET_CHARSET_NAME, _charSet.c_str())) {
    		throw mysql_execfail(string("CMySql::Connect: mysql_options MYSQL_SET_CHARSET_NAME ") + _charSet + ":" + mysql_error(_Mysql));
        }
    }

	if (mysql_real_connect(_Mysql,_host.c_str(),_user.c_str(),_pass.c_str()
		, NULL, _port, NULL, CLIENT_MULTI_STATEMENTS) == NULL) 
		throw mysql_execfail(string("CMySql::Connect: mysql_real_connect to ") + _host + ":" + mysql_error(_Mysql));

	_bIsConn = true;
}
Ejemplo n.º 3
0
void CMySql::setCharSet(const string& cs)throw(mysql_execfail)
{
	if (!_bIsConn) {
		_charSet = cs;
		return;
	}

	Close();
	_charSet = cs;
	Connect();

	if (_dbname.empty()) return;

	if (mysql_select_db(_Mysql, _dbname.c_str())) {
		int ret_errno = mysql_errno(_Mysql);
		Close();
		if (ret_errno == 2013 || ret_errno == 2006) { // CR_SERVER_LOST,重连一次
			Connect();
		}

		if (mysql_select_db(_Mysql, _dbname.c_str())){
            _errno = mysql_errno(_Mysql);
			throw mysql_execfail(string("CMySql::Select: mysql_select_db ") + _dbname + ":" + mysql_error(_Mysql));
	    }
    }
}
Ejemplo n.º 4
0
void CMySql::Select()
{
	if(!_bIsConn) Connect();

    if(_dbname.empty()) return;

	if (mysql_select_db(_Mysql, _dbname.c_str())) {
		int ret_errno = mysql_errno(_Mysql);
		Close();
		if (ret_errno == 2013 || ret_errno == 2006){
			Connect();
		}

		if (mysql_select_db(_Mysql, _dbname.c_str())) 
			throw mysql_execfail(string("CMySql::Select: mysql_select_db ")+_dbname + ":" + mysql_error(_Mysql));
	}
}
Ejemplo n.º 5
0
MySqlData CMySql::query(const string & sql) throw(mysql_execfail)
{
	Select();

    if (mysql_real_query(_Mysql, sql.c_str(), sql.length())) {
        string err(mysql_error(_Mysql) + string(":") + sql);
        int ret_errno = mysql_errno(_Mysql);
        Close();
        if (ret_errno == 2013 || ret_errno == 2006){ 
            Connect();
            if (mysql_select_db(_Mysql, _dbname.c_str())) 
                throw mysql_execfail(string("CMySql::query: mysql_select_db ")+_dbname + ":" + mysql_error(_Mysql));
            if (mysql_real_query(_Mysql, sql.c_str(), sql.length())) 
                throw mysql_execfail(string("CMySql::query: ") + mysql_error(_Mysql) + "|" + err);
        } else {
            throw mysql_execfail(string("CMySql::query: ") + err);
        }
    }

	MySqlBasicData *data = new MySqlBasicData();
	// store
	if(mysql_field_count(_Mysql) == 0) { //
		int inum = mysql_affected_rows(_Mysql);
		string err(sql);
		if(inum<0) {
			delete data;
			throw mysql_execfail(string("CMySql::query: ") + mysql_error(_Mysql) + "|" + err);
		}
		data->affected_rows(inum);
		return MySqlData(data);
	}
	MYSQL_RES *  pstMySqlRes = mysql_store_result(_Mysql);
	if (pstMySqlRes == NULL)  {
		string err(sql);
		delete data;
		throw mysql_execfail(string("CMySql::query: mysql_store_result is null: ") + mysql_error(_Mysql) + "|" + err);
	}

	// fields
	MYSQL_FIELD *field; unsigned i=0;
	vector<string> vfield;
	while((field = mysql_fetch_field(pstMySqlRes)))
	{
		if(i==0) {data->org_name("not support"); i++;}
		vfield.push_back(field->name);
	}
	try{
		data->Fields(vfield);
	}catch(mysql_slopover& e) {
		delete data;
		mysql_free_result(pstMySqlRes);
		throw mysql_execfail(string("CMySql::query: catch mysql_slopover:") + e.what());		
	}

	// values
	data->clear();
	MYSQL_ROW row; 	vector<string> vrow;
	try {
		while ((row = mysql_fetch_row(pstMySqlRes))) {
			vrow.clear();
			unsigned long * lengths = mysql_fetch_lengths(pstMySqlRes);
			for(i=0;i<vfield.size();i++) {
				string s;
				if(row[i]) {
					s = string(row[i], lengths[i]);
				}
				else {
					s = "";
				}
				vrow.push_back(s);
			}
			data->push_back(vrow);
		}
	} catch(mysql_slopover& e) {
		delete data;
		mysql_free_result(pstMySqlRes);
		throw mysql_execfail(string("CMySql::query: catch mysql_slopover: ")+e.what());
	}
	data->genrows();
	mysql_free_result(pstMySqlRes);

	return MySqlData(data);
}
Ejemplo n.º 6
0
MySqlData CMySql::query(const string& sql) throw(mysql_execfail)
{
	Select();

	if (mysql_real_query(_Mysql, sql.c_str(), sql.length())) {
		string err(mysql_error(_Mysql) + string(":") + sql);
		int ret_errno = _errno = mysql_errno(_Mysql);
		Close();
		if (ret_errno == 2013 || ret_errno == 2006) { // CR_SERVER_LOST,重连一次
			Connect();
			if (mysql_select_db(_Mysql, _dbname.c_str())){
				_errno = mysql_errno(_Mysql);
				throw mysql_execfail(string("CMySql::query: mysql_select_db ") + _dbname + ":" + mysql_error(_Mysql));
			}
			if (mysql_real_query(_Mysql, sql.c_str(), sql.length())){
				_errno = mysql_errno(_Mysql);
				throw mysql_execfail(string("CMySql::query: ") + mysql_error(_Mysql) + "|" + err);
			}
		} else {
			throw mysql_execfail(string("CMySql::query: ") + err);
		}
	}

	MySqlBasicData* data = new MySqlBasicData();
	// store
	if (mysql_field_count(_Mysql) == 0) { //
		int inum = mysql_affected_rows(_Mysql);
		if (inum < 0) {
			_errno = mysql_errno(_Mysql);
			string err(sql);
			delete data;
			throw mysql_execfail(string("CMySql::query: ") + mysql_error(_Mysql) + "|" + err);
		}
		data->affected_rows(inum);

		int used_id = mysql_insert_id(_Mysql);//为0表示不是auto_increase value
		data->set_insert_autoincrement_id(used_id);
		return MySqlData(data);
	}
	MYSQL_RES*   pstMySqlRes = mysql_store_result(_Mysql);
	if (pstMySqlRes == NULL)  {
		_errno = mysql_errno(_Mysql);
		string err(sql);
		delete data;
		throw mysql_execfail(string("CMySql::query: mysql_store_result is null: ") + mysql_error(_Mysql) + "|" + err);
	}

	// fields
	MYSQL_FIELD* field; unsigned i = 0;
	vector<string> vfield;
	while ((field = mysql_fetch_field(pstMySqlRes))) {
		//      if(i==0) {data->org_name(field->org_name); i++;}
		// 2007-01-24,mysql高版本又恢复了table字段,鉴于该功能的不稳定性,不再支持此api
		if (i == 0) {data->org_name("not support"); i++;}
		/*
		// 2004-12-20,mysql 4.0以下不支持org_name
#if MYSQL_VERSION_ID > 40027
if(i==0) {data->org_name(field->org_name); i++;}
#else
if(i==0) {data->org_name(field->table); i++;}
#endif
		 */
		vfield.push_back(field->name);
	}
	try {
		data->Fields(vfield);
	} catch (mysql_slopover& e) {
		delete data;
		mysql_free_result(pstMySqlRes);
		throw mysql_execfail(string("CMySql::query: catch mysql_slopover:") + e.what());
	}

	// values
	data->clear();
	MYSQL_ROW row;  vector<string> vrow;
	try {
		while ((row = mysql_fetch_row(pstMySqlRes))) {
			vrow.clear();
			unsigned long* lengths = mysql_fetch_lengths(pstMySqlRes);
			for (i = 0; i < vfield.size(); i++) {
				string s;
				if (row[i]) {
					s = string(row[i], lengths[i]);
				} else {
					s = "";
				}
				vrow.push_back(s);
			}
			data->push_back(vrow);
		}
	} catch (mysql_slopover& e) {
		delete data;
		mysql_free_result(pstMySqlRes);
		throw mysql_execfail(string("CMySql::query: catch mysql_slopover: ") + e.what());
	}
	data->genrows();
	mysql_free_result(pstMySqlRes);

	return MySqlData(data);
}