modules/sq/mysql_driver.c

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. SQ_get_connection
  2. SQ_execute_query
  3. SQ_get_column_count
  4. SQ_get_table_size
  5. SQ_get_affected_rows
  6. SQ_get_column_label
  7. SQ_get_column_max_length
  8. SQ_row_next
  9. SQ_get_column_string
  10. SQ_get_column_string_nocopy
  11. SQ_get_column_strings
  12. SQ_get_column_int
  13. SQ_result_to_string
  14. SQ_free_result
  15. SQ_close_connection
  16. SQ_num_rows
  17. SQ_info_to_string
  18. SQ_error
  19. SQ_errno
  20. SQ_get_info
  21. SQ_duplicate_connection
  22. SQ_abort_query

   1 /***************************************
   2   $Revision: 1.31 $
   3 
   4   SQL module (sq) - this is a MySQL implementation of the SQL module.
   5 
   6   Status: NOT REVUED, TESTED
   7 
   8   ******************/ /******************
   9   Filename            : mysql_driver.c
  10   Authors             : ottrey@ripe.net
  11                         marek@ripe.net
  12   OSs Tested          : Solaris 7 / sun4u / sparc
  13   ******************/ /******************
  14   Copyright (c) 1999                              RIPE NCC
  15  
  16   All Rights Reserved
  17   
  18   Permission to use, copy, modify, and distribute this software and its
  19   documentation for any purpose and without fee is hereby granted,
  20   provided that the above copyright notice appear in all copies and that
  21   both that copyright notice and this permission notice appear in
  22   supporting documentation, and that the name of the author not be
  23   used in advertising or publicity pertaining to distribution of the
  24   software without specific, written prior permission.
  25   
  26   THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  27   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
  28   AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
  29   DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
  30   AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  31   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  32   ***************************************/
  33 #include <stdlib.h>
  34 #include <stdio.h>
  35 #include <sys/timeb.h>
  36 #include <strings.h>
  37 
  38 #include "mysql_driver.h"
  39 #include "constants.h"
  40 #include "memwrap.h"
  41 #include "timediff.h"
  42 
  43 /*+ String sizes +*/
  44 #define STR_S   63
  45 #define STR_M   255
  46 #define STR_L   1023
  47 #define STR_XL  4095
  48 #define STR_XXL 16383
  49 
  50 /* SQ_get_connection() */
  51 /*++++++++++++++++++++++++++++++++++++++
  52   Get a connection to the database.
  53 
  54   const char *host
  55   
  56   unsigned int port
  57 
  58   const char *db
  59   
  60   const char *user
  61   
  62   const char *password
  63    
  64   More:
  65   +html+ <PRE>
  66   Authors:
  67         ottrey
  68   +html+ </PRE><DL COMPACT>
  69   +html+ <DT>Online References:
  70   +html+ <DD><UL>
  71   +html+     <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_init">mysql_init()</A>
  72   +html+     <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_real_connect">mysql_real_connect()</A>
  73   +html+ </UL></DL>
  74 
  75   ++++++++++++++++++++++++++++++++++++++*/
  76 SQ_connection_t *SQ_get_connection(const char *host, unsigned int port, const char *db, const char *user, const char *password) {
     /* [<][>][^][v][top][bottom][index][help] */
  77 
  78   SQ_connection_t *sql_connection;
  79   int try=2;
  80   SQ_connection_t *res;
  81 
  82   sql_connection = mysql_init(NULL);
  83   if (!sql_connection) {
  84     /* Check for errors */
  85           fprintf(stderr, "Connection init error\n");
  86           die;
  87   }
  88 
  89   /* XXX MB.
  90      This is really kludgy! 
  91      For some (unknown yet) reason, sometimes the connection does not
  92      work the first time. So we try up to 3 times here, and give up only
  93      then.
  94 
  95      Check the logfiles for warnings, especially with newer mysql version,
  96      like 3.23. The problem may or may not go away.
  97   */
  98 
  99   do {
 100     res = mysql_real_connect(sql_connection, host, user, password, db, port, NULL, 0);
 101     /* Check for errors */
 102     if( res == NULL ) {
 103       /* issue a warning */
 104       ER_perror(FAC_SQ, SQ_CNCT, " %s; %s", db, mysql_error(sql_connection));
 105     }
 106   } while( res == NULL && try-- > 0);
 107 
 108   /* give up if still no connection */
 109   dieif( res == NULL );
 110 
 111   return sql_connection;
 112 } /* SQ_get_connection() */
 113 
 114 /* SQ_execute_query() */
 115 /*++++++++++++++++++++++++++++++++++++++
 116   Execute the sql query.
 117 
 118   SQ_connection_t *sql_connection Connection to database.
 119   
 120   const char *query SQL query.
 121 
 122   SQ_result_set_t *result ptr to the structure to hold result. 
 123   May be NULL if no result is needed.
 124 
 125   Returns: 
 126     0 if the query was successful.
 127     Non-zero if an error occured.
 128   
 129   More:
 130   +html+ <PRE>
 131   Authors:
 132         ottrey, andrei, marek
 133   +html+ </PRE><DL COMPACT>
 134   +html+ <DT>Online References:
 135   +html+ <DD><UL>
 136   +html+     <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_query">mysql_query()</A>
 137   +html+     <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_use_result">mysql_use_result()</A>
 138   +html+ </UL></DL>
 139 
 140   ++++++++++++++++++++++++++++++++++++++*/
 141 int SQ_execute_query(SQ_connection_t *sql_connection, 
     /* [<][>][^][v][top][bottom][index][help] */
 142                      const char *query, SQ_result_set_t **result_ptr) 
 143 {
 144   int err;
 145   SQ_result_set_t *result;
 146 
 147   ut_timer_t start_time, stop_time; 
 148   
 149   UT_timeget(&start_time);
 150   
 151   err = mysql_query(sql_connection, query);
 152 
 153   /* log the time and result of the query */
 154   if (err == 0) {
 155     result = mysql_store_result(sql_connection);
 156     
 157     if (ER_is_traced(FAC_SQ, ASP_SQ_QRYTIME)) {
 158       float seconds;
 159 
 160       UT_timeget(&stop_time);      
 161       seconds = UT_timediff( &start_time, &stop_time );
 162   
 163       ER_dbg_va(FAC_SQ, ASP_SQ_QRYTIME,
 164                 "spent %.2f sec; got %d rows from [%s: %s]", 
 165                 seconds, 
 166                 SQ_get_affected_rows(sql_connection),
 167                 sql_connection->db, 
 168                 query);
 169     }
 170     
 171     if(result_ptr) *result_ptr=result;
 172     else if(result) mysql_free_result(result);
 173     return(0);
 174   }
 175   else return(-1);  
 176   
 177 } /* SQ_execute_query() */
 178 
 179 /* SQ_get_column_count() */
 180 /*++++++++++++++++++++++++++++++++++++++
 181   Get the column count.
 182 
 183   SQ_result_set_t *result The results from the query.
 184   
 185   More:
 186   +html+ <PRE>
 187   Authors:
 188         ottrey
 189   +html+ </PRE><DL COMPACT>
 190   +html+ <DT>Online References:
 191   +html+ <DD><UL>
 192   +html+     <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_num_fields">mysql_num_fields()</A>
 193   +html+ </UL></DL>
 194 
 195   ++++++++++++++++++++++++++++++++++++++*/
 196 int SQ_get_column_count(SQ_result_set_t *result) {
     /* [<][>][^][v][top][bottom][index][help] */
 197   int cols;
 198 
 199   cols = mysql_num_fields(result);
 200 
 201   return cols;
 202 
 203 } /* SQ_get_column_count() */
 204 
 205 /* SQ_get_table_size() */
 206 /*++++++++++++++++++++++++++++++++++++++
 207   Get the row count of a table
 208 
 209   char *table   The table to be examined
 210   
 211   More:
 212   +html+ <PRE>
 213   Authors:
 214         marek
 215   +html+ </PRE>
 216 
 217   ++++++++++++++++++++++++++++++++++++++*/
 218 int SQ_get_table_size(SQ_connection_t *sql_connection,
     /* [<][>][^][v][top][bottom][index][help] */
 219                      char *table) {  
 220   int count;
 221   char sql_command[128];
 222   SQ_result_set_t *result;
 223   SQ_row_t *row;
 224   char *countstr;
 225   
 226   sprintf(sql_command, "SELECT COUNT(*) FROM %s", table);
 227   dieif(SQ_execute_query(sql_connection, sql_command, &result) == -1 );
 228   row = SQ_row_next(result);
 229   
 230   countstr = SQ_get_column_string(result, row, 0);
 231   sscanf(countstr, "%d", &count);       
 232   wr_free(countstr);
 233   
 234   SQ_free_result(result);
 235         
 236   return count;  
 237 } /* SQ_get_table_size() */
 238 
 239 /* SQ_get_affected_rows() */
 240 /*++++++++++++++++++++++++++++++++++++++
 241   Get the row count of a table
 242 
 243   char *table   The table to be examined
 244   
 245   More:
 246   +html+ <PRE>
 247   Authors:
 248         marek
 249   +html+ </PRE>
 250 
 251   ++++++++++++++++++++++++++++++++++++++*/
 252 int SQ_get_affected_rows(SQ_connection_t *sql_connection)
     /* [<][>][^][v][top][bottom][index][help] */
 253 {
 254   return mysql_affected_rows(sql_connection);
 255 }/* SQ_get_affected_rows() */
 256                       
 257 
 258 /* SQ_get_column_label() */
 259 /*++++++++++++++++++++++++++++++++++++++
 260   Get the column label.
 261 
 262   SQ_result_set_t *result The results from the query.
 263   
 264   unsigned int column The column index.
 265 
 266   More:
 267   +html+ <PRE>
 268   Authors:
 269         ottrey
 270   +html+ </PRE><DL COMPACT>
 271   +html+ <DT>Online References:
 272   +html+ <DD><UL>
 273   +html+     <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_fetch_field_direct">mysql_fetch_field_direct()</A>
 274   +html+ </UL></DL>
 275 
 276   ++++++++++++++++++++++++++++++++++++++*/
 277 char *SQ_get_column_label(SQ_result_set_t *result, unsigned int column) {
     /* [<][>][^][v][top][bottom][index][help] */
 278   char *str;
 279 /* MySQL decided to change their interface.  Doh! */
 280 #ifdef OLDMYSQL
 281   MYSQL_FIELD field;
 282 
 283   field = mysql_fetch_field_direct(result, column);
 284 
 285   /*str = (char *)calloc(1, strlen(field.name)+1);*/
 286   dieif( wr_malloc((void **)&str, strlen(field.name)+1) != UT_OK);  
 287   strcpy(str, field.name);
 288 #else
 289   MYSQL_FIELD *field;
 290 
 291   field = mysql_fetch_field_direct(result, column);
 292 
 293   /*str = (char *)calloc(1, strlen(field->name)+1);*/
 294   dieif( wr_malloc((void **)&str, strlen(field->name)+1) != UT_OK); 
 295   strcpy(str, field->name);
 296 #endif
 297 
 298 /*
 299   printf("column=%d\n", column);
 300   printf("field.name=%s\n", field.name);
 301   printf("field.table=%s\n", field.table);
 302 
 303   printf("field.def=%s\n", field.def);
 304 
 305   printf("field.type=%d\n", field.type);
 306   printf("field.length=%d\n", field.length);
 307   printf("field.max_length=%d\n", field.max_length);
 308   printf("field.flags=%d\n", field.flags);
 309   printf("field.decimals=%d\n", field.decimals);
 310 */
 311 
 312   return str;
 313 
 314 } /* SQ_get_column_label() */
 315 
 316 /* SQ_get_column_max_length() */
 317 /*++++++++++++++++++++++++++++++++++++++
 318   Get the max length of the column.
 319 
 320   SQ_result_set_t *result The results from the query.
 321   
 322   unsigned int column The column index.
 323 
 324   More:
 325   +html+ <PRE>
 326   Authors:
 327         ottrey
 328   +html+ </PRE><DL COMPACT>
 329   +html+ <DT>Online References:
 330   +html+ <DD><UL>
 331   +html+     <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_fetch_field_direct">mysql_fetch_field_direct()</A>
 332   +html+ </UL></DL>
 333 
 334   ++++++++++++++++++++++++++++++++++++++*/
 335 unsigned int SQ_get_column_max_length(SQ_result_set_t *result, unsigned int column) {
     /* [<][>][^][v][top][bottom][index][help] */
 336 /* MySQL decided to change their interface.  Doh! */
 337 #ifdef OLDMYSQL
 338   MYSQL_FIELD field;
 339 
 340   field = mysql_fetch_field_direct(result, column);
 341 
 342   return field.length;
 343 #else
 344   MYSQL_FIELD *field;
 345 
 346   field = mysql_fetch_field_direct(result, column);
 347 
 348   return field->length;
 349 #endif
 350 
 351 } /* SQ_get_column_max_length() */
 352 
 353 /* SQ_row_next() */
 354 /*++++++++++++++++++++++++++++++++++++++
 355   Get the next row.
 356 
 357   SQ_result_set_t *result The results from the query.
 358   
 359   unsigned int column The column index.
 360 
 361   More:
 362   +html+ <PRE>
 363   Authors:
 364         ottrey
 365   +html+ </PRE><DL COMPACT>
 366   +html+ <DT>Online References:
 367   +html+ <DD><UL>
 368   +html+     <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_fetch_row">mysql_fetch_row()</A>
 369   +html+ </UL></DL>
 370 
 371   ++++++++++++++++++++++++++++++++++++++*/
 372 SQ_row_t *SQ_row_next(SQ_result_set_t *result) {
     /* [<][>][^][v][top][bottom][index][help] */
 373 
 374   return (SQ_row_t *)mysql_fetch_row(result);
 375 
 376 } /* SQ_row_next() */
 377 
 378 /* SQ_get_column_string() */
 379 /*++++++++++++++++++++++++++++++++++++++
 380   Get the column string.
 381 
 382   SQ_row_t *current_row The current row (obtained from a SQ_row_next() ).
 383   
 384   unsigned int column The column index.
 385 
 386   More:
 387   +html+ <PRE>
 388   Authors:
 389         ottrey
 390   +html+ </PRE><DL COMPACT>
 391   +html+ <DT>Online References:
 392   +html+ <DD><UL>
 393   +html+ </UL></DL>
 394 
 395   ++++++++++++++++++++++++++++++++++++++*/
 396 char *SQ_get_column_string(SQ_result_set_t *result, SQ_row_t *current_row, unsigned int column) {
     /* [<][>][^][v][top][bottom][index][help] */
 397   char *str=NULL;
 398   int length = mysql_fetch_lengths(result)[column];
 399   
 400   if (current_row != NULL && current_row[column] != NULL) {
 401     /*str = (char *)malloc(length + 1);*/
 402     dieif( wr_malloc((void **)&str, length + 1) != UT_OK);  
 403     if (str != NULL) {
 404       memcpy(str, current_row[column], length );
 405       str[length] = '\0';
 406     }
 407   }
 408 
 409   return str;
 410   
 411 } /* SQ_get_column_string() */
 412 
 413 /* SQ_get_column_string_nocopy - return pointer to the column string
 414    without making a copy of it */
 415 char *SQ_get_column_string_nocopy(SQ_result_set_t *result, 
     /* [<][>][^][v][top][bottom][index][help] */
 416                                   SQ_row_t *current_row, 
 417                                   unsigned int column) 
 418 {
 419   if (current_row != NULL && current_row[column] != NULL) {
 420     return (char *)current_row[column];
 421   }
 422   return NULL;
 423 }/* SQ_get_column_string_nocopy */
 424 
 425 
 426 
 427 /* SQ_get_column_strings() */
 428 /*++++++++++++++++++++++++++++++++++++++
 429   Get the all the strings in one column.
 430 
 431   SQ_result_set_t *result The results.
 432   
 433   unsigned int column The column index.
 434 
 435   More:
 436   +html+ <PRE>
 437   Authors:
 438         ottrey
 439   +html+ </PRE><DL COMPACT>
 440   +html+ <DT>Online References:
 441   +html+ <DD><UL>
 442   +html+ </UL></DL>
 443 
 444   ++++++++++++++++++++++++++++++++++++++*/
 445 char *SQ_get_column_strings(SQ_result_set_t *result, unsigned int column) {
     /* [<][>][^][v][top][bottom][index][help] */
 446   MYSQL_ROW row;
 447   char str_buffer[STR_XXL];
 448   char str_buffer_tmp[STR_L];
 449   char *str;
 450 
 451   strcpy(str_buffer, "");
 452 
 453   while ((row = mysql_fetch_row(result)) != NULL) {
 454     if (row[column] != NULL) {
 455       sprintf(str_buffer_tmp, "%s\n", row[column]);
 456     }
 457     strcat(str_buffer, str_buffer_tmp);
 458 
 459     if (strlen(str_buffer) >= (STR_XXL - STR_XL) ) {
 460       strcat(str_buffer, "And some more stuff...\n");
 461       break;
 462     }
 463   }
 464 
 465   if (strcmp(str_buffer, "") != 0) {
 466     /*str = (char *)calloc(1, strlen(str_buffer)+1);*/
 467     dieif( wr_malloc((void **)&str, strlen(str_buffer)+1) != UT_OK);  
 468     strcpy(str, str_buffer);
 469   }
 470   else {
 471     str = NULL;
 472   }
 473 
 474   return str;
 475 
 476 } /* SQ_get_column_strings() */
 477 
 478 /* SQ_get_column_int() */
 479 /*++++++++++++++++++++++++++++++++++++++
 480   Get an integer from the column.
 481 
 482   SQ_result_set_t *result The results.
 483   
 484   SQ_row_t *current_row The current row.
 485 
 486   unsigned int column The column index.
 487 
 488   long *resultptr     pointer where the result should be stored
 489 
 490   returns -1 if error occurs, 0 otherwise.
 491   Note - it never says what error occured....
 492 
 493   More:
 494   +html+ <PRE>
 495   Authors:
 496         ottrey
 497   +html+ </PRE><DL COMPACT>
 498   +html+ <DT>Online References:
 499   +html+ <DD><UL>
 500   +html+ </UL></DL>
 501 
 502   ++++++++++++++++++++++++++++++++++++++*/
 503 int SQ_get_column_int(SQ_result_set_t *result, SQ_row_t *current_row, unsigned int column, long  *resultptr) {
     /* [<][>][^][v][top][bottom][index][help] */
 504   int ret_val=-1;
 505 
 506   if (*current_row[column] != NULL) {
 507       if( sscanf( *current_row[column], "%ld", resultptr) > 0 ) {
 508         ret_val = 0;
 509       }
 510   }
 511   return ret_val;
 512   
 513 } /* SQ_get_column_int() */
 514 
 515 
 516 /* SQ_result_to_string() */
 517 /*++++++++++++++++++++++++++++++++++++++
 518   Convert the result set to a string.
 519 
 520   SQ_result_set_t *result The results.
 521   
 522   More:
 523   +html+ <PRE>
 524   Authors:
 525         ottrey
 526   +html+ </PRE><DL COMPACT>
 527   +html+ <DT>Online References:
 528   +html+ <DD><UL>
 529   +html+ </UL></DL>
 530 
 531   ++++++++++++++++++++++++++++++++++++++*/
 532 char *SQ_result_to_string(SQ_result_set_t *result) {
     /* [<][>][^][v][top][bottom][index][help] */
 533   MYSQL_ROW row;
 534   unsigned int no_cols;
 535   unsigned int i, j;
 536   char str_buffer[STR_XXL];
 537   char str_buffer_tmp[STR_L];
 538   char border[STR_L];
 539   char *str;
 540 
 541   char *label;
 542 
 543   unsigned int length[STR_S];
 544 
 545   strcpy(str_buffer, "");
 546 
 547   no_cols = mysql_num_fields(result);
 548 
 549   /* Determine the maximum column widths */
 550   /* XXX Surely MySQL should keep note of this for me! */
 551   strcpy(border, "");
 552   for (i=0; i < no_cols; i++) {
 553     length[i] = SQ_get_column_max_length(result, i);
 554     /* Make sure the lenghts don't get too long */
 555     if (length[i] > STR_M) {
 556       length[i] = STR_M;
 557     }
 558     strcat(border, "*");
 559     for (j=0; (j <= length[i]) && (j < STR_L); j++) {
 560       strcat(border, "-");
 561     }
 562   }
 563   strcat(border, "*\n");
 564   /*
 565   for (i=0; i < no_cols; i++) {
 566     printf("length[%d]=%d\n", i, length[i]);
 567   }
 568   */
 569 
 570   strcat(str_buffer, border);
 571 
 572   for (i=0; i < no_cols; i++) {
 573     label = SQ_get_column_label(result, i);
 574     if (label != NULL) {
 575       sprintf(str_buffer_tmp, "| %-*s", length[i], label);
 576       strcat(str_buffer, str_buffer_tmp);
 577     }
 578   }
 579   strcat(str_buffer, "|\n");
 580   
 581   strcat(str_buffer, border);
 582 
 583 
 584   while ((row = mysql_fetch_row(result)) != NULL) {
 585     for (i=0; i < no_cols; i++) {
 586       if (row[i] != NULL) {
 587         sprintf(str_buffer_tmp, "| %-*s", length[i], row[i]);
 588       }
 589       else {
 590         sprintf(str_buffer_tmp, "| %-*s", length[i], "NuLL");
 591       }
 592       strcat(str_buffer, str_buffer_tmp);
 593     }
 594     strcat(str_buffer, "|\n");
 595 
 596     if (strlen(str_buffer) >= (STR_XXL - STR_XL) ) {
 597       strcat(str_buffer, "And some more stuff...\n");
 598       break;
 599     }
 600   }
 601 
 602   strcat(str_buffer, border);
 603   
 604   /* str = (char *)calloc(1, strlen(str_buffer)+1);*/
 605   dieif( wr_malloc((void **)&str, strlen(str_buffer)+1) != UT_OK);  
 606   strcpy(str, str_buffer);
 607 
 608   return str;
 609 
 610 } /* SQ_result_to_string() */
 611 
 612 /* SQ_free_result() */
 613 /*++++++++++++++++++++++++++++++++++++++
 614   Free the result set.
 615 
 616   SQ_result_set_t *result The results.
 617   
 618   More:
 619   +html+ <PRE>
 620   Authors:
 621         ottrey
 622   +html+ </PRE><DL COMPACT>
 623   +html+ <DT>Online References:
 624   +html+ <DD><UL>
 625   +html+     <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_free_result">mysql_free_result()</A>
 626   +html+ </UL></DL>
 627 
 628   ++++++++++++++++++++++++++++++++++++++*/
 629 void SQ_free_result(SQ_result_set_t *result) {
     /* [<][>][^][v][top][bottom][index][help] */
 630   mysql_free_result(result);
 631 } /* SQ_free_result() */
 632 
 633 
 634 /* SQ_close_connection() */
 635 /*++++++++++++++++++++++++++++++++++++++
 636   Call this function to close a connection to the server
 637 
 638   SQ_connection_t *sql_connection The connection to the database.
 639   
 640   More:
 641   +html+ <PRE>
 642   Authors:
 643         ottrey
 644   +html+ </PRE><DL COMPACT>
 645   +html+ <DT>Online References:
 646   +html+ <DD><UL>
 647   +html+     <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_close">mysql_close()</A>
 648   +html+ </UL></DL>
 649 
 650   ++++++++++++++++++++++++++++++++++++++*/
 651 void SQ_close_connection(SQ_connection_t *sql_connection) {
     /* [<][>][^][v][top][bottom][index][help] */
 652 
 653   mysql_close(sql_connection);
 654 
 655 }
 656 
 657 /* SQ_num_rows() */
 658 /*++++++++++++++++++++++++++++++++++++++
 659   Call this function to find out how many rows are in a query result
 660 
 661   SQ_result_set_t *result The results.
 662   
 663   More:
 664   +html+ <PRE>
 665   Authors:
 666         ottrey
 667   +html+ </PRE><DL COMPACT>
 668   +html+ <DT>Online References:
 669   +html+ <DD><UL>
 670   +html+     <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_num_rows">mysql_num_rows()</A>
 671   +html+ </UL></DL>
 672 
 673   ++++++++++++++++++++++++++++++++++++++*/
 674 int SQ_num_rows(SQ_result_set_t *result) {
     /* [<][>][^][v][top][bottom][index][help] */
 675   int rows=-1;
 676 
 677   if (result != NULL) {
 678     rows = mysql_num_rows(result);
 679   }
 680 
 681   return rows;
 682 }
 683 
 684 /* SQ_info_to_string() */
 685 /*++++++++++++++++++++++++++++++++++++++
 686   Convert all available information about the sql server into a string.
 687 
 688   SQ_connection_t *sql_connection The connection to the database.
 689 
 690   More:
 691   +html+ <PRE>
 692   Authors:
 693         ottrey
 694   +html+ </PRE><DL COMPACT>
 695   +html+ <DT>Online References:
 696   +html+ <DD><UL>
 697   +html+ </UL></DL>
 698 
 699   ++++++++++++++++++++++++++++++++++++++*/
 700 char *SQ_info_to_string(SQ_connection_t *sql_connection) {
     /* [<][>][^][v][top][bottom][index][help] */
 701   char str_buffer[STR_XXL];
 702   char str_buffer_tmp[STR_L];
 703   char *str;
 704   char *str_tmp;
 705 
 706   strcpy(str_buffer, "");
 707 
 708   /* Makes the server dump debug information to the log. */
 709   sprintf(str_buffer_tmp, "mysql_dump_debug_info()=%d\n", mysql_dump_debug_info(sql_connection));
 710   strcat(str_buffer, str_buffer_tmp);
 711 
 712   /* Returns the error number from the last MySQL function. */
 713   sprintf(str_buffer_tmp, "mysql_errno()=%d\n", mysql_errno(sql_connection));
 714   strcat(str_buffer, str_buffer_tmp);
 715 
 716   /* Returns the error message from the last MySQL function. */
 717   sprintf(str_buffer_tmp, "mysql_error()=%s\n", mysql_error(sql_connection));
 718   strcat(str_buffer, str_buffer_tmp);
 719 
 720   /* Returns client version information. */
 721   sprintf(str_buffer_tmp, "mysql_get_client_info()=%s\n", mysql_get_client_info() );
 722   strcat(str_buffer, str_buffer_tmp);
 723 
 724   /* Returns a string describing the connection. */
 725   sprintf(str_buffer_tmp, "mysql_get_host_info()=%s\n", mysql_get_host_info(sql_connection));
 726   strcat(str_buffer, str_buffer_tmp);
 727 
 728   /* Returns the protocol version used by the connection. */
 729   sprintf(str_buffer_tmp, "mysql_get_proto_info()=%d\n", mysql_get_proto_info(sql_connection));
 730   strcat(str_buffer, str_buffer_tmp);
 731 
 732   /* Returns the server version number. */
 733   sprintf(str_buffer_tmp, "mysql_get_server_info()=%s\n", mysql_get_server_info(sql_connection));
 734   strcat(str_buffer, str_buffer_tmp);
 735 
 736   /* Information about the most recently executed query. */
 737   /* XXX Check for NULL */
 738   str_tmp = mysql_info(sql_connection);
 739   if (str_tmp != NULL) {
 740     sprintf(str_buffer_tmp, "mysql_info()=%s\n", str_tmp);
 741   }
 742   else {
 743     sprintf(str_buffer_tmp, "mysql_info()=%s\n", "NulL");
 744   }
 745   strcat(str_buffer, str_buffer_tmp);
 746 
 747 
 748   /* Returns a list of the current server threads. 
 749 
 750      NOT Used here, because it returns a RESULT struct that must be 
 751      iterated through.
 752      
 753      sprintf(str_buffer_tmp, "mysql_list_processes()=%x\n", mysql_list_processes(sql_connection));
 754      strcat(str_buffer, str_buffer_tmp);
 755      
 756   */
 757 
 758   /* Checks if the connection to the server is working. */
 759   sprintf(str_buffer_tmp, "mysql_ping()=%d\n", mysql_ping(sql_connection));
 760   strcat(str_buffer, str_buffer_tmp);
 761 
 762   /* Returns the server status as a string. */
 763   sprintf(str_buffer_tmp, "mysql_stat()=%s\n", mysql_stat(sql_connection));
 764   strcat(str_buffer, str_buffer_tmp);
 765 
 766   /* Returns the current thread id. */
 767   sprintf(str_buffer_tmp, "mysql_thread_id()=%ld\n", mysql_thread_id(sql_connection));
 768   strcat(str_buffer, str_buffer_tmp);
 769 
 770 
 771   /*str = (char *)calloc(1, strlen(str_buffer)+1);*/
 772   dieif( wr_malloc((void **)&str, strlen(str_buffer)+1) != UT_OK);  
 773   strcpy(str, str_buffer);
 774 
 775   return str;
 776 
 777 } /* SQ_info_to_string() */
 778 
 779 /* SQ_error() */
 780 /*++++++++++++++++++++++++++++++++++++++
 781   Get the error string for the last error.
 782 
 783   SQ_connection_t *sql_connection The connection to the database.
 784 
 785   More:
 786   +html+ <PRE>
 787   Authors:
 788         ottrey
 789   +html+ </PRE><DL COMPACT>
 790   +html+ <DT>Online References:
 791   +html+ <DD><UL>
 792   +html+     <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_error">mysql_error()</A>
 793   +html+ </UL></DL>
 794 
 795   ++++++++++++++++++++++++++++++++++++++*/
 796 char *SQ_error(SQ_connection_t *sql_connection) {
     /* [<][>][^][v][top][bottom][index][help] */
 797 
 798   return mysql_error(sql_connection);
 799 
 800 } /* SQ_error() */
 801 
 802 /* SQ_errno() */
 803 /*++++++++++++++++++++++++++++++++++++++
 804   Get the error number for the last error.
 805 
 806   SQ_connection_t *sql_connection The connection to the database.
 807 
 808   More:
 809   +html+ <PRE>
 810   Authors:
 811         ottrey
 812   +html+ </PRE><DL COMPACT>
 813   +html+ <DT>Online References:
 814   +html+ <DD><UL>
 815   +html+     <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_free_result">mysql_free_result()</A>
 816   +html+ </UL></DL>
 817 
 818   ++++++++++++++++++++++++++++++++++++++*/
 819 int SQ_errno(SQ_connection_t *sql_connection) {
     /* [<][>][^][v][top][bottom][index][help] */
 820 
 821   return mysql_errno(sql_connection);
 822 
 823 } /* SQ_errno() */
 824 
 825 /* SQ_get_info() */
 826 /*++++++++++++++++++++++++++++++++++++++
 827   Get additional information about the most 
 828   recently executed query.
 829   
 830   SQ_connection_t *sql_connection The connection to the database.
 831   int info[3] array of integers where information is stored
 832   
 833   The meaning of the numbers returned depends on the query type:
 834   
 835   info[SQL_RECORDS] - # of Records for INSERT
 836   info[SQL_MATCHES] - # of Matches for UPDATE
 837   info[SQL_DUPLICATES] - # of Duplicates
 838   info[SQL_WARNINGS] - # of Warnings
 839   
 840   More:
 841  +html+ <PRE>
 842  Authors:
 843   andrei
 844  +html+ </PRE><DL COMPACT>
 845  +html+ <DT>Online References:
 846  +html+ <DD><UL>
 847  +html+     <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_info">mysql_info()</A>
 848  +html+ </UL></DL>
 849 
 850 ++++++++++++++++++++++++++++++++++++++*/  
 851   
 852 int SQ_get_info(SQ_connection_t *sql_connection, int info[3])
     /* [<][>][^][v][top][bottom][index][help] */
 853 {
 854 int ii;
 855 char *colon, *buf_ptr, buf[20]; 
 856 char *infoline;
 857 
 858   infoline=mysql_info(sql_connection); 
 859   ii=0;
 860   colon = infoline;
 861   while (*colon != '\0') {
 862    colon++;
 863    buf_ptr=buf;
 864    if(isdigit((int)*colon)){
 865     while(isdigit((int)*colon)){
 866      *buf_ptr=*colon; buf_ptr++; colon++;
 867     }
 868     *buf_ptr='\0';
 869     info[ii]=atoi(buf); ii++;
 870    } 
 871   }
 872  return(0);
 873 }
 874 
 875 
 876 /* 
 877    open a connection with the same parameters
 878 
 879    by marek
 880 */
 881 SQ_connection_t *
 882 SQ_duplicate_connection(SQ_connection_t *orig)
     /* [<][>][^][v][top][bottom][index][help] */
 883 {
 884   return SQ_get_connection(orig->host, orig->port, orig->db, 
 885                            orig->user, orig->passwd);
 886 }
 887 
 888 /* 
 889    abort the current query on the given connection
 890 
 891    by marek
 892 */
 893 int
 894 SQ_abort_query(SQ_connection_t *sql_connection)
     /* [<][>][^][v][top][bottom][index][help] */
 895 {
 896   SQ_connection_t *contemp = SQ_duplicate_connection(sql_connection);
 897   int res = mysql_kill(contemp, sql_connection->thread_id);
 898 
 899   ER_dbg_va(FAC_SQ, ASP_SQ_ABORT,
 900             "connection %d aborted by tmp thread %d",
 901             sql_connection->thread_id,
 902             contemp->thread_id);
 903 
 904   SQ_close_connection(contemp);
 905 
 906   return res;
 907 }

/* [<][>][^][v][top][bottom][index][help] */