res_config_odbc: set empty extended field as a single whitespace
authorAlexei Gradinari <alex2grad@gmail.com>
Mon, 25 Mar 2019 16:42:27 +0000 (12:42 -0400)
committerAlexei Gradinari <alex2grad@gmail.com>
Mon, 25 Mar 2019 16:43:54 +0000 (10:43 -0600)
If Realtime @ variable value is NULL or empty or contains only whitespaces
then when we try to retrieve it using PJSIP_ENDPOINT we get WARNING
pjsip_endpoint_function_read: Unknown property @my_var for PJSIP endpoint.
And the variable is missing in the result of CLI pjsip show endpoint.

This patch keeps empty sorcery extended field.

ASTERISK-28341 #close

Change-Id: I221fccc04cbfa2be17ce971f64ae0e74e465eea0

res/res_config_odbc.c

index 09eff21..fd0078f 100644 (file)
@@ -287,19 +287,34 @@ static struct ast_variable *realtime_odbc(const char *database, const char *tabl
                }
 
                stringp = ast_str_buffer(rowdata);
-               while (stringp) {
-                       chunk = strsep(&stringp, ";");
-                       if (!ast_strlen_zero(ast_strip(chunk))) {
-                               if (strchr(chunk, '^')) {
-                                       decode_chunk(chunk);
+               if (!strncmp(coltitle, "@", 1)) {
+                       /* The '@' prefix indicates it's a sorcery extended field.
+                        * Because ast_load_realtime_fields eliminates empty entries and makes blank (single whitespace)
+                        * entries empty and keeps them, the empty or NULL values are encoded
+                        * as a string containing a single whitespace. */
+                       if (prev) {
+                               prev->next = ast_variable_new(coltitle, S_OR(stringp," "), "");
+                               if (prev->next) {
+                                       prev = prev->next;
                                }
-                               if (prev) {
-                                       prev->next = ast_variable_new(coltitle, chunk, "");
-                                       if (prev->next) {
-                                               prev = prev->next;
+                       } else {
+                               prev = var = ast_variable_new(coltitle, S_OR(stringp," "), "");
+                       }
+               } else {
+                       while (stringp) {
+                               chunk = strsep(&stringp, ";");
+                               if (!ast_strlen_zero(ast_strip(chunk))) {
+                                       if (strchr(chunk, '^')) {
+                                               decode_chunk(chunk);
+                                       }
+                                       if (prev) {
+                                               prev->next = ast_variable_new(coltitle, chunk, "");
+                                               if (prev->next) {
+                                                       prev = prev->next;
+                                               }
+                                       } else {
+                                               prev = var = ast_variable_new(coltitle, chunk, "");
                                        }
-                               } else {
-                                       prev = var = ast_variable_new(coltitle, chunk, "");
                                }
                        }
                }
@@ -451,17 +466,26 @@ static struct ast_config *realtime_multi_odbc(const char *database, const char *
                                goto next_sql_fetch;
                        }
                        stringp = ast_str_buffer(rowdata);
-                       while (stringp) {
-                               chunk = strsep(&stringp, ";");
-                               if (!ast_strlen_zero(ast_strip(chunk))) {
-                                       if (strchr(chunk, '^')) {
-                                               decode_chunk(chunk);
-                                       }
-                                       if (!strcmp(initfield, coltitle)) {
-                                               ast_category_rename(cat, chunk);
+                       if (!strncmp(coltitle, "@", 1)) {
+                               /* The '@' prefix indicates it's a sorcery extended field.
+                                * Because ast_load_realtime_fields eliminates empty entries and makes blank (single whitespace)
+                                * entries empty and keeps them, the empty or NULL values are encoded
+                                * as a string containing a single whitespace. */
+                               var = ast_variable_new(coltitle, S_OR(stringp," "), "");
+                               ast_variable_append(cat, var);
+                       } else {
+                               while (stringp) {
+                                       chunk = strsep(&stringp, ";");
+                                       if (!ast_strlen_zero(ast_strip(chunk))) {
+                                               if (strchr(chunk, '^')) {
+                                                       decode_chunk(chunk);
+                                               }
+                                               if (!strcmp(initfield, coltitle)) {
+                                                       ast_category_rename(cat, chunk);
+                                               }
+                                               var = ast_variable_new(coltitle, chunk, "");
+                                               ast_variable_append(cat, var);
                                        }
-                                       var = ast_variable_new(coltitle, chunk, "");
-                                       ast_variable_append(cat, var);
                                }
                        }
                }