diff --git a/src/mod/languages/mod_spidermonkey_odbc/mod_spidermonkey_odbc.c b/src/mod/languages/mod_spidermonkey_odbc/mod_spidermonkey_odbc.c index 90e994ec3a..4d96b74c95 100644 --- a/src/mod/languages/mod_spidermonkey_odbc/mod_spidermonkey_odbc.c +++ b/src/mod/languages/mod_spidermonkey_odbc/mod_spidermonkey_odbc.c @@ -359,46 +359,45 @@ static JSBool odbc_get_data(JSContext * cx, JSObject * obj, uintN argc, jsval * } if (odbc_obj->stmt) { - SQLSMALLINT c = 0, x = 0; - SQLLEN m = 0; + SQLSMALLINT nColumns = 0, x = 0; eval_some_js("~var _oDbC_dB_RoW_DaTa_ = {}", cx, obj, rval); if (*rval == JS_FALSE) { return JS_TRUE; } - SQLNumResultCols(odbc_obj->stmt, &c); - SQLRowCount(odbc_obj->stmt, &m); - if (m > 0) { - for (x = 1; x <= c; x++) { - SQLSMALLINT NameLength, DataType, DecimalDigits, Nullable; - SQLULEN ColumnSize; - SQLCHAR name[1024] = ""; - SQLCHAR *data = odbc_obj->colbuf; - SQLCHAR *esc = NULL; + if ( SQLNumResultCols( odbc_obj->stmt, &nColumns ) != SQL_SUCCESS ) + return JS_FALSE; - SQLDescribeCol(odbc_obj->stmt, x, name, sizeof(name), &NameLength, &DataType, &ColumnSize, &DecimalDigits, &Nullable); - SQLGetData(odbc_obj->stmt, x, SQL_C_CHAR, odbc_obj->colbuf, odbc_obj->cblen, NULL); + for (x = 1; x <= nColumns; x++) { + SQLSMALLINT NameLength, DataType, DecimalDigits, Nullable; + SQLULEN ColumnSize; + SQLCHAR name[1024] = ""; + SQLCHAR *data = odbc_obj->colbuf; + SQLCHAR *esc = NULL; - if (strchr((char *) odbc_obj->colbuf, '"')) { /* please don't */ - esc = (SQLCHAR *) escape_data((char *) odbc_obj->colbuf, '\\'); - data = esc; - } + SQLDescribeCol(odbc_obj->stmt, x, name, sizeof(name), &NameLength, &DataType, &ColumnSize, &DecimalDigits, &Nullable); + SQLGetData(odbc_obj->stmt, x, SQL_C_CHAR, odbc_obj->colbuf, odbc_obj->cblen, NULL); - switch_snprintf((char *) odbc_obj->code, odbc_obj->codelen, "~_oDbC_dB_RoW_DaTa_[\"%s\"] = \"%s\"", name, data); - switch_safe_free(esc); - - eval_some_js((char *) odbc_obj->code, cx, obj, rval); - - if (*rval == JS_FALSE) { - return JS_TRUE; - } + if (strchr((char *) odbc_obj->colbuf, '"')) { /* please don't */ + esc = (SQLCHAR *) escape_data((char *) odbc_obj->colbuf, '\\'); + data = esc; } - JS_GetProperty(cx, obj, "_oDbC_dB_RoW_DaTa_", rval); - return JS_TRUE; + switch_snprintf((char *) odbc_obj->code, odbc_obj->codelen, "~_oDbC_dB_RoW_DaTa_[\"%s\"] = \"%s\"", name, data); + switch_safe_free(esc); + + eval_some_js((char *) odbc_obj->code, cx, obj, rval); + + if (*rval == JS_FALSE) { + return JS_TRUE; + } } + JS_GetProperty(cx, obj, "_oDbC_dB_RoW_DaTa_", rval); + return JS_TRUE; + + } done: diff --git a/src/switch_odbc.c b/src/switch_odbc.c index 6677d6d347..e638c006b6 100644 --- a/src/switch_odbc.c +++ b/src/switch_odbc.c @@ -196,6 +196,9 @@ static int db_is_up(switch_odbc_handle_t *handle) SQLCHAR sql[255] = ""; int max_tries = 120; + SQLRETURN rc; + SQLSMALLINT nresultcols; + top: if (!handle) { @@ -219,10 +222,15 @@ static int db_is_up(switch_odbc_handle_t *handle) result = SQLExecute(stmt); - SQLRowCount(stmt, &m); - ret = (int) m; - - if (result < 0 || m < 0) { + SQLRowCount (stmt, &m); + rc = SQLNumResultCols (stmt, &nresultcols); + if (rc != SQL_SUCCESS){ + goto error; + } + ret = (int) nresultcols; + /* determine statement type */ + if (nresultcols <= 0) { + /* statement is not a select statement */ goto error; }