modules/sq/mysql_driver.c

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

FUNCTIONS

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

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

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