From: Mark Michelson Date: Fri, 2 May 2014 19:50:07 +0000 (+0000) Subject: Return the number of rows affected by a SQL insert, rather than an object ID. X-Git-Tag: 11.10.0-rc1~29 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=96cb27394805a3327387e33c4b7ded34d6015b94;p=thirdparty%2Fasterisk.git Return the number of rows affected by a SQL insert, rather than an object ID. The realtime API specifies that the store callback is supposed to return the number of rows affected. res_config_pgsql was instead returning an Oid cast as an int, which during any nominal execution would be cast to 0. Returning 0 when more than 0 rows were inserted causes problems to the function's callers. To give an idea of how strange code can be, this is the necessary code change to fix a device state issue reported against chan_pjsip in Asterisk 12+. The issue was that the registrar would attempt to insert contacts into the database. Because of the 0 return from res_config_pgsql, the registrar would think that the contact was not successfully inserted, even though it actually was. As such, even though the contact was query-able and it was possible to call the endpoint, Asterisk would "think" the endpoint was unregistered, meaning it would report the device state as UNAVAILABLE instead of NOT_INUSE. The necessary fix applies to all versions of Asterisk, so even though the bug reported only applies to Asterisk 12+, the code correction is being inserted into 1.8+. Closes issue ASTERISK-23707 Reported by Mark Michelson ........ Merged revisions 413224 from http://svn.asterisk.org/svn/asterisk/branches/1.8 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@413225 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/res/res_config_pgsql.c b/res/res_config_pgsql.c index 0632d9592e..be2d4ed3be 100644 --- a/res/res_config_pgsql.c +++ b/res/res_config_pgsql.c @@ -934,7 +934,7 @@ static int update2_pgsql(const char *database, const char *tablename, va_list ap static int store_pgsql(const char *database, const char *table, va_list ap) { RAII_VAR(PGresult *, result, NULL, PQclear); - Oid insertid; + int numrows; struct ast_str *buf = ast_str_thread_get(&escapebuf_buf, 256); struct ast_str *sql1 = ast_str_thread_get(&sql_buf, 256); struct ast_str *sql2 = ast_str_thread_get(&where_buf, 256); @@ -994,10 +994,10 @@ static int store_pgsql(const char *database, const char *table, va_list ap) return -1; } - insertid = PQoidValue(result); + numrows = atoi(PQcmdTuples(result)); ast_mutex_unlock(&pgsql_lock); - ast_debug(1, "PostgreSQL RealTime: row inserted on table: %s, id: %u\n", table, insertid); + ast_debug(1, "PostgreSQL RealTime: row inserted on table: %s.", table); /* From http://dev.pgsql.com/doc/pgsql/en/pgsql-affected-rows.html * An integer greater than zero indicates the number of rows affected @@ -1005,8 +1005,9 @@ static int store_pgsql(const char *database, const char *table, va_list ap) * -1 indicates that the query returned an error (although, if the query failed, it should have been caught above.) */ - if (insertid >= 0) - return (int) insertid; + if (numrows >= 0) { + return numrows; + } return -1; }