List:General Discussion« Previous MessageNext Message »
From:Pooly Date:September 20 2005 6:58pm
Subject:Re: mysql_free_result() & 2 different connections
View as plain text  

> in a very small representation the program is this
> *** dbmail and dbmail2 open 2 different connections, one accesses
> DBM_ADDRESSES table and the other accesses DBM_NAMES table. The first one
> retrieves addresses from the table DBM_ADDRESSES, the second one a relationed
> names to the addresses from DBM_NAMES. Not all addresses have name set, so
> for questions of space I separated into tables, just 10% of addresses have a
> name and it would be waste of space having that column in the same table
> (90%+ of over 50,000 rows), so I created a new table for the names and linked
> them to a corresponding address via an 'id'

Are your two tables in the same database ?
If yes only one connection if enough, and you could use a join query
to do it, thus having a speed improvement of several magnitudes.

> 1. connect dbmail and dbmail2 to server
> 2. dbmail.query:   SELECT id,address from DBM_ADDRESSES WHERE ...
>     sp_id = atoll(record[0]); // stores the id in 'sp_id'
> 3. while ( dbmail retrieves rows from query at step 2 ) {
>    dbmail2.query:
>    3.1 SELECT name FROM DBM_NAMES WHERE id=sp_id(from step 2)
>    3.2 if ( name exists for id=sp_id )
>            do something with DBM_ADDRESSES.address,
>         else
>            do something with DBM_ADDRESSES.address
>    3.3 free results from dbmail2.query (inside while)
>    }
> 4. free results from dbmail.query (1st query before while) ***CRASH***
> 5. disconnect dbmail and dbmail2 connections
> The crash is in step #4 after  all data is retrieved successfully, but why?

Have you checked that you free the correct result ? set it to NULL
after used, and add a test for nullity, it may help.
What version of the API are you using ? which OS ?
Have you check ?

> 1. query: SELECT ...
> 2. while ( fetch rows ) { use the results }
> 3. mysql_free_result()
> it crashes too, this model is very (really very simple) and does not leave
> space for errors in code and still fails on the free function...

pseudo-code won't crash as far as I can tell :-)

> I've asked on a linux list and somebody told me just to avoid using
> mysql_free_result() if the program works that way ('cos the results maybe are
> being already free by the library), but I don't think it is a solution, I
> want to know what happens, if really the set is free automatically by the C
> API functions after reading it or not, and if so, why the documentation tells
> that it is a *must* call the free function after the whole set of rows is
> retrieved...

That would leave a nice memory leak indeed...
eventually, recompile and set a break-point before calling mysql_free,
and look at all variables.

Webzine Rock :
mysql_free_result() & 2 different connectionsMiguel Cardenas17 Sep
  • Re: mysql_free_result() & 2 different connectionsPooly18 Sep
    • mysql_free_result() CRASHESMiguel Cardenas18 Sep
    • Re: mysql_free_result() & 2 different connectionsMiguel Cardenas20 Sep
      • Re: mysql_free_result() & 2 different connectionsPooly20 Sep
        • Re: mysql_free_result() & 2 different connectionsMiguel Cardenas20 Sep
          • Re: mysql_free_result() & 2 different connectionsPooly20 Sep
            • Re: mysql_free_result() & 2 different connectionsMiguel Cardenas21 Sep
              • Re: mysql_free_result() & 2 different connectionsPooly21 Sep
                • Re: mysql_free_result() & 2 different connectionsMiguel Cardenas22 Sep