1 | /*************************************** 2 | $Revision: 1.15 $ 3 | 4 | SQL module (sq) - this is a MySQL implementation of the SQL module. 5 | 6 | Status: NOT REVUED, NOT TESTED 7 | 8 | ******************/ /****************** 9 | Filename : mysql_driver.c 10 | Author : ottrey@ripe.net 11 | OSs Tested : Solaris 12 | ******************/ /****************** 13 | Copyright (c) 1999 RIPE NCC 14 | 15 | All Rights Reserved 16 | 17 | Permission to use, copy, modify, and distribute this software and its 18 | documentation for any purpose and without fee is hereby granted, 19 | provided that the above copyright notice appear in all copies and that 20 | both that copyright notice and this permission notice appear in 21 | supporting documentation, and that the name of the author not be 22 | used in advertising or publicity pertaining to distribution of the 23 | software without specific, written prior permission. 24 | 25 | THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 26 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL 27 | AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY 28 | DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 29 | AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 30 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 31 | ***************************************/ 32 | #include <stdlib.h> 33 | #include <stdio.h> 34 | #include "mysql_driver.h" 35 | #include "constants.h" 36 | #include <sys/timeb.h> 37 | 38 | /* XXX NB. The changes to SQ_row_next() and the removal of the Global variable Current_row */ 39 | 40 | 41 | /*+ String sizes +*/ 42 | #define STR_S 63 43 | #define STR_M 255 44 | #define STR_L 1023 45 | #define STR_XL 4095 46 | #define STR_XXL 16383 47 | 48 | 49 | /* log_query() */ 50 | /*++++++++++++++++++++++++++++++++++++++ 51 | Log the query. This should/will get merged with a tracing module. 52 | 53 | More: 54 | +html+ <PRE> 55 | Authors: 56 | ottrey 57 | +html+ </PRE><DL COMPACT> 58 | +html+ <DT>Online References: 59 | +html+ <DD><UL> 60 | +html+ </UL></DL> 61 | 62 | ++++++++++++++++++++++++++++++++++++++*/ 63 | static void log_query(const char *logfile, const char *query, struct timeb *start, struct timeb *stop) { 64 | FILE *logf; 65 | int seconds; 66 | int milliseconds; 67 | 68 | seconds = (int)(stop->time - start->time); 69 | milliseconds = (int)(stop->millitm - start->millitm); 70 | if (milliseconds < 0) { 71 | milliseconds += 1000; 72 | seconds--; 73 | } 74 | 75 | if (strcmp(logfile, "stdout") == 0) { 76 | printf("query=[%s] took %d sec %d msec\n", query, seconds, milliseconds); 77 | } 78 | else { 79 | logf = fopen(logfile, "a"); 80 | fprintf(logf, "query=[%s] took %d sec %d msec\n", query, seconds, milliseconds); 81 | fclose(logf); 82 | } 83 | 84 | } /* log_query() */ 85 | 86 | /* SQ_get_connection() */ 87 | /*++++++++++++++++++++++++++++++++++++++ 88 | Get a connection to the database. 89 | 90 | const char *host 91 | 92 | unsigned int port 93 | 94 | const char *db 95 | 96 | const char *user 97 | 98 | const char *password 99 | 100 | More: 101 | +html+ <PRE> 102 | Authors: 103 | ottrey 104 | +html+ </PRE><DL COMPACT> 105 | +html+ <DT>Online References: 106 | +html+ <DD><UL> 107 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_init">mysql_init()</A> 108 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_real_connect">mysql_real_connect()</A> 109 | +html+ </UL></DL> 110 | 111 | ++++++++++++++++++++++++++++++++++++++*/ 112 | SQ_connection_t *SQ_get_connection(const char *host, unsigned int port, const char *db, const char *user, const char *password) { 113 | 114 | SQ_connection_t *sql_connection; 115 | 116 | sql_connection = mysql_init(NULL); 117 | if (!sql_connection) { 118 | /* Check for errors */ 119 | printf("Connection init error\n"); 120 | } 121 | 122 | sql_connection = mysql_real_connect(sql_connection, host, user, password, db, port, NULL, 0); 123 | if (!sql_connection) { 124 | /* Check for errors */ 125 | printf("Connection error: Failed to connect to database.... %s\n", db); 126 | /* XXX Don't be so harsh! 127 | exit(-1); 128 | */ 129 | } 130 | 131 | return sql_connection; 132 | 133 | } /* SQ_get_connection() */ 134 | 135 | SQ_connection_t *SQ_get_connection2(void) { 136 | return SQ_get_connection(CO_get_host(), 137 | CO_get_database_port(), 138 | CO_get_database(), 139 | CO_get_user(), 140 | CO_get_password() 141 | ); 142 | } /* SQ_get_connection() */ 143 | 144 | /* SQ_execute_query() */ 145 | /*++++++++++++++++++++++++++++++++++++++ 146 | Execute the sql query. 147 | 148 | SQ_connection_t *sql_connection Connection to database. 149 | 150 | const char *query SQL query. 151 | 152 | More: 153 | +html+ <PRE> 154 | Authors: 155 | ottrey 156 | +html+ </PRE><DL COMPACT> 157 | +html+ <DT>Online References: 158 | +html+ <DD><UL> 159 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_query">mysql_query()</A> 160 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_use_result">mysql_use_result()</A> 161 | +html+ </UL></DL> 162 | 163 | ++++++++++++++++++++++++++++++++++++++*/ 164 | SQ_result_set_t *SQ_execute_query(int store_or_not, 165 | SQ_connection_t *sql_connection, 166 | const char *query) { 167 | struct timeb *start_time; 168 | struct timeb *stop_time; 169 | int err; 170 | SQ_result_set_t *result; 171 | 172 | if (CO_get_query_logging() == 1) { 173 | start_time=(struct timeb *)calloc(1, sizeof(struct timeb)+1); 174 | stop_time=(struct timeb *)calloc(1, sizeof(struct timeb)+1); 175 | 176 | ftime(start_time); 177 | err = mysql_query(sql_connection, query); 178 | ftime(stop_time); 179 | 180 | log_query(CO_get_query_logfile(), query, start_time, stop_time); 181 | 182 | free(start_time); 183 | free(stop_time); 184 | } 185 | else { 186 | err = mysql_query(sql_connection, query); 187 | } 188 | 189 | if (err == 0) { 190 | result = mysql_store_result(sql_connection); 191 | if(store_or_not == SQ_NOSTORE) { 192 | mysql_free_result(result); 193 | result = NULL; 194 | } 195 | } 196 | else { 197 | result = NULL; 198 | } 199 | 200 | return result; 201 | 202 | } /* SQ_execute_query() */ 203 | 204 | /* SQ_get_column_count() */ 205 | /*++++++++++++++++++++++++++++++++++++++ 206 | Get the column count. 207 | 208 | SQ_result_set_t *result The results from the query. 209 | 210 | More: 211 | +html+ <PRE> 212 | Authors: 213 | ottrey 214 | +html+ </PRE><DL COMPACT> 215 | +html+ <DT>Online References: 216 | +html+ <DD><UL> 217 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_num_fields">mysql_num_fields()</A> 218 | +html+ </UL></DL> 219 | 220 | ++++++++++++++++++++++++++++++++++++++*/ 221 | int SQ_get_column_count(SQ_result_set_t *result) { 222 | int cols; 223 | 224 | cols = mysql_num_fields(result); 225 | 226 | return cols; 227 | 228 | } /* SQ_get_column_count() */ 229 | 230 | /* SQ_get_column_label() */ 231 | /*++++++++++++++++++++++++++++++++++++++ 232 | Get the column label. 233 | 234 | SQ_result_set_t *result The results from the query. 235 | 236 | unsigned int column The column index. 237 | 238 | More: 239 | +html+ <PRE> 240 | Authors: 241 | ottrey 242 | +html+ </PRE><DL COMPACT> 243 | +html+ <DT>Online References: 244 | +html+ <DD><UL> 245 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_fetch_field_direct">mysql_fetch_field_direct()</A> 246 | +html+ </UL></DL> 247 | 248 | ++++++++++++++++++++++++++++++++++++++*/ 249 | char *SQ_get_column_label(SQ_result_set_t *result, unsigned int column) { 250 | char *str; 251 | /* MySQL decided to change their interface. Doh! */ 252 | #ifdef OLDMYSQL 253 | MYSQL_FIELD field; 254 | 255 | field = mysql_fetch_field_direct(result, column); 256 | 257 | str = (char *)calloc(1, strlen(field.name)+1); 258 | strcpy(str, field.name); 259 | #else 260 | MYSQL_FIELD *field; 261 | 262 | field = mysql_fetch_field_direct(result, column); 263 | 264 | str = (char *)calloc(1, strlen(field->name)+1); 265 | strcpy(str, field->name); 266 | #endif 267 | 268 | /* 269 | printf("column=%d\n", column); 270 | printf("field.name=%s\n", field.name); 271 | printf("field.table=%s\n", field.table); 272 | 273 | printf("field.def=%s\n", field.def); 274 | 275 | printf("field.type=%d\n", field.type); 276 | printf("field.length=%d\n", field.length); 277 | printf("field.max_length=%d\n", field.max_length); 278 | printf("field.flags=%d\n", field.flags); 279 | printf("field.decimals=%d\n", field.decimals); 280 | */ 281 | 282 | return str; 283 | 284 | } /* SQ_get_column_label() */ 285 | 286 | /* SQ_get_column_max_length() */ 287 | /*++++++++++++++++++++++++++++++++++++++ 288 | Get the max length of the column. 289 | 290 | SQ_result_set_t *result The results from the query. 291 | 292 | unsigned int column The column index. 293 | 294 | More: 295 | +html+ <PRE> 296 | Authors: 297 | ottrey 298 | +html+ </PRE><DL COMPACT> 299 | +html+ <DT>Online References: 300 | +html+ <DD><UL> 301 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_fetch_field_direct">mysql_fetch_field_direct()</A> 302 | +html+ </UL></DL> 303 | 304 | ++++++++++++++++++++++++++++++++++++++*/ 305 | unsigned int SQ_get_column_max_length(SQ_result_set_t *result, unsigned int column) { 306 | /* MySQL decided to change their interface. Doh! */ 307 | #ifdef OLDMYSQL 308 | MYSQL_FIELD field; 309 | 310 | field = mysql_fetch_field_direct(result, column); 311 | 312 | return field.length; 313 | #else 314 | MYSQL_FIELD *field; 315 | 316 | field = mysql_fetch_field_direct(result, column); 317 | 318 | return field->length; 319 | #endif 320 | 321 | } /* SQ_get_column_max_length() */ 322 | 323 | /* SQ_row_next() */ 324 | /*++++++++++++++++++++++++++++++++++++++ 325 | Get the next row. 326 | 327 | SQ_result_set_t *result The results from the query. 328 | 329 | unsigned int column The column index. 330 | 331 | More: 332 | +html+ <PRE> 333 | Authors: 334 | ottrey 335 | +html+ </PRE><DL COMPACT> 336 | +html+ <DT>Online References: 337 | +html+ <DD><UL> 338 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_fetch_row">mysql_fetch_row()</A> 339 | +html+ </UL></DL> 340 | 341 | ++++++++++++++++++++++++++++++++++++++*/ 342 | SQ_row_t *SQ_row_next(SQ_result_set_t *result) { 343 | 344 | return (SQ_row_t *)mysql_fetch_row(result); 345 | 346 | } /* SQ_row_next() */ 347 | 348 | /* SQ_get_column_string() */ 349 | /*++++++++++++++++++++++++++++++++++++++ 350 | Get the column string. 351 | 352 | SQ_row_t *current_row The current row (obtained from a SQ_row_next() ). 353 | 354 | unsigned int column The column index. 355 | 356 | More: 357 | +html+ <PRE> 358 | Authors: 359 | ottrey 360 | +html+ </PRE><DL COMPACT> 361 | +html+ <DT>Online References: 362 | +html+ <DD><UL> 363 | +html+ </UL></DL> 364 | 365 | ++++++++++++++++++++++++++++++++++++++*/ 366 | char *SQ_get_column_string(SQ_result_set_t *result, SQ_row_t *current_row, unsigned int column) { 367 | char *str=NULL; 368 | int length = mysql_fetch_lengths(result)[column]; 369 | 370 | 371 | if (current_row != NULL && current_row[column] != NULL) { 372 | str = (char *)malloc(length + 1); 373 | if (str != NULL) { 374 | memcpy(str, current_row[column], length ); 375 | str[length] = '\0'; 376 | } 377 | } 378 | 379 | return str; 380 | 381 | } /* SQ_get_column_string() */ 382 | 383 | /* SQ_get_column_strings() */ 384 | /*++++++++++++++++++++++++++++++++++++++ 385 | Get the all the strings in one column. 386 | 387 | SQ_result_set_t *result The results. 388 | 389 | unsigned int column The column index. 390 | 391 | More: 392 | +html+ <PRE> 393 | Authors: 394 | ottrey 395 | +html+ </PRE><DL COMPACT> 396 | +html+ <DT>Online References: 397 | +html+ <DD><UL> 398 | +html+ </UL></DL> 399 | 400 | ++++++++++++++++++++++++++++++++++++++*/ 401 | char *SQ_get_column_strings(SQ_result_set_t *result, unsigned int column) { 402 | MYSQL_ROW row; 403 | char str_buffer[STR_XXL]; 404 | char str_buffer_tmp[STR_L]; 405 | char *str; 406 | 407 | int l; 408 | 409 | strcpy(str_buffer, ""); 410 | 411 | while ((row = mysql_fetch_row(result)) != NULL) { 412 | if (row[column] != NULL) { 413 | sprintf(str_buffer_tmp, "%s\n", row[column]); 414 | } 415 | strcat(str_buffer, str_buffer_tmp); 416 | 417 | if (strlen(str_buffer) >= (STR_XXL - STR_XL) ) { 418 | strcat(str_buffer, "And some more stuff...\n"); 419 | break; 420 | } 421 | } 422 | 423 | if (strcmp(str_buffer, "") != 0) { 424 | str = (char *)calloc(1, strlen(str_buffer)+1); 425 | strcpy(str, str_buffer); 426 | } 427 | else { 428 | str = NULL; 429 | } 430 | 431 | return str; 432 | 433 | } /* SQ_get_column_strings() */ 434 | 435 | /* SQ_get_column_int() */ 436 | /*++++++++++++++++++++++++++++++++++++++ 437 | Get an integer from the column. 438 | 439 | SQ_result_set_t *result The results. 440 | 441 | SQ_row_t *current_row The current row. 442 | 443 | unsigned int column The column index. 444 | 445 | This uses atoi. So it may be advisable not to use it. 446 | 447 | More: 448 | +html+ <PRE> 449 | Authors: 450 | ottrey 451 | +html+ </PRE><DL COMPACT> 452 | +html+ <DT>Online References: 453 | +html+ <DD><UL> 454 | +html+ </UL></DL> 455 | 456 | ++++++++++++++++++++++++++++++++++++++*/ 457 | int SQ_get_column_int(SQ_result_set_t *result, SQ_row_t *current_row, unsigned int column) { 458 | int ret_val=-1; 459 | 460 | if (*current_row[column] != NULL) { 461 | ret_val = atoi(*current_row[column]); 462 | } 463 | else { 464 | ; 465 | } 466 | 467 | return ret_val; 468 | 469 | } /* SQ_get_column_int() */ 470 | 471 | 472 | /* SQ_result_to_string() */ 473 | /*++++++++++++++++++++++++++++++++++++++ 474 | Convert the result set to a string. 475 | 476 | SQ_result_set_t *result The results. 477 | 478 | More: 479 | +html+ <PRE> 480 | Authors: 481 | ottrey 482 | +html+ </PRE><DL COMPACT> 483 | +html+ <DT>Online References: 484 | +html+ <DD><UL> 485 | +html+ </UL></DL> 486 | 487 | ++++++++++++++++++++++++++++++++++++++*/ 488 | char *SQ_result_to_string(SQ_result_set_t *result) { 489 | MYSQL_ROW row; 490 | unsigned int no_cols; 491 | unsigned int i, j; 492 | char str_buffer[STR_XXL]; 493 | char str_buffer_tmp[STR_L]; 494 | char border[STR_L]; 495 | char *str; 496 | 497 | char *label; 498 | 499 | unsigned int length[STR_S]; 500 | int l; 501 | 502 | strcpy(str_buffer, ""); 503 | 504 | no_cols = mysql_num_fields(result); 505 | 506 | /* Determine the maximum column widths */ 507 | /* XXX Surely MySQL should keep note of this for me! */ 508 | strcpy(border, ""); 509 | for (i=0; i < no_cols; i++) { 510 | length[i] = SQ_get_column_max_length(result, i); 511 | /* Make sure the lenghts don't get too long */ 512 | if (length[i] > STR_M) { 513 | length[i] = STR_M; 514 | } 515 | strcat(border, "*"); 516 | for (j=0; (j <= length[i]) && (j < STR_L); j++) { 517 | strcat(border, "-"); 518 | } 519 | } 520 | strcat(border, "*\n"); 521 | /* 522 | for (i=0; i < no_cols; i++) { 523 | printf("length[%d]=%d\n", i, length[i]); 524 | } 525 | */ 526 | 527 | strcat(str_buffer, border); 528 | 529 | for (i=0; i < no_cols; i++) { 530 | label = SQ_get_column_label(result, i); 531 | if (label != NULL) { 532 | sprintf(str_buffer_tmp, "| %-*s", length[i], label); 533 | strcat(str_buffer, str_buffer_tmp); 534 | } 535 | } 536 | strcat(str_buffer, "|\n"); 537 | 538 | strcat(str_buffer, border); 539 | 540 | 541 | while ((row = mysql_fetch_row(result)) != NULL) { 542 | for (i=0; i < no_cols; i++) { 543 | if (row[i] != NULL) { 544 | sprintf(str_buffer_tmp, "| %-*s", length[i], row[i]); 545 | } 546 | else { 547 | sprintf(str_buffer_tmp, "| %-*s", length[i], "NuLL"); 548 | } 549 | strcat(str_buffer, str_buffer_tmp); 550 | } 551 | strcat(str_buffer, "|\n"); 552 | 553 | if (strlen(str_buffer) >= (STR_XXL - STR_XL) ) { 554 | strcat(str_buffer, "And some more stuff...\n"); 555 | break; 556 | } 557 | } 558 | 559 | strcat(str_buffer, border); 560 | 561 | str = (char *)calloc(1, strlen(str_buffer)+1); 562 | strcpy(str, str_buffer); 563 | 564 | return str; 565 | 566 | } /* SQ_result_to_string() */ 567 | 568 | /* SQ_free_result() */ 569 | /*++++++++++++++++++++++++++++++++++++++ 570 | Free the result set. 571 | 572 | SQ_result_set_t *result The results. 573 | 574 | More: 575 | +html+ <PRE> 576 | Authors: 577 | ottrey 578 | +html+ </PRE><DL COMPACT> 579 | +html+ <DT>Online References: 580 | +html+ <DD><UL> 581 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_free_result">mysql_free_result()</A> 582 | +html+ </UL></DL> 583 | 584 | ++++++++++++++++++++++++++++++++++++++*/ 585 | void SQ_free_result(SQ_result_set_t *result) { 586 | mysql_free_result(result); 587 | } /* SQ_free_result() */ 588 | 589 | 590 | /* SQ_close_connection() */ 591 | /*++++++++++++++++++++++++++++++++++++++ 592 | Call this function to close a connection to the server 593 | 594 | SQ_connection_t *sql_connection The connection to the database. 595 | 596 | More: 597 | +html+ <PRE> 598 | Authors: 599 | ottrey 600 | +html+ </PRE><DL COMPACT> 601 | +html+ <DT>Online References: 602 | +html+ <DD><UL> 603 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_close">mysql_close()</A> 604 | +html+ </UL></DL> 605 | 606 | ++++++++++++++++++++++++++++++++++++++*/ 607 | void SQ_close_connection(SQ_connection_t *sql_connection) { 608 | 609 | mysql_close(sql_connection); 610 | 611 | } 612 | 613 | /* SQ_num_rows() */ 614 | /*++++++++++++++++++++++++++++++++++++++ 615 | Call this function to find out how many rows are in a query result 616 | 617 | SQ_result_set_t *result The results. 618 | 619 | More: 620 | +html+ <PRE> 621 | Authors: 622 | ottrey 623 | +html+ </PRE><DL COMPACT> 624 | +html+ <DT>Online References: 625 | +html+ <DD><UL> 626 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_num_rows">mysql_num_rows()</A> 627 | +html+ </UL></DL> 628 | 629 | ++++++++++++++++++++++++++++++++++++++*/ 630 | int SQ_num_rows(SQ_result_set_t *result) { 631 | int rows=-1; 632 | 633 | if (result != NULL) { 634 | rows = mysql_num_rows(result); 635 | } 636 | 637 | return rows; 638 | } 639 | 640 | /* SQ_info_to_string() */ 641 | /*++++++++++++++++++++++++++++++++++++++ 642 | Convert all available information about the sql server into a string. 643 | 644 | SQ_connection_t *sql_connection The connection to the database. 645 | 646 | More: 647 | +html+ <PRE> 648 | Authors: 649 | ottrey 650 | +html+ </PRE><DL COMPACT> 651 | +html+ <DT>Online References: 652 | +html+ <DD><UL> 653 | +html+ </UL></DL> 654 | 655 | ++++++++++++++++++++++++++++++++++++++*/ 656 | char *SQ_info_to_string(SQ_connection_t *sql_connection) { 657 | char str_buffer[STR_XXL]; 658 | char str_buffer_tmp[STR_L]; 659 | char *str; 660 | char *str_tmp; 661 | 662 | strcpy(str_buffer, ""); 663 | 664 | /* Makes the server dump debug information to the log. */ 665 | sprintf(str_buffer_tmp, "mysql_dump_debug_info()=%d\n", mysql_dump_debug_info(sql_connection)); 666 | strcat(str_buffer, str_buffer_tmp); 667 | 668 | /* Returns the error number from the last MySQL function. */ 669 | sprintf(str_buffer_tmp, "mysql_errno()=%d\n", mysql_errno(sql_connection)); 670 | strcat(str_buffer, str_buffer_tmp); 671 | 672 | /* Returns the error message from the last MySQL function. */ 673 | sprintf(str_buffer_tmp, "mysql_error()=%s\n", mysql_error(sql_connection)); 674 | strcat(str_buffer, str_buffer_tmp); 675 | 676 | /* Returns client version information. */ 677 | sprintf(str_buffer_tmp, "mysql_get_client_info()=%s\n", mysql_get_client_info() ); 678 | strcat(str_buffer, str_buffer_tmp); 679 | 680 | /* Returns a string describing the connection. */ 681 | sprintf(str_buffer_tmp, "mysql_get_host_info()=%s\n", mysql_get_host_info(sql_connection)); 682 | strcat(str_buffer, str_buffer_tmp); 683 | 684 | /* Returns the protocol version used by the connection. */ 685 | sprintf(str_buffer_tmp, "mysql_get_proto_info()=%d\n", mysql_get_proto_info(sql_connection)); 686 | strcat(str_buffer, str_buffer_tmp); 687 | 688 | /* Returns the server version number. */ 689 | sprintf(str_buffer_tmp, "mysql_get_server_info()=%s\n", mysql_get_server_info(sql_connection)); 690 | strcat(str_buffer, str_buffer_tmp); 691 | 692 | /* Information about the most recently executed query. */ 693 | /* XXX Check for NULL */ 694 | str_tmp = mysql_info(sql_connection); 695 | if (str_tmp != NULL) { 696 | sprintf(str_buffer_tmp, "mysql_info()=%s\n", str_tmp); 697 | } 698 | else { 699 | sprintf(str_buffer_tmp, "mysql_info()=%s\n", "NulL"); 700 | } 701 | strcat(str_buffer, str_buffer_tmp); 702 | 703 | 704 | /* Returns a list of the current server threads. */ 705 | sprintf(str_buffer_tmp, "mysql_list_processes()=%d\n", mysql_list_processes(sql_connection)); 706 | strcat(str_buffer, str_buffer_tmp); 707 | 708 | /* Checks if the connection to the server is working. */ 709 | sprintf(str_buffer_tmp, "mysql_ping()=%d\n", mysql_ping(sql_connection)); 710 | strcat(str_buffer, str_buffer_tmp); 711 | 712 | /* Returns the server status as a string. */ 713 | sprintf(str_buffer_tmp, "mysql_stat()=%s\n", mysql_stat(sql_connection)); 714 | strcat(str_buffer, str_buffer_tmp); 715 | 716 | /* Returns the current thread id. */ 717 | sprintf(str_buffer_tmp, "mysql_thread_id()=%d\n", mysql_thread_id(sql_connection)); 718 | strcat(str_buffer, str_buffer_tmp); 719 | 720 | 721 | str = (char *)calloc(1, strlen(str_buffer)+1); 722 | strcpy(str, str_buffer); 723 | 724 | return str; 725 | 726 | } /* SQ_info_to_string() */ 727 | 728 | /* SQ_error() */ 729 | /*++++++++++++++++++++++++++++++++++++++ 730 | Get the error string for the last error. 731 | 732 | SQ_connection_t *sql_connection The connection to the database. 733 | 734 | More: 735 | +html+ <PRE> 736 | Authors: 737 | ottrey 738 | +html+ </PRE><DL COMPACT> 739 | +html+ <DT>Online References: 740 | +html+ <DD><UL> 741 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_error">mysql_error()</A> 742 | +html+ </UL></DL> 743 | 744 | ++++++++++++++++++++++++++++++++++++++*/ 745 | char *SQ_error(SQ_connection_t *sql_connection) { 746 | 747 | return mysql_error(sql_connection); 748 | 749 | } /* SQ_error() */ 750 | 751 | /* SQ_errno() */ 752 | /*++++++++++++++++++++++++++++++++++++++ 753 | Get the error number for the last error. 754 | 755 | SQ_connection_t *sql_connection The connection to the database. 756 | 757 | More: 758 | +html+ <PRE> 759 | Authors: 760 | ottrey 761 | +html+ </PRE><DL COMPACT> 762 | +html+ <DT>Online References: 763 | +html+ <DD><UL> 764 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_free_result">mysql_free_result()</A> 765 | +html+ </UL></DL> 766 | 767 | ++++++++++++++++++++++++++++++++++++++*/ 768 | int SQ_errno(SQ_connection_t *sql_connection) { 769 | 770 | return mysql_errno(sql_connection); 771 | 772 | } /* SQ_errno() */ 773 |