Merged revisions 73316 via svnmerge from
[asterisk/asterisk.git] / res / res_config_odbc.c
index 3ef3edd..7715166 100644 (file)
@@ -30,6 +30,8 @@
 
 /*** MODULEINFO
        <depend>unixodbc</depend>
+       <depend>ltdl</depend>
+       <depend>res_odbc</depend>
  ***/
 
 #include "asterisk.h"
@@ -168,7 +170,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 +187,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);
                }
        }
 
@@ -216,7 +220,6 @@ static struct ast_config *realtime_multi_odbc(const char *database, const char *
        struct ast_variable *var=NULL;
        struct ast_config *cfg=NULL;
        struct ast_category *cat=NULL;
-       struct ast_realloca ra;
        SQLULEN colsize;
        SQLSMALLINT colcount=0;
        SQLSMALLINT datatype;
@@ -226,11 +229,9 @@ static struct ast_config *realtime_multi_odbc(const char *database, const char *
 
        va_list aq;
        va_copy(aq, ap);
-       
-       
+
        if (!table)
                return NULL;
-       memset(&ra, 0, sizeof(ra));
 
        obj = ast_odbc_request_obj(database, 0);
        if (!obj)
@@ -441,11 +442,7 @@ static int update_odbc(const char *database, const char *table, const char *keyf
 
 struct config_odbc_obj {
        char *sql;
-       unsigned long id;
        unsigned long cat_metric;
-       unsigned long var_metric;
-       unsigned long commented;
-       char filename[128];
        char category[128];
        char var_name[128];
        char var_val[1024]; /* changed from 128 to 1024 via bug 8251 */
@@ -473,14 +470,10 @@ static SQLHSTMT config_odbc_prepare(struct odbc_obj *obj, void *data)
                return NULL;
        }
 
-       SQLBindCol(sth, 1, SQL_C_ULONG, &q->id, sizeof(q->id), &q->err);
-       SQLBindCol(sth, 2, SQL_C_ULONG, &q->cat_metric, sizeof(q->cat_metric), &q->err);
-       SQLBindCol(sth, 3, SQL_C_ULONG, &q->var_metric, sizeof(q->var_metric), &q->err);
-       SQLBindCol(sth, 4, SQL_C_ULONG, &q->commented, sizeof(q->commented), &q->err);
-       SQLBindCol(sth, 5, SQL_C_CHAR, q->filename, sizeof(q->filename), &q->err);
-       SQLBindCol(sth, 6, SQL_C_CHAR, q->category, sizeof(q->category), &q->err);
-       SQLBindCol(sth, 7, SQL_C_CHAR, q->var_name, sizeof(q->var_name), &q->err);
-       SQLBindCol(sth, 8, SQL_C_CHAR, q->var_val, sizeof(q->var_val), &q->err);
+       SQLBindCol(sth, 1, SQL_C_ULONG, &q->cat_metric, sizeof(q->cat_metric), &q->err);
+       SQLBindCol(sth, 2, SQL_C_CHAR, q->category, sizeof(q->category), &q->err);
+       SQLBindCol(sth, 3, SQL_C_CHAR, q->var_name, sizeof(q->var_name), &q->err);
+       SQLBindCol(sth, 4, SQL_C_CHAR, q->var_val, sizeof(q->var_val), &q->err);
 
        return sth;
 }
@@ -491,9 +484,11 @@ static struct ast_config *config_odbc(const char *database, const char *table, c
        struct ast_category *cur_cat;
        int res = 0;
        struct odbc_obj *obj;
-       char sql[255] = "";
+       char sqlbuf[1024] = "";
+       char *sql = sqlbuf;
+       size_t sqlleft = sizeof(sqlbuf);
        unsigned int last_cat_metric = 0;
-       SQLSMALLINT rowcount=0;
+       SQLSMALLINT rowcount = 0;
        SQLHSTMT stmt;
        char last[128] = "";
        struct config_odbc_obj q;
@@ -507,8 +502,10 @@ static struct ast_config *config_odbc(const char *database, const char *table, c
        if (!obj)
                return NULL;
 
-       snprintf(sql, sizeof(sql), "SELECT * FROM %s WHERE filename='%s' and commented=0 ORDER BY filename,cat_metric desc,var_metric asc,category,var_name,var_val,id", table, file);
-       q.sql = sql;
+       ast_build_string(&sql, &sqlleft, "SELECT cat_metric, category, var_name, var_val FROM %s ", table);
+       ast_build_string(&sql, &sqlleft, "WHERE filename='%s' AND commented=0 ", file);
+       ast_build_string(&sql, &sqlleft, "ORDER BY cat_metric DESC, var_metric ASC, category, var_name ");
+       q.sql = sqlbuf;
 
        stmt = ast_odbc_prepare_and_execute(obj, config_odbc_prepare, &q);
 
@@ -589,7 +586,7 @@ static int load_module (void)
        return 0;
 }
 
-AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS, "ODBC Configuration",
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS, "Realtime ODBC configuration",
                .load = load_module,
                .unload = unload_module,
                );