コード例 #1
0
ファイル: CMysql.cpp プロジェクト: gogolyq/lce
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);
}
コード例 #2
0
ファイル: CMysql.cpp プロジェクト: qiqisteve/Athena
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);
}