static void process_results(TDSSOCKET *tds) { int rc; while((rc=tds_process_result_tokens(tds))==TDS_SUCCEED) { /* do nothing special, just process the tokens */ } /* printf("type: %i, line: %i, message: %i, state: %i, level: %i, server: %s, proc: %s, sql-state: %s\nmessage: %s\n", tds->msg_info->priv_msg_type, tds->msg_info->line_number, tds->msg_info->msg_number, tds->msg_info->msg_state, tds->msg_info->msg_level, tds->msg_info->server, tds->msg_info->proc_name, tds->msg_info->sql_state, tds->msg_info->message); */ if(tds->msg_info->msg_level > 0) { rb_raise(rb_eRuntimeError, "server said: %s", tds->msg_info->message); } } // process_results
/* Run query for which there should be no return results */ int run_query(TDSSOCKET * tds, const char *query) { int rc; int result_type; rc = tds_submit_query(tds, query); if (rc != TDS_SUCCEED) { fprintf(stderr, "tds_submit_query() failed for query '%s'\n", query); return TDS_FAIL; } while ((rc = tds_process_result_tokens(tds, &result_type, NULL)) == TDS_SUCCEED) { switch (result_type) { case TDS_DONE_RESULT: case TDS_DONEPROC_RESULT: case TDS_DONEINPROC_RESULT: /* ignore possible spurious result (TDS7+ send it) */ case TDS_STATUS_RESULT: break; default: fprintf(stderr, "Error: query should not return results\n"); return TDS_FAIL; } } if (rc == TDS_FAIL) { fprintf(stderr, "tds_process_result_tokens() returned TDS_FAIL for '%s'\n", query); return TDS_FAIL; } else if (rc != TDS_NO_MORE_RESULTS) { fprintf(stderr, "tds_process_result_tokens() unexpected return\n"); return TDS_FAIL; } return TDS_SUCCEED; }
static VALUE rh_init(VALUE self) { SYBRESULT *sybres; int i, rc; VALUE aRow, allRows; char *mystring; int mystrlen; Data_Get_Struct(self, SYBRESULT, sybres); if(tds_submit_query(sybres->tds,sybres->sqlstring) != TDS_SUCCEED) { rb_raise(rb_eRuntimeError, "SQL-query failed (1)"); } else { /* Based on FreeTDS's src/tds/unittest/t0005.c */ allRows = rb_ary_new(); while ((rc=tds_process_result_tokens(sybres->tds))==TDS_SUCCEED) { while ((rc=tds_process_row_tokens(sybres->tds))==TDS_SUCCEED) { aRow = rb_ary_new(); for (i=0; i<sybres->tds->res_info->num_cols; i++) { /* We're calling calloc for every column in every row to get the memory for the string-conversion. There are probably faster ways... */ if(sybres->tds->res_info->columns[i]->column_textvalue) { mystrlen=(sybres->tds->res_info->columns[i]->column_textsize)+1; } else { mystrlen = 256; } mystring = calloc(1, mystrlen); if(mystring == NULL) { rb_raise(rb_eRuntimeError, "Couldn't malloc - out of memory? (1)"); } value_as_string(mystring, mystrlen, sybres->tds, i); rb_ary_push(aRow, rb_str_new2(mystring)); free(mystring); } rb_ary_push(allRows, aRow); } if (rc == TDS_FAIL) { rb_raise(rb_eRuntimeError, "tds_process_row_tokens() returned TDS_FAIL\n"); } else if (rc != TDS_NO_MORE_ROWS) { rb_raise(rb_eRuntimeError, "tds_process_row_tokens() unexpected return\n"); } } if (rc == TDS_FAIL) { rb_raise(rb_eRuntimeError, "tds_process_result_tokens() returned TDS_FAIL for SELECT\n"); return 1; } else if (rc != TDS_NO_MORE_RESULTS) { rb_raise(rb_eRuntimeError, "tds_process_result_tokens() unexpected return\n"); } } rb_iv_set(self, "@allRows", allRows); return self; } // rh_init