1 | /***************************************
2 | $Revision: 1.18 $
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 <sys/timeb.h>
35 | #include <strings.h>
36 |
37 | #include "mysql_driver.h"
38 | #include "constants.h"
39 | #include "memwrap.h"
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 | /*
173 | if (CO_get_query_logging() == 1) {
174 | //start_time=(struct timeb *)calloc(1, sizeof(struct timeb)+1);
175 | //stop_time=(struct timeb *)calloc(1, sizeof(struct timeb)+1);
176 |
177 | ftime(start_time);
178 | err = mysql_query(sql_connection, query);
179 | ftime(stop_time);
180 |
181 | log_query(CO_get_query_logfile(), query, start_time, stop_time);
182 |
183 | //free(start_time);
184 | //free(stop_time);
185 | }
186 | else
187 | */
188 | {
189 | err = mysql_query(sql_connection, query);
190 | }
191 |
192 | if (err == 0) {
193 | result = mysql_store_result(sql_connection);
194 | if(store_or_not == SQ_NOSTORE) {
195 | mysql_free_result(result);
196 | result = NULL;
197 | }
198 | }
199 | else {
200 | result = NULL;
201 | }
202 |
203 | return result;
204 |
205 | } /* SQ_execute_query() */
206 |
207 | /* SQ_get_column_count() */
208 | /*++++++++++++++++++++++++++++++++++++++
209 | Get the column count.
210 |
211 | SQ_result_set_t *result The results from the query.
212 |
213 | More:
214 | +html+ <PRE>
215 | Authors:
216 | ottrey
217 | +html+ </PRE><DL COMPACT>
218 | +html+ <DT>Online References:
219 | +html+ <DD><UL>
220 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_num_fields">mysql_num_fields()</A>
221 | +html+ </UL></DL>
222 |
223 | ++++++++++++++++++++++++++++++++++++++*/
224 | int SQ_get_column_count(SQ_result_set_t *result) {
225 | int cols;
226 |
227 | cols = mysql_num_fields(result);
228 |
229 | return cols;
230 |
231 | } /* SQ_get_column_count() */
232 |
233 | /* SQ_get_column_label() */
234 | /*++++++++++++++++++++++++++++++++++++++
235 | Get the column label.
236 |
237 | SQ_result_set_t *result The results from the query.
238 |
239 | unsigned int column The column index.
240 |
241 | More:
242 | +html+ <PRE>
243 | Authors:
244 | ottrey
245 | +html+ </PRE><DL COMPACT>
246 | +html+ <DT>Online References:
247 | +html+ <DD><UL>
248 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_fetch_field_direct">mysql_fetch_field_direct()</A>
249 | +html+ </UL></DL>
250 |
251 | ++++++++++++++++++++++++++++++++++++++*/
252 | char *SQ_get_column_label(SQ_result_set_t *result, unsigned int column) {
253 | char *str;
254 | /* MySQL decided to change their interface. Doh! */
255 | #ifdef OLDMYSQL
256 | MYSQL_FIELD field;
257 |
258 | field = mysql_fetch_field_direct(result, column);
259 |
260 | //str = (char *)calloc(1, strlen(field.name)+1);
261 | dieif( wr_malloc((void **)&str, strlen(field.name)+1) != UT_OK);
262 | strcpy(str, field.name);
263 | #else
264 | MYSQL_FIELD *field;
265 |
266 | field = mysql_fetch_field_direct(result, column);
267 |
268 | //str = (char *)calloc(1, strlen(field->name)+1);
269 | dieif( wr_malloc((void **)&str, strlen(field->name)+1) != UT_OK);
270 | strcpy(str, field->name);
271 | #endif
272 |
273 | /*
274 | printf("column=%d\n", column);
275 | printf("field.name=%s\n", field.name);
276 | printf("field.table=%s\n", field.table);
277 |
278 | printf("field.def=%s\n", field.def);
279 |
280 | printf("field.type=%d\n", field.type);
281 | printf("field.length=%d\n", field.length);
282 | printf("field.max_length=%d\n", field.max_length);
283 | printf("field.flags=%d\n", field.flags);
284 | printf("field.decimals=%d\n", field.decimals);
285 | */
286 |
287 | return str;
288 |
289 | } /* SQ_get_column_label() */
290 |
291 | /* SQ_get_column_max_length() */
292 | /*++++++++++++++++++++++++++++++++++++++
293 | Get the max length of the column.
294 |
295 | SQ_result_set_t *result The results from the query.
296 |
297 | unsigned int column The column index.
298 |
299 | More:
300 | +html+ <PRE>
301 | Authors:
302 | ottrey
303 | +html+ </PRE><DL COMPACT>
304 | +html+ <DT>Online References:
305 | +html+ <DD><UL>
306 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_fetch_field_direct">mysql_fetch_field_direct()</A>
307 | +html+ </UL></DL>
308 |
309 | ++++++++++++++++++++++++++++++++++++++*/
310 | unsigned int SQ_get_column_max_length(SQ_result_set_t *result, unsigned int column) {
311 | /* MySQL decided to change their interface. Doh! */
312 | #ifdef OLDMYSQL
313 | MYSQL_FIELD field;
314 |
315 | field = mysql_fetch_field_direct(result, column);
316 |
317 | return field.length;
318 | #else
319 | MYSQL_FIELD *field;
320 |
321 | field = mysql_fetch_field_direct(result, column);
322 |
323 | return field->length;
324 | #endif
325 |
326 | } /* SQ_get_column_max_length() */
327 |
328 | /* SQ_row_next() */
329 | /*++++++++++++++++++++++++++++++++++++++
330 | Get the next row.
331 |
332 | SQ_result_set_t *result The results from the query.
333 |
334 | unsigned int column The column index.
335 |
336 | More:
337 | +html+ <PRE>
338 | Authors:
339 | ottrey
340 | +html+ </PRE><DL COMPACT>
341 | +html+ <DT>Online References:
342 | +html+ <DD><UL>
343 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_fetch_row">mysql_fetch_row()</A>
344 | +html+ </UL></DL>
345 |
346 | ++++++++++++++++++++++++++++++++++++++*/
347 | SQ_row_t *SQ_row_next(SQ_result_set_t *result) {
348 |
349 | return (SQ_row_t *)mysql_fetch_row(result);
350 |
351 | } /* SQ_row_next() */
352 |
353 | /* SQ_get_column_string() */
354 | /*++++++++++++++++++++++++++++++++++++++
355 | Get the column string.
356 |
357 | SQ_row_t *current_row The current row (obtained from a SQ_row_next() ).
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+ </UL></DL>
369 |
370 | ++++++++++++++++++++++++++++++++++++++*/
371 | char *SQ_get_column_string(SQ_result_set_t *result, SQ_row_t *current_row, unsigned int column) {
372 | char *str=NULL;
373 | int length = mysql_fetch_lengths(result)[column];
374 |
375 |
376 | if (current_row != NULL && current_row[column] != NULL) {
377 | //str = (char *)malloc(length + 1);
378 | dieif( wr_malloc((void **)&str, length + 1) != UT_OK);
379 | if (str != NULL) {
380 | memcpy(str, current_row[column], length );
381 | str[length] = '\0';
382 | }
383 | }
384 |
385 | return str;
386 |
387 | } /* SQ_get_column_string() */
388 |
389 | /* SQ_get_column_strings() */
390 | /*++++++++++++++++++++++++++++++++++++++
391 | Get the all the strings in one column.
392 |
393 | SQ_result_set_t *result The results.
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_strings(SQ_result_set_t *result, unsigned int column) {
408 | MYSQL_ROW row;
409 | char str_buffer[STR_XXL];
410 | char str_buffer_tmp[STR_L];
411 | char *str;
412 |
413 | strcpy(str_buffer, "");
414 |
415 | while ((row = mysql_fetch_row(result)) != NULL) {
416 | if (row[column] != NULL) {
417 | sprintf(str_buffer_tmp, "%s\n", row[column]);
418 | }
419 | strcat(str_buffer, str_buffer_tmp);
420 |
421 | if (strlen(str_buffer) >= (STR_XXL - STR_XL) ) {
422 | strcat(str_buffer, "And some more stuff...\n");
423 | break;
424 | }
425 | }
426 |
427 | if (strcmp(str_buffer, "") != 0) {
428 | //str = (char *)calloc(1, strlen(str_buffer)+1);
429 | dieif( wr_malloc((void **)&str, strlen(str_buffer)+1) != UT_OK);
430 | strcpy(str, str_buffer);
431 | }
432 | else {
433 | str = NULL;
434 | }
435 |
436 | return str;
437 |
438 | } /* SQ_get_column_strings() */
439 |
440 | /* SQ_get_column_int() */
441 | /*++++++++++++++++++++++++++++++++++++++
442 | Get an integer from the column.
443 |
444 | SQ_result_set_t *result The results.
445 |
446 | SQ_row_t *current_row The current row.
447 |
448 | unsigned int column The column index.
449 |
450 | This uses atoi. So it may be advisable not to use it.
451 |
452 | More:
453 | +html+ <PRE>
454 | Authors:
455 | ottrey
456 | +html+ </PRE><DL COMPACT>
457 | +html+ <DT>Online References:
458 | +html+ <DD><UL>
459 | +html+ </UL></DL>
460 |
461 | ++++++++++++++++++++++++++++++++++++++*/
462 | int SQ_get_column_int(SQ_result_set_t *result, SQ_row_t *current_row, unsigned int column) {
463 | int ret_val=-1;
464 |
465 | if (*current_row[column] != NULL) {
466 | ret_val = atoi(*current_row[column]);
467 | }
468 | else {
469 | ;
470 | }
471 |
472 | return ret_val;
473 |
474 | } /* SQ_get_column_int() */
475 |
476 |
477 | /* SQ_result_to_string() */
478 | /*++++++++++++++++++++++++++++++++++++++
479 | Convert the result set to a string.
480 |
481 | SQ_result_set_t *result The results.
482 |
483 | More:
484 | +html+ <PRE>
485 | Authors:
486 | ottrey
487 | +html+ </PRE><DL COMPACT>
488 | +html+ <DT>Online References:
489 | +html+ <DD><UL>
490 | +html+ </UL></DL>
491 |
492 | ++++++++++++++++++++++++++++++++++++++*/
493 | char *SQ_result_to_string(SQ_result_set_t *result) {
494 | MYSQL_ROW row;
495 | unsigned int no_cols;
496 | unsigned int i, j;
497 | char str_buffer[STR_XXL];
498 | char str_buffer_tmp[STR_L];
499 | char border[STR_L];
500 | char *str;
501 |
502 | char *label;
503 |
504 | unsigned int length[STR_S];
505 |
506 | strcpy(str_buffer, "");
507 |
508 | no_cols = mysql_num_fields(result);
509 |
510 | /* Determine the maximum column widths */
511 | /* XXX Surely MySQL should keep note of this for me! */
512 | strcpy(border, "");
513 | for (i=0; i < no_cols; i++) {
514 | length[i] = SQ_get_column_max_length(result, i);
515 | /* Make sure the lenghts don't get too long */
516 | if (length[i] > STR_M) {
517 | length[i] = STR_M;
518 | }
519 | strcat(border, "*");
520 | for (j=0; (j <= length[i]) && (j < STR_L); j++) {
521 | strcat(border, "-");
522 | }
523 | }
524 | strcat(border, "*\n");
525 | /*
526 | for (i=0; i < no_cols; i++) {
527 | printf("length[%d]=%d\n", i, length[i]);
528 | }
529 | */
530 |
531 | strcat(str_buffer, border);
532 |
533 | for (i=0; i < no_cols; i++) {
534 | label = SQ_get_column_label(result, i);
535 | if (label != NULL) {
536 | sprintf(str_buffer_tmp, "| %-*s", length[i], label);
537 | strcat(str_buffer, str_buffer_tmp);
538 | }
539 | }
540 | strcat(str_buffer, "|\n");
541 |
542 | strcat(str_buffer, border);
543 |
544 |
545 | while ((row = mysql_fetch_row(result)) != NULL) {
546 | for (i=0; i < no_cols; i++) {
547 | if (row[i] != NULL) {
548 | sprintf(str_buffer_tmp, "| %-*s", length[i], row[i]);
549 | }
550 | else {
551 | sprintf(str_buffer_tmp, "| %-*s", length[i], "NuLL");
552 | }
553 | strcat(str_buffer, str_buffer_tmp);
554 | }
555 | strcat(str_buffer, "|\n");
556 |
557 | if (strlen(str_buffer) >= (STR_XXL - STR_XL) ) {
558 | strcat(str_buffer, "And some more stuff...\n");
559 | break;
560 | }
561 | }
562 |
563 | strcat(str_buffer, border);
564 |
565 | // str = (char *)calloc(1, strlen(str_buffer)+1);
566 | dieif( wr_malloc((void **)&str, strlen(str_buffer)+1) != UT_OK);
567 | strcpy(str, str_buffer);
568 |
569 | return str;
570 |
571 | } /* SQ_result_to_string() */
572 |
573 | /* SQ_free_result() */
574 | /*++++++++++++++++++++++++++++++++++++++
575 | Free the result set.
576 |
577 | SQ_result_set_t *result The results.
578 |
579 | More:
580 | +html+ <PRE>
581 | Authors:
582 | ottrey
583 | +html+ </PRE><DL COMPACT>
584 | +html+ <DT>Online References:
585 | +html+ <DD><UL>
586 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_free_result">mysql_free_result()</A>
587 | +html+ </UL></DL>
588 |
589 | ++++++++++++++++++++++++++++++++++++++*/
590 | void SQ_free_result(SQ_result_set_t *result) {
591 | mysql_free_result(result);
592 | } /* SQ_free_result() */
593 |
594 |
595 | /* SQ_close_connection() */
596 | /*++++++++++++++++++++++++++++++++++++++
597 | Call this function to close a connection to the server
598 |
599 | SQ_connection_t *sql_connection The connection to the database.
600 |
601 | More:
602 | +html+ <PRE>
603 | Authors:
604 | ottrey
605 | +html+ </PRE><DL COMPACT>
606 | +html+ <DT>Online References:
607 | +html+ <DD><UL>
608 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_close">mysql_close()</A>
609 | +html+ </UL></DL>
610 |
611 | ++++++++++++++++++++++++++++++++++++++*/
612 | void SQ_close_connection(SQ_connection_t *sql_connection) {
613 |
614 | mysql_close(sql_connection);
615 |
616 | }
617 |
618 | /* SQ_num_rows() */
619 | /*++++++++++++++++++++++++++++++++++++++
620 | Call this function to find out how many rows are in a query result
621 |
622 | SQ_result_set_t *result The results.
623 |
624 | More:
625 | +html+ <PRE>
626 | Authors:
627 | ottrey
628 | +html+ </PRE><DL COMPACT>
629 | +html+ <DT>Online References:
630 | +html+ <DD><UL>
631 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_num_rows">mysql_num_rows()</A>
632 | +html+ </UL></DL>
633 |
634 | ++++++++++++++++++++++++++++++++++++++*/
635 | int SQ_num_rows(SQ_result_set_t *result) {
636 | int rows=-1;
637 |
638 | if (result != NULL) {
639 | rows = mysql_num_rows(result);
640 | }
641 |
642 | return rows;
643 | }
644 |
645 | /* SQ_info_to_string() */
646 | /*++++++++++++++++++++++++++++++++++++++
647 | Convert all available information about the sql server into a string.
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+ </UL></DL>
659 |
660 | ++++++++++++++++++++++++++++++++++++++*/
661 | char *SQ_info_to_string(SQ_connection_t *sql_connection) {
662 | char str_buffer[STR_XXL];
663 | char str_buffer_tmp[STR_L];
664 | char *str;
665 | char *str_tmp;
666 |
667 | strcpy(str_buffer, "");
668 |
669 | /* Makes the server dump debug information to the log. */
670 | sprintf(str_buffer_tmp, "mysql_dump_debug_info()=%d\n", mysql_dump_debug_info(sql_connection));
671 | strcat(str_buffer, str_buffer_tmp);
672 |
673 | /* Returns the error number from the last MySQL function. */
674 | sprintf(str_buffer_tmp, "mysql_errno()=%d\n", mysql_errno(sql_connection));
675 | strcat(str_buffer, str_buffer_tmp);
676 |
677 | /* Returns the error message from the last MySQL function. */
678 | sprintf(str_buffer_tmp, "mysql_error()=%s\n", mysql_error(sql_connection));
679 | strcat(str_buffer, str_buffer_tmp);
680 |
681 | /* Returns client version information. */
682 | sprintf(str_buffer_tmp, "mysql_get_client_info()=%s\n", mysql_get_client_info() );
683 | strcat(str_buffer, str_buffer_tmp);
684 |
685 | /* Returns a string describing the connection. */
686 | sprintf(str_buffer_tmp, "mysql_get_host_info()=%s\n", mysql_get_host_info(sql_connection));
687 | strcat(str_buffer, str_buffer_tmp);
688 |
689 | /* Returns the protocol version used by the connection. */
690 | sprintf(str_buffer_tmp, "mysql_get_proto_info()=%d\n", mysql_get_proto_info(sql_connection));
691 | strcat(str_buffer, str_buffer_tmp);
692 |
693 | /* Returns the server version number. */
694 | sprintf(str_buffer_tmp, "mysql_get_server_info()=%s\n", mysql_get_server_info(sql_connection));
695 | strcat(str_buffer, str_buffer_tmp);
696 |
697 | /* Information about the most recently executed query. */
698 | /* XXX Check for NULL */
699 | str_tmp = mysql_info(sql_connection);
700 | if (str_tmp != NULL) {
701 | sprintf(str_buffer_tmp, "mysql_info()=%s\n", str_tmp);
702 | }
703 | else {
704 | sprintf(str_buffer_tmp, "mysql_info()=%s\n", "NulL");
705 | }
706 | strcat(str_buffer, str_buffer_tmp);
707 |
708 |
709 | /* Returns a list of the current server threads. */
710 | sprintf(str_buffer_tmp, "mysql_list_processes()=%d\n", mysql_list_processes(sql_connection));
711 | strcat(str_buffer, str_buffer_tmp);
712 |
713 | /* Checks if the connection to the server is working. */
714 | sprintf(str_buffer_tmp, "mysql_ping()=%d\n", mysql_ping(sql_connection));
715 | strcat(str_buffer, str_buffer_tmp);
716 |
717 | /* Returns the server status as a string. */
718 | sprintf(str_buffer_tmp, "mysql_stat()=%s\n", mysql_stat(sql_connection));
719 | strcat(str_buffer, str_buffer_tmp);
720 |
721 | /* Returns the current thread id. */
722 | sprintf(str_buffer_tmp, "mysql_thread_id()=%d\n", mysql_thread_id(sql_connection));
723 | strcat(str_buffer, str_buffer_tmp);
724 |
725 |
726 | //str = (char *)calloc(1, strlen(str_buffer)+1);
727 | dieif( wr_malloc((void **)&str, strlen(str_buffer)+1) != UT_OK);
728 | strcpy(str, str_buffer);
729 |
730 | return str;
731 |
732 | } /* SQ_info_to_string() */
733 |
734 | /* SQ_error() */
735 | /*++++++++++++++++++++++++++++++++++++++
736 | Get the error string for the last error.
737 |
738 | SQ_connection_t *sql_connection The connection to the database.
739 |
740 | More:
741 | +html+ <PRE>
742 | Authors:
743 | ottrey
744 | +html+ </PRE><DL COMPACT>
745 | +html+ <DT>Online References:
746 | +html+ <DD><UL>
747 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_error">mysql_error()</A>
748 | +html+ </UL></DL>
749 |
750 | ++++++++++++++++++++++++++++++++++++++*/
751 | char *SQ_error(SQ_connection_t *sql_connection) {
752 |
753 | return mysql_error(sql_connection);
754 |
755 | } /* SQ_error() */
756 |
757 | /* SQ_errno() */
758 | /*++++++++++++++++++++++++++++++++++++++
759 | Get the error number for the last error.
760 |
761 | SQ_connection_t *sql_connection The connection to the database.
762 |
763 | More:
764 | +html+ <PRE>
765 | Authors:
766 | ottrey
767 | +html+ </PRE><DL COMPACT>
768 | +html+ <DT>Online References:
769 | +html+ <DD><UL>
770 | +html+ <LI><A HREF="http://www.tcx.se/Manual/manual.html#mysql_free_result">mysql_free_result()</A>
771 | +html+ </UL></DL>
772 |
773 | ++++++++++++++++++++++++++++++++++++++*/
774 | int SQ_errno(SQ_connection_t *sql_connection) {
775 |
776 | return mysql_errno(sql_connection);
777 |
778 | } /* SQ_errno() */
779 |