示例#1
0
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
示例#2
0
/* 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;
}
示例#3
0
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