When calling the Realtime app more than once, unset fields which were
authorTilghman Lesher <tilghman@meg.abyt.es>
Sun, 7 Jan 2007 16:21:12 +0000 (16:21 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Sun, 7 Jan 2007 16:21:12 +0000 (16:21 +0000)
previously set are erroneously still set (Bug 6701).  After discussion,
it was determined this should only be changed in trunk.

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

funcs/func_realtime.c
include/asterisk/config.h
main/config.c
res/res_config_odbc.c
res/res_realtime.c

index fa9d4a7..92a7297 100644 (file)
@@ -75,7 +75,7 @@ static int function_realtime_read(struct ast_channel *chan, const char *cmd, cha
        if (!args.delim2)
                args.delim2 = "=";
 
-       head = ast_load_realtime(args.family, args.fieldmatch, args.value, NULL);
+       head = ast_load_realtime_all(args.family, args.fieldmatch, args.value, NULL);
 
        if (!head) {
                ast_module_user_remove(u);
index ac752ca..7ee51d3 100644 (file)
@@ -128,6 +128,7 @@ int ast_category_exist(const struct ast_config *config, const char *category_nam
  * MUST be freed with ast_variables_destroy() as there is no container.
  */
 struct ast_variable *ast_load_realtime(const char *family, ...);
+struct ast_variable *ast_load_realtime_all(const char *family, ...);
 
 /*! \brief Retrieve realtime configuration 
  * \param family which family/config to lookup
index 4a14d21..28e9708 100644 (file)
@@ -1314,7 +1314,7 @@ struct ast_config *ast_config_load_with_comments(const char *filename)
        return result;
 }
 
-struct ast_variable *ast_load_realtime(const char *family, ...)
+struct ast_variable *ast_load_realtime_all(const char *family, ...)
 {
        struct ast_config_engine *eng;
        char db[256]="";
@@ -1331,6 +1331,35 @@ struct ast_variable *ast_load_realtime(const char *family, ...)
        return res;
 }
 
+struct ast_variable *ast_load_realtime(const char *family, ...)
+{
+       struct ast_variable *res, *cur, *prev = NULL, *freeme = NULL;
+       va_list ap;
+
+       va_start(ap, family);
+       res = ast_load_realtime_all(family, ap);
+       va_end(ap);
+
+       /* Eliminate blank entries */
+       for (cur = res; cur; cur = cur->next) {
+               if (freeme) {
+                       free(freeme);
+                       freeme = NULL;
+               }
+
+               if (ast_strlen_zero(cur->value)) {
+                       if (prev)
+                               prev->next = cur->next;
+                       else
+                               res = cur->next;
+                       freeme = cur;
+               } else {
+                       prev = cur;
+               }
+       }
+       return res;
+}
+
 /*! \brief Check if realtime engine is configured for family */
 int ast_check_realtime(const char *family)
 {
index 3ef3edd..5c725a0 100644 (file)
@@ -168,7 +168,12 @@ static struct ast_variable *realtime_odbc(const char *database, const char *tabl
                indicator = 0;
                res = SQLGetData(stmt, x + 1, SQL_CHAR, rowdata, sizeof(rowdata), &indicator);
                if (indicator == SQL_NULL_DATA)
-                       continue;
+                       rowdata[0] = '\0';
+               else if (ast_strlen_zero(rowdata)) {
+                       /* Because we encode the empty string for a NULL, we will encode
+                        * actual empty strings as a string containing a single whitespace. */
+                       ast_copy_string(rowdata, " ", sizeof(rowdata));
+               }
 
                if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
                        ast_log(LOG_WARNING, "SQL Get Data error!\n[%s]\n\n", sql);
@@ -180,15 +185,12 @@ static struct ast_variable *realtime_odbc(const char *database, const char *tabl
                stringp = rowdata;
                while(stringp) {
                        chunk = strsep(&stringp, ";");
-                       if (!ast_strlen_zero(ast_strip(chunk))) {
-                               if (prev) {
-                                       prev->next = ast_variable_new(coltitle, chunk);
-                                       if (prev->next)
-                                               prev = prev->next;
-                                       } else 
-                                               prev = var = ast_variable_new(coltitle, chunk);
-                                       
-                       }
+                       if (prev) {
+                               prev->next = ast_variable_new(coltitle, chunk);
+                               if (prev->next)
+                                       prev = prev->next;
+                       } else 
+                               prev = var = ast_variable_new(coltitle, chunk);
                }
        }
 
index 1a750d9..28525f4 100644 (file)
@@ -57,7 +57,7 @@ static int cli_realtime_load(int fd, int argc, char **argv)
                return RESULT_FAILURE;
        }
 
-       var = ast_load_realtime(argv[2], argv[3], argv[4], NULL);
+       var = ast_load_realtime_all(argv[2], argv[3], argv[4], NULL);
 
        if(var) {
                ast_cli(fd, header_format, "Column Name", "Column Value");