Van wrote:
>
> In Main, I have:
> MYSQL *conn; /* Pointer to connection handle */
>
> Then, I do:
> if ((conn = do_connect (BTIME_HOST, USER, BTIME_PW, BTIME_DB, 0, NULL, 0)) !=
> NULL)
> {
> /* Validate the structure of the btime database */
> check_btime_structure(conn, BTIME_DB);
> mysql_close (conn);
> }
>
> In, check_btime_structure:
> MYSQL_RES *res_set;
> MYSQL_ROW row;
> char sql[255+1] = "SHOW TABLES FROM ";
> int i =0;
>
> strncat(sql, BTIME_DB, sizeof(sql));
> if ((res_set = do_query(conn, sql)) != NULL)
> {
> while ((row = mysql_fetch_row(res_set)) != NULL)
> {
> for (i = 0; i < mysql_num_fields (res_set); i++)
> {
> check_btime_table (conn, row[i]);
> }
> }
> }
>
> return EXIT_SUCCESS;
> }
>
> In check_btime_table:
> int
> check_btime_table(MYSQL *conn, char *BTIME_TABLE)
> /* Validate individual btime table */
> {
> MYSQL_RES *res_set;
> char sql[255+1] = "DESCRIBE ";
>
> strncat(sql, BTIME_TABLE, sizeof(sql));
>
> /* Cycle through the table description rows and make sure they're in synch */
>
> if ((res_set = do_query (conn, sql)) != NULL)
> {
> fprintf(stderr, "sql: %s%s%s\n", boldon, sql, boldoff);
> }
> return EXIT_SUCCESS;
> }
>
Greetings, again:
No need to reply to this, since I figured out the problem. It was actually in
the do_query implementation:
Previously the do_query function was:
MYSQL_RES *do_query(MYSQL *conn, char *sql)
{
MYSQL_RES res_set;
if (mysql_query (conn, sql) != 0)
{
// do stuff...
}
}
After putting in the:
fprintf(stderr, "do_connect Pointer address is %p\n", res_set);
in the fixed version I realized I was getting the same memory address for the
res_set pointer on each invocation. This was making the above res_set{s} step
on each other. It was returning the same address for each call, which confused
the query processing functions.
To ensure each invocation of the do_query function gets a new address, use the
following:
MYSQL_RES *do_query(MYSQL *conn, char *sql, MYSQL_RES *res_set)
/* Run a query. Return the result set. */
{
unsigned int errno = 0;
char *errmsg = NULL;
if (mysql_query (conn, sql) != 0) /* btime database doesn't
exist */
{
errno = mysql_errno(conn);
errmsg = mysql_error(conn);
fprintf(stderr, "There is a problem with the BTime database...\n\n");
fprintf(stderr, "The actual error was:\n");
fprintf(stderr, "mysql_query error: #%u.\n%s\n\n", errno, errmsg);
fprintf(stderr, "The query was: %s\n", sql);
exit(EXIT_FAILURE);
} else {
res_set = mysql_store_result (conn); /* generate result set
*/
if (res_set == NULL)
{
errno = mysql_errno(conn);
errmsg = mysql_error(conn);
fprintf(stderr, "mysql_store_result() failed...\n\n");
fprintf(stderr, "The actual error was:\n");
fprintf(stderr, "mysql_real_connect error: #%u.\n%s\n\n",
errno, errmsg);
fprintf(stderr, "The query was: %s\n", sql);
exit(EXIT_FAILURE);
}
}
// fprintf(stderr, "do_connect Pointer address is %p\n", res_set);
// mysql_free_result(res_set);
return res_set;
}
Thus, the same connection can be used and note the mysql_store_result (conn)
implementation, rather than mysql_use_result(), which can require more coding
for small result sets.
So throw a MYSQL_RES *res_set in the function declaration that will call the
do_query function, but, not in the do_query function, and pass that pointer to
do_query, which will return the newly allocated pointer in the return.
Ensure you do the mysql_free_result(res_set) in the function that calls the
do_query(), not within do_query(). That's why it's commented out in
NON-C-COMMENTING-NOTATION. I comment with // on debug functions so don't flame
me.
Thought this might save someone else out there 12 hours worth of strange memory
addressing chasing.
Regards,
Van
--
=========================================================================
Linux rocks!!! http://www.dedserius.com
=========================================================================
---------------------------------------------------------------------
Before posting, please check:
http://www.mysql.com/manual.php (the manual)
http://lists.mysql.com/ (the list archive)
To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php