in sql-odbc/src/sqlodbc/opensearch_api30.c [52:340]
RETCODE SQL_API OPENSEARCHAPI_GetDiagField(SQLSMALLINT HandleType, SQLHANDLE Handle,
SQLSMALLINT RecNumber,
SQLSMALLINT DiagIdentifier, PTR DiagInfoPtr,
SQLSMALLINT BufferLength,
SQLSMALLINT *StringLengthPtr) {
RETCODE ret = SQL_ERROR, rtn;
ConnectionClass *conn;
StatementClass *stmt;
SQLLEN rc;
SQLSMALLINT pcbErrm;
ssize_t rtnlen = -1;
int rtnctype = SQL_C_CHAR;
MYLOG(OPENSEARCH_TRACE, "entering rec=%d\n", RecNumber);
switch (HandleType) {
case SQL_HANDLE_ENV:
switch (DiagIdentifier) {
case SQL_DIAG_CLASS_ORIGIN:
case SQL_DIAG_SUBCLASS_ORIGIN:
case SQL_DIAG_CONNECTION_NAME:
case SQL_DIAG_SERVER_NAME:
rtnlen = 0;
if (DiagInfoPtr && BufferLength > rtnlen) {
ret = SQL_SUCCESS;
*((char *)DiagInfoPtr) = '\0';
} else
ret = SQL_SUCCESS_WITH_INFO;
break;
case SQL_DIAG_MESSAGE_TEXT:
ret = OPENSEARCHAPI_EnvError(Handle, RecNumber, NULL, NULL,
DiagInfoPtr, BufferLength,
StringLengthPtr, 0);
break;
case SQL_DIAG_NATIVE:
rtnctype = SQL_C_LONG;
ret = OPENSEARCHAPI_EnvError(Handle, RecNumber, NULL,
(SQLINTEGER *)DiagInfoPtr, NULL, 0,
NULL, 0);
break;
case SQL_DIAG_NUMBER:
rtnctype = SQL_C_LONG;
ret = OPENSEARCHAPI_EnvError(Handle, RecNumber, NULL, NULL, NULL, 0,
NULL, 0);
if (SQL_SUCCEEDED(ret)) {
*((SQLINTEGER *)DiagInfoPtr) = 1;
}
break;
case SQL_DIAG_SQLSTATE:
rtnlen = 5;
ret = OPENSEARCHAPI_EnvError(Handle, RecNumber, DiagInfoPtr, NULL,
NULL, 0, NULL, 0);
if (SQL_SUCCESS_WITH_INFO == ret)
ret = SQL_SUCCESS;
break;
case SQL_DIAG_RETURNCODE: /* driver manager returns */
break;
case SQL_DIAG_CURSOR_ROW_COUNT:
case SQL_DIAG_ROW_COUNT:
case SQL_DIAG_DYNAMIC_FUNCTION:
case SQL_DIAG_DYNAMIC_FUNCTION_CODE:
/* options for statement type only */
break;
}
break;
case SQL_HANDLE_DBC:
conn = (ConnectionClass *)Handle;
switch (DiagIdentifier) {
case SQL_DIAG_CLASS_ORIGIN:
case SQL_DIAG_SUBCLASS_ORIGIN:
case SQL_DIAG_CONNECTION_NAME:
rtnlen = 0;
if (DiagInfoPtr && BufferLength > rtnlen) {
ret = SQL_SUCCESS;
*((char *)DiagInfoPtr) = '\0';
} else
ret = SQL_SUCCESS_WITH_INFO;
break;
case SQL_DIAG_SERVER_NAME:
rtnlen = strlen(CC_get_DSN(conn));
if (DiagInfoPtr) {
strncpy_null(DiagInfoPtr, CC_get_DSN(conn),
BufferLength);
ret = (BufferLength > rtnlen ? SQL_SUCCESS
: SQL_SUCCESS_WITH_INFO);
} else
ret = SQL_SUCCESS_WITH_INFO;
break;
case SQL_DIAG_MESSAGE_TEXT:
ret = OPENSEARCHAPI_ConnectError(Handle, RecNumber, NULL, NULL,
DiagInfoPtr, BufferLength,
StringLengthPtr, 0);
break;
case SQL_DIAG_NATIVE:
rtnctype = SQL_C_LONG;
ret = OPENSEARCHAPI_ConnectError(Handle, RecNumber, NULL,
(SQLINTEGER *)DiagInfoPtr, NULL, 0,
NULL, 0);
break;
case SQL_DIAG_NUMBER:
rtnctype = SQL_C_LONG;
ret = OPENSEARCHAPI_ConnectError(Handle, RecNumber, NULL, NULL,
NULL, 0, NULL, 0);
if (SQL_SUCCEEDED(ret)) {
*((SQLINTEGER *)DiagInfoPtr) = 1;
}
break;
case SQL_DIAG_SQLSTATE:
rtnlen = 5;
ret = OPENSEARCHAPI_ConnectError(Handle, RecNumber, DiagInfoPtr,
NULL, NULL, 0, NULL, 0);
if (SQL_SUCCESS_WITH_INFO == ret)
ret = SQL_SUCCESS;
break;
case SQL_DIAG_RETURNCODE: /* driver manager returns */
break;
case SQL_DIAG_CURSOR_ROW_COUNT:
case SQL_DIAG_ROW_COUNT:
case SQL_DIAG_DYNAMIC_FUNCTION:
case SQL_DIAG_DYNAMIC_FUNCTION_CODE:
/* options for statement type only */
break;
}
break;
case SQL_HANDLE_STMT:
conn = (ConnectionClass *)SC_get_conn(((StatementClass *)Handle));
switch (DiagIdentifier) {
case SQL_DIAG_CLASS_ORIGIN:
case SQL_DIAG_SUBCLASS_ORIGIN:
case SQL_DIAG_CONNECTION_NAME:
rtnlen = 0;
if (DiagInfoPtr && BufferLength > rtnlen) {
ret = SQL_SUCCESS;
*((char *)DiagInfoPtr) = '\0';
} else
ret = SQL_SUCCESS_WITH_INFO;
break;
case SQL_DIAG_SERVER_NAME:
rtnlen = strlen(CC_get_DSN(conn));
if (DiagInfoPtr) {
strncpy_null(DiagInfoPtr, CC_get_DSN(conn),
BufferLength);
ret = (BufferLength > rtnlen ? SQL_SUCCESS
: SQL_SUCCESS_WITH_INFO);
} else
ret = SQL_SUCCESS_WITH_INFO;
break;
case SQL_DIAG_MESSAGE_TEXT:
ret = OPENSEARCHAPI_StmtError(Handle, RecNumber, NULL, NULL,
DiagInfoPtr, BufferLength,
StringLengthPtr, 0);
break;
case SQL_DIAG_NATIVE:
rtnctype = SQL_C_LONG;
ret = OPENSEARCHAPI_StmtError(Handle, RecNumber, NULL,
(SQLINTEGER *)DiagInfoPtr, NULL, 0,
NULL, 0);
break;
case SQL_DIAG_NUMBER:
rtnctype = SQL_C_LONG;
*((SQLINTEGER *)DiagInfoPtr) = 0;
ret = SQL_NO_DATA_FOUND;
stmt = (StatementClass *)Handle;
rtn = OPENSEARCHAPI_StmtError(Handle, -1, NULL, NULL, NULL, 0,
&pcbErrm, 0);
switch (rtn) {
case SQL_SUCCESS:
case SQL_SUCCESS_WITH_INFO:
ret = SQL_SUCCESS;
if (pcbErrm > 0 && stmt->opensearch_error)
*((SQLINTEGER *)DiagInfoPtr) =
(pcbErrm - 1) / stmt->opensearch_error->recsize + 1;
break;
default:
break;
}
break;
case SQL_DIAG_SQLSTATE:
rtnlen = 5;
ret = OPENSEARCHAPI_StmtError(Handle, RecNumber, DiagInfoPtr, NULL,
NULL, 0, NULL, 0);
if (SQL_SUCCESS_WITH_INFO == ret)
ret = SQL_SUCCESS;
break;
case SQL_DIAG_CURSOR_ROW_COUNT:
rtnctype = SQL_C_LONG;
stmt = (StatementClass *)Handle;
rc = -1;
if (stmt->status == STMT_FINISHED) {
QResultClass *res = SC_get_Curres(stmt);
/*if (!res)
return SQL_ERROR;*/
if (stmt->proc_return > 0)
rc = 0;
else if (res && QR_NumResultCols(res) > 0
&& !SC_is_fetchcursor(stmt))
rc = QR_get_num_total_tuples(res) - res->dl_count;
}
*((SQLLEN *)DiagInfoPtr) = rc;
MYLOG(OPENSEARCH_ALL, "rc=" FORMAT_LEN "\n", rc);
ret = SQL_SUCCESS;
break;
case SQL_DIAG_ROW_COUNT:
rtnctype = SQL_C_LONG;
stmt = (StatementClass *)Handle;
*((SQLLEN *)DiagInfoPtr) = stmt->diag_row_count;
ret = SQL_SUCCESS;
break;
case SQL_DIAG_ROW_NUMBER:
rtnctype = SQL_C_LONG;
*((SQLLEN *)DiagInfoPtr) = SQL_ROW_NUMBER_UNKNOWN;
ret = SQL_SUCCESS;
break;
case SQL_DIAG_COLUMN_NUMBER:
rtnctype = SQL_C_LONG;
*((SQLINTEGER *)DiagInfoPtr) = SQL_COLUMN_NUMBER_UNKNOWN;
ret = SQL_SUCCESS;
break;
case SQL_DIAG_RETURNCODE: /* driver manager returns */
break;
}
break;
case SQL_HANDLE_DESC:
conn = DC_get_conn(((DescriptorClass *)Handle));
switch (DiagIdentifier) {
case SQL_DIAG_CLASS_ORIGIN:
case SQL_DIAG_SUBCLASS_ORIGIN:
case SQL_DIAG_CONNECTION_NAME:
rtnlen = 0;
if (DiagInfoPtr && BufferLength > rtnlen) {
ret = SQL_SUCCESS;
*((char *)DiagInfoPtr) = '\0';
} else
ret = SQL_SUCCESS_WITH_INFO;
break;
case SQL_DIAG_SERVER_NAME:
rtnlen = strlen(CC_get_DSN(conn));
if (DiagInfoPtr) {
strncpy_null(DiagInfoPtr, CC_get_DSN(conn),
BufferLength);
ret = (BufferLength > rtnlen ? SQL_SUCCESS
: SQL_SUCCESS_WITH_INFO);
} else
ret = SQL_SUCCESS_WITH_INFO;
break;
case SQL_DIAG_MESSAGE_TEXT:
case SQL_DIAG_NATIVE:
case SQL_DIAG_NUMBER:
break;
case SQL_DIAG_SQLSTATE:
rtnlen = 5;
ret = OPENSEARCHAPI_DescError(Handle, RecNumber, DiagInfoPtr, NULL,
NULL, 0, NULL, 0);
if (SQL_SUCCESS_WITH_INFO == ret)
ret = SQL_SUCCESS;
break;
case SQL_DIAG_RETURNCODE: /* driver manager returns */
break;
case SQL_DIAG_CURSOR_ROW_COUNT:
case SQL_DIAG_ROW_COUNT:
case SQL_DIAG_DYNAMIC_FUNCTION:
case SQL_DIAG_DYNAMIC_FUNCTION_CODE:
rtnctype = SQL_C_LONG;
/* options for statement type only */
break;
}
break;
default:
ret = SQL_ERROR;
}
if (SQL_C_LONG == rtnctype) {
if (SQL_SUCCESS_WITH_INFO == ret)
ret = SQL_SUCCESS;
if (StringLengthPtr)
*StringLengthPtr = sizeof(SQLINTEGER);
} else if (rtnlen >= 0) {
if (rtnlen >= BufferLength) {
if (SQL_SUCCESS == ret)
ret = SQL_SUCCESS_WITH_INFO;
if (BufferLength > 0)
((char *)DiagInfoPtr)[BufferLength - 1] = '\0';
}
if (StringLengthPtr)
*StringLengthPtr = (SQLSMALLINT)rtnlen;
}
MYLOG(OPENSEARCH_TRACE, "leaving %d\n", ret);
return ret;
}