[Devel] [ openser-Bugs-1618322 ] avp_db_query cannot call mysql
stored procedures
Adrian Georgescu
ag at ag-projects.com
Thu Dec 21 11:52:24 CET 2006
The flag is CLIENT_MULTI_RESULTS and you must also modify the code
that reads the results back because there are multiple result sets
returned by a stored procedure.
On Dec 21, 2006, at 11:44 AM, SourceForge.net wrote:
> Bugs item #1618322, was opened at 2006-12-18 20:17
> Message generated for change (Comment added) made by vabdulla
> You can respond by visiting:
> https://sourceforge.net/tracker/?
> func=detail&atid=743020&aid=1618322&group_id=139143
>
> Please note that this message will contain a full copy of the
> comment thread,
> including the initial issue submission, for this request,
> not just the latest update.
> Category: modules
> Group: ver devel
> Status: Open
> Resolution: None
> Priority: 5
> Private: No
> Submitted By: vabdulla (vabdulla)
> Assigned to: Daniel-Constantin Mierla (miconda)
> Summary: avp_db_query cannot call mysql stored procedures
>
> Initial Comment:
> Hi,
>
> When calling a mysql5 stored procedure which returns a result set
> like this:
> avp_db_query("CALL db.sp_name('$avp(s:param1)', "param2",'$oU')",
> "$avp(s:rs1);$avp(s:rs2));
>
> I get the following error:
>
> 0(1245) submit_query: PROCEDURE db.sp_name can't return a result
> set in the given context
> 0(1245) db_raw_query: Error while submitting query
> 0(1245) avpops:db_query_avp: error - cannot do the query
>
> After some research, I have found that this error come from the
> client flags passed to mysql_real_connect() function.
>
> The patch attached correct this bug.
>
> --
> Regards,
> -vma
> .
>
>
>
> ----------------------------------------------------------------------
>
>> Comment By: vabdulla (vabdulla)
> Date: 2006-12-21 11:44
>
> Message:
> Logged In: YES
> user_id=1580175
> Originator: YES
>
> Hello,
>
> According to the mysql documentation, these flags exist since
> version 4.1
> (http://dev.mysql.com/doc/refman/4.1/en/mysql-real-connect.html).
>
> Otherwise, I don't see a simple way to check the mysql version
> directly as
> you need to be connected first before calling
> mysql_get_server_version().
>
> --
> Regards,
> -vma
> .
>
>
> ----------------------------------------------------------------------
>
> Comment By: Daniel-Constantin Mierla (miconda)
> Date: 2006-12-20 22:57
>
> Message:
> Logged In: YES
> user_id=1246013
> Originator: NO
>
> If I am not wrong, these new flags are available with MySQL 5.0 or
> greater. Could you adapt the patch so it detects mysql version and
> sets the
> flags only when the version is appropriate? Otherwise, I guess,
> will give
> compilation errors for older versions of MySQL.
>
> ----------------------------------------------------------------------
>
> Comment By: Kobi Eshun (ekobi)
> Date: 2006-12-18 21:06
>
> Message:
> Logged In: YES
> user_id=1039134
> Originator: NO
>
> Hi,
>
> I believe that there is more to this problem than simply setting the
> additional client flags. The MySQL manual also recommends disposing
> of all
> result sets by iterating over them with mysql_next_result().
>
> I've appended a patch that does this, and it works fine for some use
> cases. However, I don't believe it's trivial to retrieve more than one
> result set into the OpenSER context using the current API.
>
> Anyone else have any thougts on this? Cheers,
> --
> kobi
>
>
> Index: modules/mysql/dbase.c
> ===================================================================
> RCS file: /cvsroot/openser/sip-server/modules/mysql/dbase.c,v
> retrieving revision 1.5
> diff -u -r1.5 dbase.c
> --- modules/mysql/dbase.c 14 Jul 2006 14:12:59 -0000 1.5
> +++ modules/mysql/dbase.c 5 Dec 2006 00:31:03 -0000
> @@ -327,6 +327,7 @@
> }
>
> CON_RESULT(_h) = mysql_store_result(CON_CONNECTION(_h));
> +
> if (!CON_RESULT(_h)) {
> if (mysql_field_count(CON_CONNECTION(_h)) == 0) {
> (*_r)->col.n = 0;
> @@ -352,7 +353,18 @@
> return -4;
> }
>
> + /* */
> + /* XXX: flush list of result sets -- ke */
> + LOG(L_DBG,"store_result: emptying mysql_store_result list...\n ");
> + while ((!mysql_next_result (CON_CONNECTION(_h)))) {
> + MYSQL_RES *foo=mysql_store_result (CON_CONNECTION(_h));
> + LOG(L_DBG,"store_result: freeing extra result set..\n");
> + mysql_free_result(foo);
> + }
> + LOG(L_DBG,"store_result: done emptying mysql_store_result list.\n
> ");
> +
> return 0;
> +
> }
>
>
> Index: modules/mysql/my_con.c
> ===================================================================
> RCS file: /cvsroot/openser/sip-server/modules/mysql/my_con.c,v
> retrieving revision 1.4
> diff -u -r1.4 my_con.c
> --- modules/mysql/my_con.c 14 Jul 2006 14:12:59 -0000 1.4
> +++ modules/mysql/my_con.c 5 Dec 2006 00:31:03 -0000
> @@ -76,7 +76,7 @@
> );
> }
>
> - if (!mysql_real_connect(ptr->con, id->host, id->username, id-
> >password,
> id->database, id->port, 0, 0)) {
> + if (!mysql_real_connect(ptr->con, id->host, id->username, id-
> >password,
> id->database, id->port, 0, CLIENT_MULTI_RESULTS|
> CLIENT_MULTI_STATEMENTS))
> {
> LOG(L_ERR, "new_connection: %s\n", mysql_error(ptr->con));
> mysql_close(ptr->con);
> goto err;
>
>
> ----------------------------------------------------------------------
>
> You can respond by visiting:
> https://sourceforge.net/tracker/?
> func=detail&atid=743020&aid=1618322&group_id=139143
>
> _______________________________________________
> Devel mailing list
> Devel at openser.org
> http://openser.org/cgi-bin/mailman/listinfo/devel
More information about the Devel
mailing list