Henning Westerholt wrote:
On Friday 20 July 2007, Victor Gamov wrote:
[..] For db_mysql_fetch result() when nrows==0 function do nothing
and return 0. But in this situation if user makes SELECT-like query and then call db_mysql_fetch_rows() with nrows=0 no mysql_store_result() called and it wrong because "you _must_ call mysql_store_result() or mysql_use_result() for every statement that successfully retrieves data" (http://dev.mysql.com/doc/refman/5.1/en/mysql-store-result.html)

And it's really strange don't get any data and call db_mysql_fetch_rows() with nrows=0 after SELECT-like query

Also there are no problems or "any notable performance degradation
 if you call mysql_store_result()  in all cases".

So we can use nrows to realize different behavior for db_mysql_fetch_rows():

-- nrows == 0 -- get complete result set. If called after non SELECT-like query it will call mysql_store_result() and mysql_field_count() and return 0

-- nrows > 0 -- get result set and return nrows lines only

-- if we want to fetch zero rows then we can use nrows < 0 (now looks like wrong parameter value), call mysql_store_result() and mysql_free_result() and return 0.

Hello Victor,

Hi Henning!

i changed the mysql db API to use the same behaviour as the postgresql driver. In my opinion this is the "correct" behaviour of the fetch_result function from the API point of view and matches the
 user expectations:

- nrows == 0 - don't return anything because the API user want zero rows - nrows == n (for n <= number of rows in query) - return n rows - nrows == n (for n > number of rows in query) - return number of rows in query - nrows < 0 - return a error because the API is used wrong

The raised issues about the memory leaks should now be fixed in mysql
 and postgresql. It makes now sense to call fetch_result after a "non
select" query. In order to fetch rows you need some rows to work with. :-)

A behaviour like you drafted above would only cause confusion, IMHO.

I see your point of view.

But now we have two similar functions.
db_mysql_store_result() is also only one function using many functions
from res.c
My main idea is has only one function to make similar job and remove
unnecessary code from res.c

So, I think that fetch_result() API is still usable when it uses
following approach:

nrows == 0 -- return all rows if it was SELECT-like query. it's frequent
way to use 0 to say "all" when you have not idea about how much (rows)
will be returned. Module must be ready to process whole result set.

- nrows == n (for n <= number of rows in query) - return n rows - nrows == n (for n > number of rows in query) - return number of rows
 in query

Yes, because module ready to process at least nrows rows.

nrows < 0 -- user don't want to process any rows so don't return it.

(for mysql) At any case we must call mysql_store_result().
(see at http://dev.mysql.com/doc/refman/5.1/en/mysql-store-result.html)
We also must call mysql_field_count() to know whether a statement should
return a result set if we need it.
We also must call mysql_free_result() to free memory allocated by
mysql_store_result() (see at
http://dev.mysql.com/doc/refman/5.1/en/mysql-free-result.html)

--
CU,
Victor Gamov

_______________________________________________
Devel mailing list
[email protected]
http://openser.org/cgi-bin/mailman/listinfo/devel

Reply via email to