Hello,
I develop threaded mysql client in c++ that uses connection
pool.
The program coredumps during vio_read (called from my_net_read).
I'm using libmysqlclient_r and keep all rules from "How to make
threaded client" section. Thread-pool is implemented with
CommonC++ class Thread.
my_thread_init() and my_thread_end() are called when the new thread
is created/deleted. my_init() is called in pool object constructor.
Could anyone email me working threaded client (preferably in c++) ?
The main query method is below. Does anyone have idea why it doesn't
work ? (I can post the rest of methods if needed)
All notes are welcome :)
Thanks.
--
//getFreeHandle() and disposeHandle() are mutexed and track which
//connections are in use (bool isBusy[MAX_CONN]).
int SQLPool::query(SQLResult &res, string sql)
{
int i, ret;
res.free(); res.init();
int h = getFreeHandle();
if (h < 0) return -1;
int rh = mysql_query(handles[h], sql.c_str());
if (rh < 0) {
res.error = mysql_error(handles[h]);
LogMsg(str("\'")+sql+"': "+res.error, L_GRP, LL_ALERT);
disposeHandle(h);
return -1;
}
MYSQL_RES *table = mysql_store_result(handles[h]);
ret = mysql_affected_rows(handles[h]);
if (! table || ! table->data) {
res.nRows = 0;
res.resetSeq();
res.isBusy = true;
//if (table) mysql_free_result(table);
disposeHandle(h);
return 0;
}
MYSQL_ROWS *row;
MYSQL_FIELD *field;
SQLRow *sqlrow;
res.nRows = mysql_num_rows(table);
res.nFields = mysql_num_fields(table);
if (res.nRows > 0) res.rows = new SQLRow*[res.nRows];
if (res.nFields >0 ) res.fieldNames = new char*[res.nFields];
// Copy field names
for(i=0; i < res.nFields; i++) {
res.fieldNames[i] = new char[xstrlen(table->fields[i].name)+1];
xstrcpy(res.fieldNames[i], table->fields[i].name);
}
// Copy data row-by-row
for(i=0, row = table->data->data; row && i < res.nRows; i++, row = row->next) {
sqlrow = new SQLRow(res.nFields);
for(int j=0; j<res.nFields; j++) {
int len = xstrlen(row->data[j]);
sqlrow->data[j] = new char[len+1];
xstrcpy(sqlrow->data[j], row->data[j]);
}
sqlrow->parent = &res;
res.rows[i] = sqlrow;
}
mysql_free_result(table);
disposeHandle(h);
return ret;
}
--
Best regards,
Anatoliy mailto:[EMAIL PROTECTED]
---------------------------------------------------------------------
Before posting, please check:
http://www.mysql.com/manual.php (the manual)
http://lists.mysql.com/ (the list archive)
To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php