|
|
| version 1.8, 2002/12/09 11:07:46 | version 1.9, 2002/12/09 12:29:03 |
|---|---|
| Line 205 public: | Line 205 public: |
| services._throw("result contains no columns"); | services._throw("result contains no columns"); |
| } | } |
| try { | bool failed=false; |
| SQL_Error sql_error; | |
| for(int i=0; i<column_count; i++){ | #define CHECK(afailed) \ |
| MYSQL_FIELD *field=mysql_fetch_field(res); | if(afailed) { \ |
| size_t size=strlen(field->name); | failed=true; \ |
| void *ptr=services.malloc(size); | goto cleanup; \ |
| memcpy(ptr, field->name, size); | } |
| handlers.add_column(ptr, size); | |
| } | |
| handlers.before_rows(); | |
| while(MYSQL_ROW mysql_row=mysql_fetch_row(res)) { | |
| handlers.add_row(); | |
| unsigned long *lengths=mysql_fetch_lengths(res); | |
| for(int i=0; i<column_count; i++){ | |
| size_t size=(size_t)lengths[i]; | |
| void *ptr; | |
| if(size) { | |
| ptr=services.malloc(size); | |
| memcpy(ptr, mysql_row[i], size); | |
| } else | |
| ptr=0; | |
| handlers.add_row_cell(ptr, size); | |
| } | |
| } | |
| } catch(const SQL_Exception& e) { // some SQL_Exception in handlers.* | for(int i=0; i<column_count; i++){ |
| mysql_free_result(res); | MYSQL_FIELD *field=mysql_fetch_field(res); |
| services._throw(e); | size_t size=strlen(field->name); |
| } catch(...) { // some parser Exception in handlers.* | void *ptr=services.malloc(size); |
| mysql_free_result(res); | memcpy(ptr, field->name, size); |
| services._throw("exception occured in SQL_Driver_query_event_handlers"); // out of memory... | CHECK(handlers.add_column(sql_error, ptr, size)); |
| } | } |
| CHECK(handlers.before_rows(sql_error)); | |
| while(MYSQL_ROW mysql_row=mysql_fetch_row(res)) { | |
| CHECK(handlers.add_row(sql_error)); | |
| unsigned long *lengths=mysql_fetch_lengths(res); | |
| for(int i=0; i<column_count; i++){ | |
| size_t size=(size_t)lengths[i]; | |
| void *ptr; | |
| if(size) { | |
| ptr=services.malloc(size); | |
| memcpy(ptr, mysql_row[i], size); | |
| } else | |
| ptr=0; | |
| CHECK(handlers.add_row_cell(sql_error, ptr, size)); | |
| } | |
| } | |
| cleanup: | |
| mysql_free_result(res); | mysql_free_result(res); |
| if(failed) | |
| services._throw(sql_error); | |
| } | } |
| private: // mysql client library funcs | private: // mysql client library funcs |