Handle the return values of realtime updates and stores more accurately.
authorMark Michelson <mmichelson@digium.com>
Fri, 14 Mar 2014 18:11:55 +0000 (18:11 +0000)
committerMark Michelson <mmichelson@digium.com>
Fri, 14 Mar 2014 18:11:55 +0000 (18:11 +0000)
Realtime backends' update and store callbacks return the number of rows affected,
or -1 if there was a failure. There were a couple of issues:

* The config API was treating 0 as a successful return, and positive values as
  a failure. Now the config API treats anything >= 0 as a success.

* res_sorcery_realtime was treating 0 as a successful return from the store
  procedure, and any positive values as a failure. Now sorcery treats anything
  > 0 as a success. It still considers 0 a "failure" since there is no change
  to report to observers.

Review: https://reviewboard.asterisk.org/r/3341
........

Merged revisions 410592 from http://svn.asterisk.org/svn/asterisk/branches/12

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@410593 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/config.c
res/res_sorcery_realtime.c

index db9182a..505a102 100644 (file)
@@ -2936,8 +2936,8 @@ int ast_update_realtime_fields(const char *family, const char *keyfield, const c
 
        for (i = 1; ; i++) {
                if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) {
-                       /* If the update succeeds, it returns 0. */
-                       if (eng->update_func && !(res = eng->update_func(db, table, keyfield, lookup, fields))) {
+                       /* If the update succeeds, it returns >= 0. */
+                       if (eng->update_func && ((res = eng->update_func(db, table, keyfield, lookup, fields)) >= 0)) {
                                break;
                        }
                } else {
@@ -3017,8 +3017,8 @@ int ast_store_realtime_fields(const char *family, const struct ast_variable *fie
 
        for (i = 1; ; i++) {
                if ((eng = find_engine(family, i, db, sizeof(db), table, sizeof(table)))) {
-                       /* If the store succeeds, it returns 0. */
-                       if (eng->store_func && !(res = eng->store_func(db, table, fields))) {
+                       /* If the store succeeds, it returns >= 0*/
+                       if (eng->store_func && ((res = eng->store_func(db, table, fields)) >= 0)) {
                                break;
                        }
                } else {
index bc4c7f9..656ee0d 100644 (file)
@@ -79,7 +79,7 @@ static int sorcery_realtime_create(const struct ast_sorcery *sorcery, void *data
        id->next = fields;
        fields = id;
 
-       return ast_store_realtime_fields(family, fields) ? -1 : 0;
+       return (ast_store_realtime_fields(family, fields) <= 0) ? -1 : 0;
 }
 
 /*! \brief Internal helper function which returns a filtered objectset.