Skip to content
Snippets Groups Projects
Commit 96cb2739 authored by Mark Michelson's avatar Mark Michelson
Browse files

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
parent 709d39b6
No related branches found
No related tags found
No related merge requests found
......@@ -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;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment