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); }
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); }