## 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] */