]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Support schema selection in cdr_adaptive_odbc
authorKinsey Moore <kmoore@digium.com>
Fri, 3 Feb 2012 16:50:49 +0000 (16:50 +0000)
committerKinsey Moore <kmoore@digium.com>
Fri, 3 Feb 2012 16:50:49 +0000 (16:50 +0000)
Asterisk now supports using ODBC with databases where a single schema must be
selected.  Previously, INSERTs would fail because they did not take into
account extra fields cause by having multiple schemas.  This also corrects
some SQL resource leaks.

(closes issue ASTERISK-17106)
Patch-by: Alexander Frolkin
Patch-by: Tilgnman Lesher
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@353964 65c4cc65-6c06-0410-ace0-fbb531ad65f3

UPGRADE.txt
cdr/cdr_adaptive_odbc.c
configs/cdr_adaptive_odbc.conf.sample

index 83c2b2b6cba299f73907c4411bf206bf49b637be..6b53de30e68358399ff0eb1c23f2b258402961e5 100644 (file)
@@ -35,6 +35,10 @@ func_enum:
    differentiate between a failed query and a successful query with 0 results
    matching the specified type.
 
+CDR:
+ - cdr_adaptive_odbc now supports specifying a schema so that Asterisk can
+   connect to databases that use schemas.
+
 Configuration Files:
  - Files listed below have been updated to be more consistent with how Asterisk
    parses configuration files.  This makes configuration files more consistent
index cb9bd0d529b29f97d4b94ebd3894700dd67a46c6..8d66a133c8fcd0ff3180c688464e6220152b100b 100644 (file)
@@ -72,6 +72,7 @@ struct columns {
 struct tables {
        char *connection;
        char *table;
+       char *schema;
        unsigned int usegmtime:1;
        AST_LIST_HEAD_NOLOCK(odbc_columns, columns) columns;
        AST_RWLIST_ENTRY(tables) list;
@@ -90,7 +91,8 @@ static int load_config(void)
        char columnname[80];
        char connection[40];
        char table[40];
-       int lenconnection, lentable, usegmtime = 0;
+       char schema[40];
+       int lenconnection, lentable, lenschema, usegmtime = 0;
        SQLLEN sqlptr;
        int res = 0;
        SQLHSTMT stmt = NULL;
@@ -132,6 +134,12 @@ static int load_config(void)
                ast_copy_string(table, tmp, sizeof(table));
                lentable = strlen(table);
 
+               if (ast_strlen_zero(tmp = ast_variable_retrieve(cfg, catg, "schema"))) {
+                       tmp = "";
+               }
+               ast_copy_string(schema, tmp, sizeof(schema));
+               lenschema = strlen(schema);
+
                res = SQLAllocHandle(SQL_HANDLE_STMT, obj->con, &stmt);
                if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
                        ast_log(LOG_WARNING, "SQL Alloc Handle failed on connection '%s'!\n", connection);
@@ -139,16 +147,19 @@ static int load_config(void)
                        continue;
                }
 
-               res = SQLColumns(stmt, NULL, 0, NULL, 0, (unsigned char *)table, SQL_NTS, (unsigned char *)"%", SQL_NTS);
+               res = SQLColumns(stmt, NULL, 0, lenschema == 0 ? NULL : (unsigned char *)schema, SQL_NTS, (unsigned char *)table, SQL_NTS, (unsigned char *)"%", SQL_NTS);
                if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
                        ast_log(LOG_ERROR, "Unable to query database columns on connection '%s'.  Skipping.\n", connection);
+                       SQLFreeHandle(SQL_HANDLE_STMT, stmt);
                        ast_odbc_release_obj(obj);
                        continue;
                }
 
-               tableptr = ast_calloc(sizeof(char), sizeof(*tableptr) + lenconnection + 1 + lentable + 1);
+               tableptr = ast_calloc(sizeof(char), sizeof(*tableptr) + lenconnection + 1 + lentable + 1 + lenschema + 1);
                if (!tableptr) {
-                       ast_log(LOG_ERROR, "Out of memory creating entry for table '%s' on connection '%s'\n", table, connection);
+                       ast_log(LOG_ERROR, "Out of memory creating entry for table '%s' on connection '%s'%s%s%s\n", table, connection,
+                               lenschema ? " (schema '" : "", lenschema ? schema : "", lenschema ? "')" : "");
+                       SQLFreeHandle(SQL_HANDLE_STMT, stmt);
                        ast_odbc_release_obj(obj);
                        res = -1;
                        break;
@@ -157,8 +168,10 @@ static int load_config(void)
                tableptr->usegmtime = usegmtime;
                tableptr->connection = (char *)tableptr + sizeof(*tableptr);
                tableptr->table = (char *)tableptr + sizeof(*tableptr) + lenconnection + 1;
+               tableptr->schema = (char *)tableptr + sizeof(*tableptr) + lenconnection + 1 + lentable + 1;
                ast_copy_string(tableptr->connection, connection, lenconnection + 1);
                ast_copy_string(tableptr->table, table, lentable + 1);
+               ast_copy_string(tableptr->schema, schema, lenschema + 1);
 
                ast_verb(3, "Found adaptive CDR table %s@%s.\n", tableptr->table, tableptr->connection);
 
@@ -228,6 +241,7 @@ static int load_config(void)
                        if (!entry) {
                                ast_log(LOG_ERROR, "Out of memory creating entry for column '%s' in table '%s' on connection '%s'\n", columnname, table, connection);
                                res = -1;
+                               SQLFreeHandle(SQL_HANDLE_STMT, stmt);
                                break;
                        }
                        entry->name = (char *)entry + sizeof(*entry);
@@ -376,7 +390,11 @@ static int odbc_log(struct ast_cdr *cdr)
 
        AST_LIST_TRAVERSE(&odbc_tables, tableptr, list) {
                int first = 1;
-               ast_str_set(&sql, 0, "INSERT INTO %s (", tableptr->table);
+               if (ast_strlen_zero(tableptr->schema)) {
+                       ast_str_set(&sql, 0, "INSERT INTO %s (", tableptr->table);
+               } else {
+                       ast_str_set(&sql, 0, "INSERT INTO %s.%s (", tableptr->schema, tableptr->table);
+               }
                ast_str_set(&sql2, 0, " VALUES (");
 
                /* No need to check the connection now; we'll handle any failure in prepare_and_execute */
index 9b2725b9316f0a40e2eea1ccedeb17cf12cacb4e..775e9abb24a4be392a440c2b4bee7a67eadb5edc 100644 (file)
@@ -28,6 +28,7 @@
 ;[third]
 ;connection=sqlserver
 ;table=AsteriskCDR
+;schema=public ; for databases which support schemas
 ;usegmtime=yes ; defaults to no
 ;alias src => source
 ;alias channel => source_channel