From: Alexei Gradinari Date: Thu, 31 May 2018 15:25:40 +0000 (-0400) Subject: func_odbc: NODATA if SQLNumResultCols returned 0 columns on readsql X-Git-Tag: 13.22.0-rc1~34^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d9d50396cfe8173ba14a7973c45b4446d71d6726;p=thirdparty%2Fasterisk.git func_odbc: NODATA if SQLNumResultCols returned 0 columns on readsql The functions acf_odbc_read/cli_odbc_read ignore a number of columns returned by the SQLNumResultCols. If the number of columns is zero it means no data. In this case, a SQLFetch function has to be not called, because it will cause an error. ASTERISK-27888 #close Change-Id: Ie0f7bdac6c405aa5bbd38932c7b831f90729ee19 --- diff --git a/funcs/func_odbc.c b/funcs/func_odbc.c index d19b56f84d..f4821c0e6b 100644 --- a/funcs/func_odbc.c +++ b/funcs/func_odbc.c @@ -859,6 +859,21 @@ static int acf_odbc_read(struct ast_channel *chan, const char *cmd, char *s, cha return -1; } + if (colcount <= 0) { + ast_verb(4, "Returned %d columns [%s]\n", colcount, ast_str_buffer(sql)); + buf[0] = '\0'; + SQLCloseCursor(stmt); + SQLFreeHandle (SQL_HANDLE_STMT, stmt); + release_obj_or_dsn (&obj, &dsn); + if (!bogus_chan) { + pbx_builtin_setvar_helper(chan, "ODBCROWS", "0"); + pbx_builtin_setvar_helper(chan, "ODBCSTATUS", "NODATA"); + ast_autoservice_stop(chan); + } + odbc_datastore_free(resultset); + return 0; + } + res = SQLFetch(stmt); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { int res1 = -1; @@ -1522,6 +1537,15 @@ static char *cli_odbc_read(struct ast_cli_entry *e, int cmd, struct ast_cli_args return CLI_SUCCESS; } + if (colcount <= 0) { + SQLCloseCursor(stmt); + SQLFreeHandle (SQL_HANDLE_STMT, stmt); + release_obj_or_dsn (&obj, &dsn); + ast_cli(a->fd, "Returned %d columns. Query executed on handle %d:%s [%s]\n", colcount, dsn_num, query->readhandle[dsn_num], ast_str_buffer(sql)); + AST_RWLIST_UNLOCK(&queries); + return CLI_SUCCESS; + } + res = SQLFetch(stmt); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { SQLCloseCursor(stmt);