blob: b4ca5c420b50f2080c7995a0caafaa2aaa22c78a [file] [log] [blame]
/**********************************************************************
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
********************************************************************/
//
// MODULE: SrvrOther.cpp
//
// PURPOSE: Implements the following methods
// odbc_SQLSvc_Prepare_sme_
// odbc_SQLSvc_ExecuteN_sme_
// odbc_SQLSvc_Close_sme_
// odbc_SQLSvc_FetchN_sme_
// odbc_SQLSvc_EndTransaction_sme_
// odbc_SQLSvc_ExecuteCall_sme_
//
#include <platform_ndcs.h>
#include <platform_utils.h>
#include <stdio.h>
#include <stdlib.h>
#include <map>
#include <string>
// Used to disable and enable dumps via setrlimit in a release env.
#ifndef _DEBUG
#include <sys/resource.h>
#endif
#include <sql.h>
#include <sqlext.h>
#include "odbcCommon.h"
#include "odbc_sv.h"
#include "srvrcommon.h"
#include "sqlinterface.h"
#include "srvrkds.h"
#include "SQLWrapper.h"
#include "CommonDiags.h"
#include "tdm_odbcSrvrMsg.h"
#include "ResStatistics.h"
#include "ResStatisticsSession.h"
#include "ResStatisticsStatement.h"
#include "NskUtil.h"
// reserved names for seabase metadata where SQL table information is kept
#ifndef SEABASE_MD_SCHEMA
#define SEABASE_MD_SCHEMA "\"_MD_\""
#define SEABASE_MD_CATALOG "TRAFODION"
#define SEABASE_COLUMNS "COLUMNS"
#define SEABASE_DEFAULTS "DEFAULTS"
#define SEABASE_INDEXES "INDEXES"
#define SEABASE_KEYS "KEYS"
#define SEABASE_OBJECTS "OBJECTS"
#define SEABASE_OBJECTUID "OBJECTUID"
#define SEABASE_TABLES "TABLES"
#define SEABASE_VIEWS "VIEWS"
#define SEABASE_VIEWS_USAGE "VIEWS_USAGE"
#define SEABASE_VERSIONS "VERSIONS"
#endif
//#include "zmxocfg.h" //aruna
#include <dlfcn.h>
#include "sqlcli.h"
#include "TransportBase.h"
// #ifdef _TMP_SQ_SECURITY
#include "secsrvrmxo.h"
#include "dbUserAuth.h"
// #endif
#define SQL_API_TBLSYNONYM 1917
#define SQL_API_TBLMVS 1918
using namespace SRVR;
bool rePrepare2WouldLikeToExecute(Long stmtHandle
, Int32 *returnCode
, Int32 *sqlWarningOrErrorLength
, char *&sqlWarningOrError);
short qrysrvcExecuteFinished(
const char *stmtLabel
, const Long stmtHandle
, const bool bCheckSqlQueryType
, const short error_code
, const bool bFetch
, const bool bException
, const bool bErase);
void AllocateAdaptiveSegment(SRVR_STMT_HDL *pSrvrStmt);
void DeallocateAdaptiveSegment(SRVR_STMT_HDL *pSrvrStmt);
void ClearAdaptiveSegment(short adapiveSeg = -1);
static void setAuthenticationError(
bool & bSQLMessageSet,
odbc_SQLSvc_SQLError * SQLError,
const char * externalUsername,
bool isInternalError);
// Internal calls - Defined in libcli.so
int SQL_EXEC_AssignParserFlagsForExSqlComp_Internal( /*IN*/ unsigned int flagbits);
int SQL_EXEC_GetParserFlagsForExSqlComp_Internal( /*IN*/ unsigned int &flagbits);
void SQL_EXEC_SetParserFlagsForExSqlComp_Internal( /*IN*/ unsigned int flagbits);
#define INTERNAL_QUERY_FROM_EXEUTIL 0x20000
//#define SRVR_PERFORMANCE
SMD_SELECT_TABLE SQLCommitStmt[] = {
{ STRING_TYPE, "COMMIT WORK"},
{ END_OF_TABLE}
};
SMD_SELECT_TABLE SQLRollbackStmt[] = {
{ STRING_TYPE, "ROLLBACK WORK"},
{ END_OF_TABLE}
};
SMD_QUERY_TABLE tranQueryTable[] = {
{"SQL_COMMIT", SQLCommitStmt, TYPE_UNKNOWN, FALSE, FALSE},
{"SQL_ROLLBACK", SQLRollbackStmt, TYPE_UNKNOWN, FALSE, FALSE},
{NULL}
};
#define SQL_API_JDBC 9999
#define SQL_API_SQLTABLES_JDBC SQL_API_SQLTABLES + SQL_API_JDBC
#define SQL_API_SQLGETTYPEINFO_JDBC SQL_API_SQLGETTYPEINFO + SQL_API_JDBC
#define SQL_API_SQLCOLUMNS_JDBC SQL_API_SQLCOLUMNS + SQL_API_JDBC
#define SQL_API_SQLSPECIALCOLUMNS_JDBC SQL_API_SQLSPECIALCOLUMNS + SQL_API_JDBC
#define SQL_API_SQLPROCEDURES_JDBC SQL_API_SQLPROCEDURES + SQL_API_JDBC
#define SQL_API_SQLPROCEDURECOLUMNS_JDBC SQL_API_SQLPROCEDURECOLUMNS + SQL_API_JDBC
// The value represents SQL version, MXCS module major version and MXCS module minor version.
#define MODULE_RELEASE_VERSION 200
#define MODULE_MAJOR_VERSION 400
#define MODULE_MINOR_VERSION 000
#define SQL_INVALID_USER_CODE -8837
// ResStatistics
ResStatisticsSession *resStatSession;
ResStatisticsStatement *resStatStatement;
BOOL resStatCollectorError = false;
struct collect_info setinit;
Int32 inState = STMTSTAT_NONE;
short inSqlStmtType = TYPE_UNKNOWN;
double inEstimatedCost = 0;
char *inQueryId = NULL;
char *inSqlString = NULL;
Int32 inErrorStatement = 0;
Int32 inWarningStatement = 0;
int64 inRowCount = 0;
Int32 inErrorCode = 0;
Int32 inSqlQueryType = 0;
Int32 inSqlNewQueryType = 0;
char *inSqlError = NULL;
Int32 inSqlErrorLength = 0;
bool setStatisticsFlag = FALSE;
// end ResStatistics
char b[317];
bool securitySetup = false;
//char QueryQueue[1024];
//int64 queryId;
/*
* Synchronous method function for
* operation 'odbc_SQLSvc_Prepare'
*/
extern "C" void
odbc_SQLSvc_Prepare_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def *call_id_
, /* Out */ odbc_SQLSvc_Prepare_exc_ *exception_
, /* In */ DIALOGUE_ID_def dialogueId
, /* In */ const IDL_char *stmtLabel
, /* In */ const IDL_char *stmtExplainLabel
, /* In */ IDL_short stmtType
, /* In */ IDL_string sqlString
, /* In */ IDL_short sqlAsyncEnable
, /* In */ Int32 queryTimeout
, /* Out */ Int32 *estimatedCost
, /* Out */ SQLItemDescList_def *inputDesc
, /* Out */ SQLItemDescList_def *outputDesc
, /* Out */ ERROR_DESC_LIST_def *sqlWarning)
{
SRVRTRACE_ENTER(FILE_SME+1)
SRVR_STMT_HDL *pSrvrStmt = NULL;
SQL_QUERY_COST_INFO cost_info;
SQL_QUERY_COMPILER_STATS_INFO comp_stats_info;
SQLRETURN rc = PROGRAM_ERROR;
Int32 holdestimatedCost;
bool flag_21036 = false;
if (sqlString == NULL)
{
exception_->exception_nr = odbc_SQLSvc_Prepare_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_NULL_SQL_STMT;
}
// resource statistics
if (resStatStatement != NULL && stmtType == EXTERNAL_STMT)
{
inState = STMTSTAT_PREPARE;
inSqlStmtType = TYPE_UNKNOWN;
inEstimatedCost = 0;
inQueryId = NULL;
inSqlString = NULL;
inErrorStatement = 0;
inWarningStatement = 0;
inRowCount = 0;
inErrorCode = 0;
inSqlQueryType = SQL_UNKNOWN;
inSqlNewQueryType = SQL_UNKNOWN;
inSqlError = NULL;
inSqlErrorLength = 0;
bzero(&cost_info, sizeof(cost_info));
resStatStatement->start(inState,
inSqlQueryType,
stmtLabel,
NULL,
inEstimatedCost,
&flag_21036,
sqlString);
}
if (exception_->exception_nr == 0)
{
if (stmtType != TYPE_SMD)
{
if ((pSrvrStmt = getSrvrStmt(stmtLabel, FALSE)) != NULL)
{
pSrvrStmt->cleanupAll();
pSrvrStmt->currentMethod = odbc_SQLSvc_Close_ldx_;
pSrvrStmt->freeResourceOpt = SQL_DROP;
FREESTATEMENT(pSrvrStmt);
}
// Need to validate the stmtLabel
// Given a label find out the SRVR_STMT_HDL
if ((pSrvrStmt = getSrvrStmt(stmtLabel, TRUE)) == NULL)
{
exception_->exception_nr = odbc_SQLSvc_Prepare_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
}
if (exception_->exception_nr == 0)
{
if (resStatStatement != NULL && stmtType == EXTERNAL_STMT)
pSrvrStmt->inState = inState;
rc = SQL_SUCCESS;
if (!pSrvrStmt->isReadFromModule)
{
// cleanup all memory allocated in the previous operations
pSrvrStmt->cleanupAll();
pSrvrStmt->sqlStringLen = strlen(sqlString);
pSrvrStmt->sqlString = new char[pSrvrStmt->sqlStringLen+1];
if (pSrvrStmt->sqlString == NULL)
{
SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
srvrGlobal->srvrObjRef, 1, "Prepare");
exit(0);
}
strcpy(pSrvrStmt->sqlString, sqlString);
pSrvrStmt->stmtType = stmtType;
pSrvrStmt->currentMethod = odbc_SQLSvc_Prepare_ldx_;
rc = PREPARE(pSrvrStmt);
switch (rc)
{
case SQL_SUCCESS:
break;
case SQL_SUCCESS_WITH_INFO:
GETSQLWARNING(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlWarning);
break;
case SQL_ERROR:
GETSQLERROR(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError);
break;
case ODBC_RG_WARNING:
// if there is RG_WARNING, we don't pass SQL Warning to the application
// Hence, we need to clear any warnings
// call SQL_EXEC_ClearDiagnostics
// CLEARDIAGNOSTICS(pSrvrStmt);
rc = SQL_SUCCESS_WITH_INFO;
case ODBC_SERVER_ERROR:
case ODBC_RG_ERROR:
default:
break;
}
}
}
}
/* else // added for user module support
{
char *sqltoken;
char sqlseps[] = " \t\n{(";
int ch = '.';
int TknLen = 0;
int SStrLen = 0;
char VariableValue[1000];
VariableValue[0] = '\0';
strcpy(VariableValue,sqlString);
sqltoken = strtok(VariableValue, sqlseps);
if (_stricmp(sqltoken, "SMD") == 0)
{
sqltoken = strtok(NULL, sqlseps);
if (sqltoken != NULL)
{
UserModuleName[0] = '\0';
UserStatementName[0] = '\0';
TknLen = strrchr(sqltoken, ch) - sqltoken + 1;
SStrLen = strlen(sqltoken);
strncpy(UserModuleName,sqltoken, TknLen-1);
UserModuleName[TknLen-1] = '\0';
strncpy(UserStatementName,sqltoken + TknLen, SStrLen);
UserStatementName[SStrLen-TknLen+1] = '\0';
// Need to validate the stmtLabel
// Given a label find out the SRVR_STMT_HDL
pSrvrStmt = getSrvrStmt(UserStatementName, TRUE);
strcpy(pSrvrStmt->stmtName, UserStatementName);
strcpy(pSrvrStmt->cursorName, UserStatementName);
pSrvrStmt->stmtType = stmtType;
user_module.module_name = UserModuleName;
user_module.module_name_len = strlen(UserModuleName);
user_module.charset = "ISO88591";
user_module.creation_timestamp = 1234567890;
rc = pSrvrStmt->PrepareUserModule();
}
else
{
// Return Error Invalid Module Name.
}
sqltoken = strtok(NULL, sqlseps);
if (sqltoken != NULL)
{
// Return Error Invalid Module Name.
}
}
else
{
// Return Error Invalid Call.
}
}
*/
if (exception_->exception_nr == 0)
{
switch (rc)
{
case SQL_SUCCESS:
case SQL_SUCCESS_WITH_INFO:
exception_->exception_nr = 0;
// Copy all the output parameters
// Vijay - Changes to support not to parse tokens for statement type SELECT
holdestimatedCost = (Int32)pSrvrStmt->cost_info.totalTime; // SQL returns cost in a strcuture - cost.totalTime
if ((pSrvrStmt->sqlQueryType == SQL_SELECT_NON_UNIQUE) || (pSrvrStmt->sqlQueryType == SQL_SELECT_UNIQUE))
pSrvrStmt->sqlStmtType = TYPE_SELECT;
*estimatedCost = pSrvrStmt->sqlQueryType;
inputDesc->_length = pSrvrStmt->inputDescList._length;
inputDesc->_buffer = pSrvrStmt->inputDescList._buffer;
outputDesc->_length = pSrvrStmt->outputDescList._length;
outputDesc->_buffer = pSrvrStmt->outputDescList._buffer;
sqlWarning->_length = pSrvrStmt->sqlWarning._length;
sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
break;
case SQL_STILL_EXECUTING:
exception_->exception_nr = odbc_SQLSvc_Prepare_SQLStillExecuting_exn_;
break;
case ODBC_RG_ERROR:
case SQL_ERROR:
ERROR_DESC_def *error_desc_def;
error_desc_def = pSrvrStmt->sqlError.errorList._buffer;
if (pSrvrStmt->sqlError.errorList._length != 0 && error_desc_def->sqlcode == -8007)
{
exception_->exception_nr = odbc_SQLSvc_Prepare_SQLQueryCancelled_exn_;
exception_->u.SQLQueryCancelled.sqlcode = error_desc_def->sqlcode;
}
else
{
exception_->exception_nr = odbc_SQLSvc_Prepare_SQLError_exn_;
exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
}
break;
case PROGRAM_ERROR:
exception_->exception_nr = odbc_SQLSvc_Prepare_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_PREPARE_FAILED;
default:
break;
}
}
}
// resource statistics
if (resStatStatement != NULL && stmtType == EXTERNAL_STMT)
{
if (exception_->exception_nr != 0 && exception_->u.SQLError.errorList._buffer != NULL)
{
inErrorStatement ++;
ERROR_DESC_def *p_buffer = exception_->u.SQLError.errorList._buffer;
inErrorCode = p_buffer->sqlcode;
inSqlError = p_buffer->errorText;
inSqlErrorLength = strlen(p_buffer->errorText);
}
if (sqlWarning->_length != 0)
inWarningStatement ++;
if (sqlString == NULL)
sqlString = "";
inSqlString = new char[strlen(sqlString) + 1];
if (inSqlString == NULL)
{
SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
srvrGlobal->srvrObjRef, 1, "inSqlString");
exit(0);
}
strcpy(inSqlString,sqlString);
if (pSrvrStmt != NULL)
{
inEstimatedCost = pSrvrStmt->cost_info.totalTime; // res stat reports estimated cost as double
inQueryId = pSrvrStmt->sqlUniqueQueryID;
inSqlQueryType = pSrvrStmt->sqlQueryType;
inSqlNewQueryType = pSrvrStmt->sqlNewQueryType;
}
resStatStatement->end(inState,
inSqlQueryType,
inSqlStmtType,
inQueryId,
inEstimatedCost,
inSqlString,
inErrorStatement,
inWarningStatement,
inRowCount,
inErrorCode,
resStatSession,
inSqlErrorLength,
inSqlError,
pSrvrStmt,
&flag_21036,
inSqlNewQueryType);
delete inSqlString;
}
//end rs
pSrvrStmt->m_need_21036_end_msg = flag_21036;
SRVRTRACE_EXIT(FILE_SME+1);
return;
}
/*
* Synchronous method function for
* operation 'odbc_SQLSvc_ExecuteN'
*/
extern "C" void
odbc_SQLSvc_ExecuteN_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def *call_id_
, /* Out */ odbc_SQLSvc_ExecuteN_exc_ *exception_
, /* In */ DIALOGUE_ID_def dialogueId
, /* In */ const IDL_char *stmtLabel
, /* In */ IDL_string cursorName
, /* In */ IDL_short sqlStmtType
, /* In */ Int32 inputRowCnt
, /* In */ const SQLValueList_def *inputValueList
, /* In */ IDL_short sqlAsyncEnable
, /* In */ Int32 queryTimeout
, /* Out */ Int32 *rowsAffected
, /* Out */ ERROR_DESC_LIST_def *sqlWarning)
{
SRVRTRACE_ENTER(FILE_SME+2);
SRVR_STMT_HDL *pSrvrStmt = NULL;
SQLRETURN rc = SQL_SUCCESS;
bool bWMAutoCommitOff = false;
if (inputRowCnt < 0)
{
exception_->exception_nr = odbc_SQLSvc_ExecuteN_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_ROW_COUNT;
}
else
{
if (sqlStmtType == TYPE_SELECT && inputRowCnt > 1)
{
exception_->exception_nr = odbc_SQLSvc_ExecuteN_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_ROW_COUNT_AND_SELECT;
}
else
{
if ((pSrvrStmt = getSrvrStmt(stmtLabel, FALSE)) == NULL)
{
exception_->exception_nr = odbc_SQLSvc_ExecuteN_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
}
}
}
if (exception_->exception_nr == 0)
{
// resource statistics
if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
pSrvrStmt->inState = inState = STMTSTAT_EXECUTE;
inSqlStmtType = sqlStmtType;
inEstimatedCost = pSrvrStmt->cost_info.totalTime;
inQueryId = NULL;
inSqlString = NULL;
inErrorStatement = 0;
inWarningStatement = 0;
inRowCount = 0;
inErrorCode = 0;
inSqlError = NULL;
inSqlErrorLength = 0;
/*resStatStatement->start(inState,
pSrvrStmt->sqlQueryType,
stmtLabel,
pSrvrStmt->sqlUniqueQueryID,
pSrvrStmt->cost_info,
pSrvrStmt->comp_stats_info,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg,
false,
pSrvrStmt->sqlString); */
resStatStatement->start(inState,
pSrvrStmt->sqlQueryType,
stmtLabel,
pSrvrStmt,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg,
pSrvrStmt->sqlString);
}
//end rs
if (pSrvrStmt->bSQLMessageSet)
pSrvrStmt->cleanupSQLMessage();
if(pSrvrStmt->bSQLValueListSet)
pSrvrStmt->cleanupSQLValueList();
pSrvrStmt->inputRowCnt = inputRowCnt;
pSrvrStmt->sqlStmtType = sqlStmtType;
if (cursorName != NULL && cursorName[0] != '\0')
{
pSrvrStmt->cursorNameLen = strlen(cursorName);
pSrvrStmt->cursorNameLen = pSrvrStmt->cursorNameLen < sizeof(pSrvrStmt->cursorName)? pSrvrStmt->cursorNameLen : sizeof(pSrvrStmt->cursorName);
strncpy(pSrvrStmt->cursorName, cursorName, sizeof(pSrvrStmt->cursorName));
pSrvrStmt->cursorName[sizeof(pSrvrStmt->cursorName)-1] = 0;
}
else
pSrvrStmt->cursorName[0] = '\0';
pSrvrStmt->inputValueList._buffer = inputValueList->_buffer;
pSrvrStmt->inputValueList._length = inputValueList->_length;
pSrvrStmt->currentMethod = odbc_SQLSvc_ExecuteN_ldx_;
// batch job support for T4
// Fix for transaction issue 20/09/06
if ((WSQL_EXEC_Xact(SQLTRANS_STATUS,NULL) != 0) && srvrGlobal->bAutoCommitOn == TRUE && sqlStmtType != TYPE_SELECT)
{
bWMAutoCommitOff = true;
SRVR_STMT_HDL *TranOffSrvrStmt;
if ((TranOffSrvrStmt = getSrvrStmt("STMT_TRANS_OFF_1", FALSE)) == NULL)
{
exception_->exception_nr = odbc_SQLSvc_ExecuteN_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
}
else
{
SQLValueList_def *inValueList;
markNewOperator,inValueList = new SQLValueList_def();
if (inValueList == NULL)
{
SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
srvrGlobal->srvrObjRef, 1, "odbc_SQLSvc_ExecuteN_sme_");
exit(0);
}
inValueList->_buffer = NULL;
inValueList->_length = 0;
rc = TranOffSrvrStmt->Execute(NULL,1,TYPE_UNKNOWN,inValueList,SQL_ASYNC_ENABLE_OFF,0);
if (rc == SQL_ERROR)
{
exception_->exception_nr = odbc_SQLSvc_ExecuteN_SQLError_exn_;
exception_->u.SQLError.errorList._length = TranOffSrvrStmt->sqlError.errorList._length;
exception_->u.SQLError.errorList._buffer = TranOffSrvrStmt->sqlError.errorList._buffer;
}
else if (rc != SQL_SUCCESS)
{
exception_->exception_nr = 0;
sqlWarning->_length = TranOffSrvrStmt->sqlWarning._length;
sqlWarning->_buffer = TranOffSrvrStmt->sqlWarning._buffer;
}
delete inValueList;
}
}
if (exception_->exception_nr == 0)
{
rc = EXECUTE(pSrvrStmt);
switch (rc)
{
case ODBC_RG_WARNING:
// if there is RG_WARNING, we don't pass SQL Warning to the application
// Hence, we need to clear any warnings
// call SQL_EXEC_ClearDiagnostics
// CLEARDIAGNOSTICS(pSrvrStmt);
rc = SQL_SUCCESS_WITH_INFO;
case SQL_SUCCESS_WITH_INFO:
GETSQLWARNING(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlWarning);
case SQL_SUCCESS:
exception_->exception_nr = 0;
// Copy the output values
*rowsAffected = pSrvrStmt->rowsAffected;
sqlWarning->_length = pSrvrStmt->sqlWarning._length;
sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
break;
case SQL_STILL_EXECUTING:
exception_->exception_nr = odbc_SQLSvc_ExecuteN_SQLStillExecuting_exn_;
break;
case SQL_INVALID_HANDLE:
exception_->exception_nr = odbc_SQLSvc_ExecuteN_SQLInvalidHandle_exn_;
break;
case SQL_NEED_DATA:
exception_->exception_nr = odbc_SQLSvc_ExecuteN_SQLNeedData_exn_;
break;
case SQL_ERROR:
GETSQLERROR(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError);
case ODBC_SERVER_ERROR:
if (rc == ODBC_SERVER_ERROR)
{
// Allocate Error Desc
kdsCreateSQLErrorException(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError, 1);
// Add SQL Error
kdsCopySQLErrorException(&pSrvrStmt->sqlError, NULL_VALUE_ERROR, NULL_VALUE_ERROR_SQLCODE,
NULL_VALUE_ERROR_SQLSTATE);
}
ERROR_DESC_def *error_desc_def;
error_desc_def = pSrvrStmt->sqlError.errorList._buffer;
if (pSrvrStmt->sqlError.errorList._length != 0 && error_desc_def->sqlcode == -8007)
{
exception_->exception_nr = odbc_SQLSvc_ExecuteN_SQLQueryCancelled_exn_;
exception_->u.SQLQueryCancelled.sqlcode = error_desc_def->sqlcode;
}
else
{
exception_->exception_nr = odbc_SQLSvc_ExecuteN_SQLError_exn_;
exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
}
break;
case -8814:
case 8814:
rc = SQL_RETRY_COMPILE_AGAIN;
exception_->exception_nr = odbc_SQLSvc_ExecuteN_SQLRetryCompile_exn_;
break;
case PROGRAM_ERROR:
exception_->exception_nr = odbc_SQLSvc_ExecuteN_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECUTE_FAILED;
default:
break;
}
if (resStatStatement != NULL)
{
resStatStatement->setStatistics(pSrvrStmt);
}
// batch job support for T4
// Fix for transaction issue 20/09/06
if ( bWMAutoCommitOff )
{
SQLValueList_def *inValueList;
markNewOperator,inValueList = new SQLValueList_def();
if (inValueList == NULL)
{
SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
srvrGlobal->srvrObjRef, 1, "odbc_SQLSvc_ExecuteN_sme_");
exit(0);
}
inValueList->_buffer = NULL;
inValueList->_length = 0;
if(WSQL_EXEC_Xact(SQLTRANS_STATUS,NULL) == 0)
{
SRVR_STMT_HDL *RbwSrvrStmt;
SRVR_STMT_HDL *CmwSrvrStmt;
if (exception_->exception_nr != 0)
{
RbwSrvrStmt = getSrvrStmt("STMT_ROLLBACK_1", FALSE);
rc = RbwSrvrStmt->Execute(NULL,1,TYPE_UNKNOWN,inValueList,SQL_ASYNC_ENABLE_OFF,0);
}
else
{
CmwSrvrStmt = getSrvrStmt("STMT_COMMIT_1", FALSE);
rc = CmwSrvrStmt->Execute(NULL,1,TYPE_UNKNOWN,inValueList,SQL_ASYNC_ENABLE_OFF,0);
if (rc == SQL_ERROR)
{
ERROR_DESC_def *error_desc_def = CmwSrvrStmt->sqlError.errorList._buffer;
if (CmwSrvrStmt->sqlError.errorList._length != 0 )
{
if(error_desc_def->sqlcode != -8605 )
{
exception_->exception_nr = odbc_SQLSvc_ExecuteN_ParamError_exn_;
if (CEE_TMP_ALLOCATE(call_id_, 50, (void **)&(exception_->u.ParamError.ParamDesc)) == CEE_SUCCESS)
sprintf(exception_->u.ParamError.ParamDesc, "%s (%d)",SQLSVC_EXCEPTION_EXECUTE_FAILED, error_desc_def->sqlcode);
else
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECUTE_FAILED;
}
else
rc = SQL_SUCCESS;
}
else
{
exception_->exception_nr = odbc_SQLSvc_ExecuteN_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECUTE_FAILED;
}
}
else if (rc != SQL_SUCCESS)
{
exception_->exception_nr = odbc_SQLSvc_ExecuteN_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECUTE_FAILED;
}
}
}
// reset back to original setting
SRVR_STMT_HDL *TranOnSrvrStmt;
if ((TranOnSrvrStmt = getSrvrStmt("STMT_TRANS_ON_1", FALSE)) == NULL)
{
exception_->exception_nr = odbc_SQLSvc_ExecuteN_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
}
rc = TranOnSrvrStmt->Execute(NULL,1,TYPE_UNKNOWN,inValueList,SQL_ASYNC_ENABLE_OFF,0);
if (rc == SQL_ERROR)
{
exception_->exception_nr = odbc_SQLSvc_ExecuteN_SQLError_exn_;
exception_->u.SQLError.errorList._length = TranOnSrvrStmt->sqlError.errorList._length;
exception_->u.SQLError.errorList._buffer = TranOnSrvrStmt->sqlError.errorList._buffer;
}
else if (rc != SQL_SUCCESS)
{
exception_->exception_nr = 0;
sqlWarning->_length = TranOnSrvrStmt->sqlWarning._length;
sqlWarning->_buffer = TranOnSrvrStmt->sqlWarning._buffer;
}
delete inValueList;
}
}
}
// resource statistics
if (resStatStatement != NULL && pSrvrStmt != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
if (exception_->exception_nr != 0 && exception_->u.SQLError.errorList._buffer != NULL)
{
inErrorStatement ++;
ERROR_DESC_def *p_buffer = exception_->u.SQLError.errorList._buffer;
inErrorCode = p_buffer->sqlcode;
inSqlError = p_buffer->errorText;
inSqlErrorLength = strlen(p_buffer->errorText);
}
if (sqlWarning->_length != 0)
inWarningStatement ++;
inRowCount = *rowsAffected;
inQueryId = pSrvrStmt->sqlUniqueQueryID;
inSqlQueryType = pSrvrStmt->sqlQueryType;
resStatStatement->end(inState,
inSqlQueryType,
inSqlStmtType,
inQueryId,
inEstimatedCost,
inSqlString,
inErrorStatement,
inWarningStatement,
inRowCount,
inErrorCode,
resStatSession,
inSqlErrorLength,
inSqlError,
pSrvrStmt,
&pSrvrStmt->m_need_21036_end_msg,
pSrvrStmt->sqlNewQueryType,
pSrvrStmt->isClosed);
}
//end rs
SRVRTRACE_EXIT(FILE_SME+2);
return;
}
/*
* Synchronous method function for
* operation 'odbc_SQLSvc_Prepare2'
*/
extern "C" void
odbc_SQLSvc_Prepare2_sme_(
/* In */ Int32 inputRowCnt
, /* In */ Int32 sqlStmtType
, /* In */ const IDL_char *stmtLabel
, /* In */ IDL_string sqlString
, /* In */ Int32 holdableCursor
, /* Out */ Int32 *returnCode
, /* Out */ Int32 *sqlWarningOrErrorLength
, /* Out */ BYTE *&sqlWarningOrError
, /* Out */ Int32 *sqlQueryType
, /* Out */ Long *stmtHandle
, /* Out */ Int32 *estimatedCost
, /* Out */ Int32 *inputDescLength
, /* Out */ BYTE *&inputDesc
, /* Out */ Int32 *outputDescLength
, /* Out */ BYTE *&outputDesc
, /* In */ bool isFromExecDirect = false)
{
SRVRTRACE_ENTER(FILE_SME+18);
SRVR_STMT_HDL *pSrvrStmt = NULL;
SQL_QUERY_COST_INFO cost_info;
SQL_QUERY_COMPILER_STATS_INFO comp_stats_info;
SQLRETURN rc = SQL_SUCCESS;
bool bSkipWouldLikeToExecute = false; // some queries have to skip Would Like To Execute
bool flag_21036 = false;
if (sqlString == NULL)
{
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY090", "Invalid SQL String.", sqlWarningOrErrorLength, sqlWarningOrError);
}
else
{
// resource statistics
if (resStatStatement != NULL)
{
inState = STMTSTAT_PREPARE;
inSqlStmtType = TYPE_UNKNOWN;
inEstimatedCost = 0;
inQueryId = NULL;
inSqlString = NULL;
inErrorStatement = 0;
inWarningStatement = 0;
inRowCount = 0;
inErrorCode = 0;
inSqlQueryType = SQL_UNKNOWN;
inSqlNewQueryType = SQL_UNKNOWN;
inSqlError = NULL;
inSqlErrorLength = 0;
bzero(&cost_info, sizeof(cost_info));
resStatStatement->start(inState,
inSqlQueryType,
stmtLabel,
NULL,
inEstimatedCost,
&flag_21036,
sqlString);
}
if ((pSrvrStmt = getSrvrStmt(stmtLabel, FALSE)) != NULL)
{
bSkipWouldLikeToExecute = pSrvrStmt->m_bSkipWouldLikeToExecute;
if (pSrvrStmt->bSQLMessageSet)
pSrvrStmt->cleanupSQLMessage();
if(pSrvrStmt->bSQLValueListSet)
pSrvrStmt->cleanupSQLValueList();
pSrvrStmt->currentMethod = odbc_SQLSvc_Close_ldx_;
pSrvrStmt->freeResourceOpt = SQL_DROP;
FREESTATEMENT(pSrvrStmt);
}
// Need to validate the stmtLabel
// Given a label find out the SRVR_STMT_HDL
if ((pSrvrStmt = getSrvrStmt(stmtLabel, TRUE)) == NULL)
{
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY000", "Statement Label could not be allocated.", sqlWarningOrErrorLength, sqlWarningOrError);
}
}
if (*returnCode == 0)
{
pSrvrStmt->m_bSkipWouldLikeToExecute = bSkipWouldLikeToExecute;
*stmtHandle = (Long)pSrvrStmt;
// cleanup all memory allocated in the previous operations
pSrvrStmt->cleanupAll();
if (resStatStatement != NULL)
pSrvrStmt->inState = inState;
pSrvrStmt->sqlStringLen = strlen(sqlString) + 1;
pSrvrStmt->sqlString = new char[pSrvrStmt->sqlStringLen];
if (pSrvrStmt->sqlString == NULL)
{
SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
srvrGlobal->srvrObjRef, 1, "Prepare2");
exit(0);
}
strncpy(pSrvrStmt->sqlString, sqlString, pSrvrStmt->sqlStringLen);
pSrvrStmt->sqlStmtType = (short)sqlStmtType;
pSrvrStmt->maxRowsetSize = inputRowCnt;
if (pSrvrStmt->maxRowsetSize == ROWSET_NOT_DEFINED) pSrvrStmt->maxRowsetSize = DEFAULT_ROWSET_SIZE;
if (srvrGlobal->srvrType == CORE_SRVR)
AllocateAdaptiveSegment(pSrvrStmt);
pSrvrStmt->currentMethod = odbc_SQLSvc_PrepareRowset_ldx_;
pSrvrStmt->holdableCursor = holdableCursor;
rc = PREPARE2(pSrvrStmt,isFromExecDirect);
if (srvrGlobal->srvrType == CORE_SRVR && rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)
DeallocateAdaptiveSegment(pSrvrStmt);
switch (rc)
{
case ODBC_RG_WARNING:
case SQL_SHAPE_WARNING:
case SQL_SUCCESS_WITH_INFO:
*returnCode = SQL_SUCCESS_WITH_INFO;
*estimatedCost = (Int32)pSrvrStmt->cost_info.totalTime; // SQL returns cost in a strcuture - cost.totalTime == estimatedCost
*sqlQueryType = pSrvrStmt->sqlQueryType;
*inputDescLength = pSrvrStmt->inputDescBufferLength;
inputDesc = pSrvrStmt->inputDescBuffer;
*outputDescLength = pSrvrStmt->outputDescBufferLength;
outputDesc = pSrvrStmt->outputDescBuffer;
if (rc == SQL_SUCCESS_WITH_INFO)
{
GETSQLWARNINGORERROR2(pSrvrStmt);
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
}
else if (rc == SQL_SHAPE_WARNING)
{
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
}
else
{
char *RGWarningOrError;
RGWarningOrError = new char[256];
sprintf(b,"%lf",pSrvrStmt->cost_info.totalTime);
sprintf(RGWarningOrError, "The query's estimated cost: %.50s exceeded resource management attribute limit set.", b);
GETMXCSWARNINGORERROR(1, "01000", RGWarningOrError, sqlWarningOrErrorLength, sqlWarningOrError);
delete RGWarningOrError;
}
break;
case SQL_SUCCESS:
*estimatedCost = (Int32)pSrvrStmt->cost_info.totalTime; // SQL returns cost in a strcuture - cost.totalTime == estimatedCost
*sqlQueryType = pSrvrStmt->sqlQueryType;
*inputDescLength = pSrvrStmt->inputDescBufferLength;
inputDesc = pSrvrStmt->inputDescBuffer;
*outputDescLength = pSrvrStmt->outputDescBufferLength;
outputDesc = pSrvrStmt->outputDescBuffer;
break;
case SQL_ERROR:
case ODBC_RG_ERROR:
*returnCode = SQL_ERROR;
if (rc == SQL_ERROR)
{
GETSQLWARNINGORERROR2(pSrvrStmt);
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
}
else
{
char *RGWarningOrError;
RGWarningOrError = new char[256];
sprintf(b,"%lf",pSrvrStmt->cost_info.totalTime);
sprintf(RGWarningOrError, "The query's estimated cost: %.50s exceeded resource management attribute limit set.", b);
GETMXCSWARNINGORERROR(-1, "HY000", RGWarningOrError, sqlWarningOrErrorLength, sqlWarningOrError);
delete RGWarningOrError;
}
break;
case PROGRAM_ERROR:
GETMXCSWARNINGORERROR(-1, "HY000", SQLSVC_EXCEPTION_PREPARE_FAILED, sqlWarningOrErrorLength, sqlWarningOrError);
break;
case INFOSTATS_SYNTAX_ERROR:
case INFOSTATS_STMT_NOT_FOUND:
*returnCode = SQL_ERROR;
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
break;
default:
break;
}
}
// resource statistics
if (resStatStatement != NULL)
{
if (*returnCode == SQL_ERROR && pSrvrStmt != NULL && pSrvrStmt->sqlWarningOrError != NULL)
{
inErrorCode = *(Int32 *)(pSrvrStmt->sqlWarningOrError+8);
inErrorStatement ++;
inSqlError = (char*)pSrvrStmt->sqlWarningOrError + 16;
inSqlErrorLength =*(Int32 *)(pSrvrStmt->sqlWarningOrError + 12);
}
if (*returnCode == SQL_SUCCESS_WITH_INFO)
inWarningStatement ++;
if (sqlString == NULL)
sqlString = "";
if (pSrvrStmt != NULL)
{
inSqlString = new char[pSrvrStmt->sqlStringLen];
if (inSqlString == NULL)
{
SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
srvrGlobal->srvrObjRef, 1, "inSqlString");
exit(0);
}
strncpy(inSqlString,sqlString,pSrvrStmt->sqlStringLen);
inEstimatedCost = pSrvrStmt->cost_info.totalTime; // res stat reports estimated cost as double
inQueryId = pSrvrStmt->sqlUniqueQueryID;
inSqlQueryType = pSrvrStmt->sqlQueryType;
inSqlNewQueryType = pSrvrStmt->sqlNewQueryType;
}
resStatStatement->end(inState,
inSqlQueryType,
inSqlStmtType,
inQueryId,
inEstimatedCost,
inSqlString,
inErrorStatement,
inWarningStatement,
inRowCount,
inErrorCode,
resStatSession,
inSqlErrorLength,
inSqlError,
pSrvrStmt,
&flag_21036,
inSqlNewQueryType);
if(inSqlString != NULL)
delete inSqlString;
}
//end rs
if(pSrvrStmt != NULL)
pSrvrStmt->m_need_21036_end_msg = flag_21036;
SRVRTRACE_EXIT(FILE_SME+18);
return;
}
/*
* Synchronous method function for
* operation 'odbc_SQLSvc_Prepare2withRowsets'
*/
extern "C" void
odbc_SQLSvc_Prepare2withRowsets_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def *call_id_
, /* In */ DIALOGUE_ID_def dialogueId
, /* In */ Int32 sqlAsyncEnable
, /* In */ Int32 queryTimeout
, /* In */ Int32 inputRowCnt
, /* In */ Int32 sqlStmtType
, /* In */ Int32 stmtLength
, /* In */ const IDL_char *stmtLabel
, /* In */ Int32 stmtLabelCharset
, /* In */ Int32 cursorLength
, /* In */ IDL_string cursorName
, /* In */ Int32 cursorCharset
, /* In */ Int32 moduleNameLength
, /* In */ const IDL_char *moduleName
, /* In */ Int32 moduleCharset
, /* In */ int64 moduleTimestamp
, /* In */ Int32 sqlStringLength
, /* In */ IDL_string sqlString
, /* In */ Int32 sqlStringCharset
, /* In */ Int32 setStmtOptionsLength
, /* In */ IDL_string setStmtOptions
, /* In */ Int32 holdableCursor
, /* Out */ Int32 *returnCode
, /* Out */ Int32 *sqlWarningOrErrorLength
, /* Out */ BYTE *&sqlWarningOrError
, /* Out */ Int32 *sqlQueryType
, /* Out */ Long *stmtHandle
, /* Out */ Int32 *estimatedCost
, /* Out */ Int32 *inputDescLength
, /* Out */ BYTE *&inputDesc
, /* Out */ Int32 *outputDescLength
, /* Out */ BYTE *&outputDesc)
{
SRVRTRACE_ENTER(FILE_SME+18);
SRVR_STMT_HDL *pSrvrStmt = NULL;
SQL_QUERY_COST_INFO cost_info;
SQL_QUERY_COMPILER_STATS_INFO comp_stats_info;
SQLRETURN rc = SQL_SUCCESS;
bool flag_21036 = false;
if (sqlString == NULL)
{
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY090", "Invalid SQL String.", sqlWarningOrErrorLength, sqlWarningOrError);
}
else
{
// resource statistics
if (resStatStatement != NULL)
{
inState = STMTSTAT_PREPARE;
inSqlStmtType = TYPE_UNKNOWN;
inEstimatedCost = 0;
inQueryId = NULL;
inSqlString = NULL;
inErrorStatement = 0;
inWarningStatement = 0;
inRowCount = 0;
inErrorCode = 0;
inSqlQueryType = SQL_UNKNOWN;
inSqlNewQueryType = SQL_UNKNOWN;
inSqlError = NULL;
inSqlErrorLength = 0;
bzero(&cost_info, sizeof(cost_info));
resStatStatement->start(inState,
inSqlQueryType,
stmtLabel,
NULL,
inEstimatedCost,
&flag_21036,
sqlString);
}
if ((pSrvrStmt = getSrvrStmt(stmtLabel, FALSE)) != NULL)
{
if (pSrvrStmt->bSQLMessageSet)
pSrvrStmt->cleanupSQLMessage();
if(pSrvrStmt->bSQLValueListSet)
pSrvrStmt->cleanupSQLValueList();
pSrvrStmt->currentMethod = odbc_SQLSvc_Close_ldx_;
pSrvrStmt->freeResourceOpt = SQL_DROP;
FREESTATEMENT(pSrvrStmt);
}
// Need to validate the stmtLabel
// Given a label find out the SRVR_STMT_HDL
if ((pSrvrStmt = getSrvrStmt(stmtLabel, TRUE)) == NULL)
{
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY000", "Statement Label not found.", sqlWarningOrErrorLength, sqlWarningOrError);
}
}
if (*returnCode == 0)
{
*stmtHandle = (Long)pSrvrStmt;
// cleanup all memory allocated in the previous operations
pSrvrStmt->cleanupAll();
if (resStatStatement != NULL)
pSrvrStmt->inState = inState;
pSrvrStmt->sqlStringLen = sqlStringLength;
pSrvrStmt->sqlString = new char[sqlStringLength];
if (pSrvrStmt->sqlString == NULL)
{
SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
srvrGlobal->srvrObjRef, 1, "Prepare2");
exit(0);
}
strncpy(pSrvrStmt->sqlString, sqlString, sqlStringLength);
pSrvrStmt->sqlStmtType = (short)sqlStmtType;
pSrvrStmt->maxRowsetSize = inputRowCnt;
if (pSrvrStmt->maxRowsetSize == ROWSET_NOT_DEFINED) pSrvrStmt->maxRowsetSize = DEFAULT_ROWSET_SIZE;
// this part is for NAR (not Atomic Rowset Recovery)
if (pSrvrStmt->maxRowsetSize > 1
&& (pSrvrStmt->sqlStmtType == TYPE_INSERT_PARAM))
// || pSrvrStmt->sqlStmtType == TYPE_UPDATE
// || pSrvrStmt->sqlStmtType == TYPE_DELETE))
{
if (srvrGlobal->EnvironmentType & MXO_ROWSET_ERROR_RECOVERY)
rc = WSQL_EXEC_SetStmtAttr(&pSrvrStmt->stmt, SQL_ATTR_ROWSET_ATOMICITY, SQL_NOT_ATOMIC,0);
else
rc = WSQL_EXEC_SetStmtAttr(&pSrvrStmt->stmt, SQL_ATTR_ROWSET_ATOMICITY, SQL_ATOMIC, 0);
if (rc < 0)
{
GETSQLERROR(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError);
return;
}
}
if (srvrGlobal->srvrType == CORE_SRVR)
AllocateAdaptiveSegment(pSrvrStmt);
pSrvrStmt->currentMethod = odbc_SQLSvc_PrepareRowset_ldx_;
pSrvrStmt->holdableCursor = holdableCursor;
rc = PREPARE2withRowsets(pSrvrStmt);
if (srvrGlobal->srvrType == CORE_SRVR && rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)
DeallocateAdaptiveSegment(pSrvrStmt);
switch (rc)
{
case ODBC_RG_WARNING:
case SQL_SHAPE_WARNING:
case SQL_SUCCESS_WITH_INFO:
*returnCode = SQL_SUCCESS_WITH_INFO;
*estimatedCost = (Int32)pSrvrStmt->cost_info.totalTime; // SQL returns cost in a strcuture - cost.totalTime == estimatedCost
if (pSrvrStmt->sqlBulkFetchPossible && pSrvrStmt->sqlQueryType == SQL_SELECT_NON_UNIQUE)
*sqlQueryType = 10000;
else
*sqlQueryType = pSrvrStmt->sqlQueryType;
*inputDescLength = pSrvrStmt->inputDescBufferLength;
inputDesc = pSrvrStmt->inputDescBuffer;
*outputDescLength = pSrvrStmt->outputDescBufferLength;
outputDesc = pSrvrStmt->outputDescBuffer;
if (rc == SQL_SUCCESS_WITH_INFO)
{
GETSQLWARNINGORERROR2(pSrvrStmt);
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
}
else if (rc == SQL_SHAPE_WARNING)
{
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
}
else
{
char RGWarningOrError[256];
sprintf(b,"%lf",pSrvrStmt->cost_info.totalTime);
sprintf(RGWarningOrError, "The query's estimated cost: %.50s exceeded resource management attribute limit set.", b);
GETMXCSWARNINGORERROR(1, "01000", RGWarningOrError, sqlWarningOrErrorLength, sqlWarningOrError);
}
break;
case SQL_SUCCESS:
*estimatedCost = (Int32)pSrvrStmt->cost_info.totalTime; // SQL returns cost in a strcuture - cost.totalTime == estimatedCost
if (pSrvrStmt->sqlBulkFetchPossible && pSrvrStmt->sqlQueryType == SQL_SELECT_NON_UNIQUE)
*sqlQueryType = 10000;
else
*sqlQueryType = pSrvrStmt->sqlQueryType;
*inputDescLength = pSrvrStmt->inputDescBufferLength;
inputDesc = pSrvrStmt->inputDescBuffer;
*outputDescLength = pSrvrStmt->outputDescBufferLength;
outputDesc = pSrvrStmt->outputDescBuffer;
break;
case SQL_ERROR:
case ODBC_RG_ERROR:
*returnCode = SQL_ERROR;
if (rc == SQL_ERROR)
{
GETSQLWARNINGORERROR2(pSrvrStmt);
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
}
else
{
char *RGWarningOrError;
RGWarningOrError = new char[256];
sprintf(b,"%lf",pSrvrStmt->cost_info.totalTime);
sprintf(RGWarningOrError, "The query's estimated cost: %.50s exceeded resource management attribute limit set.", b);
GETMXCSWARNINGORERROR(-1, "HY000", RGWarningOrError, sqlWarningOrErrorLength, sqlWarningOrError);
delete RGWarningOrError;
}
break;
case PROGRAM_ERROR:
GETMXCSWARNINGORERROR(-1, "HY000", SQLSVC_EXCEPTION_PREPARE_FAILED, sqlWarningOrErrorLength, sqlWarningOrError);
break;
default:
break;
}
}
// resource statistics
if (resStatStatement != NULL)
{
if (*returnCode == SQL_ERROR && pSrvrStmt != NULL && pSrvrStmt->sqlWarningOrError != NULL)
{
inErrorCode = *(Int32 *)(pSrvrStmt->sqlWarningOrError+8);
inErrorStatement ++;
inSqlError = (char*)pSrvrStmt->sqlWarningOrError + 16;
inSqlErrorLength =*(Int32 *)(pSrvrStmt->sqlWarningOrError + 12);
}
if (*returnCode == SQL_SUCCESS_WITH_INFO)
inWarningStatement ++;
if (sqlString == NULL)
sqlString = "";
inSqlString = new char[sqlStringLength];
if (inSqlString == NULL)
{
SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
srvrGlobal->srvrObjRef, 1, "inSqlString");
exit(0);
}
strncpy(inSqlString,sqlString,sqlStringLength);
if (pSrvrStmt != NULL)
{
inEstimatedCost = pSrvrStmt->cost_info.totalTime; // res stat reports estimated cost as double
inQueryId = pSrvrStmt->sqlUniqueQueryID;
inSqlQueryType = pSrvrStmt->sqlQueryType;
inSqlNewQueryType = pSrvrStmt->sqlNewQueryType;
}
resStatStatement->end(inState,
inSqlQueryType,
inSqlStmtType,
inQueryId,
inEstimatedCost,
inSqlString,
inErrorStatement,
inWarningStatement,
inRowCount,
inErrorCode,
resStatSession,
inSqlErrorLength,
inSqlError,
pSrvrStmt,
&flag_21036,
inSqlNewQueryType);
delete inSqlString;
}
//end rs
pSrvrStmt->m_need_21036_end_msg = flag_21036;
SRVRTRACE_EXIT(FILE_SME+18);
return;
} // end SQLSvc_Prepare2withRowsets_sme
/*
* Synchronous method function for
* operation 'odbc_SQLSvc_Execute2'
*/
extern "C" void
odbc_SQLSvc_Execute2_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def *call_id_
, /* In */ DIALOGUE_ID_def dialogueId
, /* In */ Int32 sqlAsyncEnable
, /* In */ Int32 queryTimeout
, /* In */ Int32 inputRowCnt
, /* In */ Int32 sqlStmtType
, /* In */ Long stmtHandle
, /* In */ Int32 cursorLength
, /* In */ IDL_string cursorName
, /* In */ Int32 cursorCharset
, /* In */ Int32 holdableCursor
, /* In */ Int32 inValuesLength
, /* In */ BYTE *inValues
, /* Out */ Int32 *returnCode
, /* Out */ Int32 *sqlWarningOrErrorLength
, /* Out */ BYTE *&sqlWarningOrError
, /* Out */ Int32 *rowsAffected
, /* Out */ Int32 *outValuesLength
, /* Out */ BYTE *&outValues)
{
SRVRTRACE_ENTER(FILE_SME+19);
bool bRePrepare2 = false;
SRVR_STMT_HDL *pSrvrStmt = NULL;
SQLRETURN rc = SQL_SUCCESS;
if ((pSrvrStmt = (SRVR_STMT_HDL *)stmtHandle) == NULL)
{
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY000", "Statement Label not found.", sqlWarningOrErrorLength, sqlWarningOrError);
}
else
{
if (pSrvrStmt->current_holdableCursor != holdableCursor)
{
rePrepare2( pSrvrStmt
, sqlStmtType
, inputRowCnt
, holdableCursor
, &rc
, returnCode
, sqlWarningOrErrorLength
, sqlWarningOrError
);
bRePrepare2 = true;
}
if (*returnCode == 0 || *returnCode == 1)
{
// resource statistics
// generate the actual start message after reprepare, if any.
if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
pSrvrStmt->inState = inState = STMTSTAT_EXECUTE;
inSqlStmtType = sqlStmtType;
inEstimatedCost = pSrvrStmt->cost_info.totalTime;
inQueryId = NULL;
inSqlString = NULL;
inErrorStatement = 0;
inWarningStatement = 0;
inRowCount = 0;
inErrorCode = 0;
inSqlError = NULL;
inSqlErrorLength = 0;
// For UPSERT statements force it as INSERT if the driver has sent a unknown type.
if( inSqlStmtType == TYPE_UNKNOWN && (pSrvrStmt->sqlQueryType == SQL_INSERT_UNIQUE || pSrvrStmt->sqlQueryType == SQL_INSERT_NON_UNIQUE) )
inSqlStmtType = TYPE_INSERT;
}
//end rs
if (inputRowCnt < 0)
{
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY000", "Invalid Row Count.", sqlWarningOrErrorLength, sqlWarningOrError);
}
else
{
if (sqlStmtType == TYPE_SELECT && inputRowCnt > 1)
{
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY000", "Invalid Row Count.", sqlWarningOrErrorLength, sqlWarningOrError);
}
}
if (*returnCode == 0 || *returnCode == 1)
{
if ((*returnCode == 0) && (pSrvrStmt->sqlWarningOrErrorLength > 0)) // To preserve warning returned at prepare time
{
if (pSrvrStmt->sqlWarningOrError != NULL)
delete pSrvrStmt->sqlWarningOrError;
pSrvrStmt->sqlWarningOrErrorLength = 0;
pSrvrStmt->sqlWarningOrError = NULL;
}
pSrvrStmt->inputRowCnt = inputRowCnt;
pSrvrStmt->sqlStmtType = (short)sqlStmtType;
if (cursorLength > 0)
{
pSrvrStmt->cursorNameLen = cursorLength;
memcpy(pSrvrStmt->cursorName, cursorName, cursorLength);
pSrvrStmt->cursorName[cursorLength] = '\0';
}
else
pSrvrStmt->cursorName[0] = '\0';
if (pSrvrStmt->sqlQueryType == SQL_RWRS_SPECIAL_INSERT)
{
//memcpy(pSrvrStmt->inputDescVarBuffer, (void *)&pSrvrStmt->inputRowCnt , sizeof(pSrvrStmt->inputRowCnt) );
//memcpy(pSrvrStmt->inputDescVarBuffer+4, (void *)&pSrvrStmt->maxRowLen, sizeof(pSrvrStmt->maxRowLen) );
*((Int32 *)pSrvrStmt->inputDescVarBuffer) = pSrvrStmt->inputRowCnt;
*((Int32 *)(pSrvrStmt->inputDescVarBuffer+4)) = pSrvrStmt->maxRowLen;
//*((Int32)pSrvrStmt->inputDescVarBuffer+8) = inValues ;
*((BYTE **)(pSrvrStmt->inputDescVarBuffer+8)) = inValues ;
}
else
{
if (pSrvrStmt->inputDescVarBufferLen == inValuesLength)
memcpy(pSrvrStmt->inputDescVarBuffer, inValues, inValuesLength);
else
{
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY090", "Invalid param Values.", sqlWarningOrErrorLength, sqlWarningOrError);
}
}
if (bRePrepare2)
{
rc = rePrepare2WouldLikeToExecute((Long)pSrvrStmt, (Int32*)returnCode, (Int32*)sqlWarningOrErrorLength, (char*&)sqlWarningOrError);
if (rc == false)
{
*rowsAffected = -1;
if ((resStatStatement != NULL) && (pSrvrStmt->stmtType == EXTERNAL_STMT))
{
// generate 21036 start message
resStatStatement->start(inState,
pSrvrStmt->sqlQueryType,
pSrvrStmt->stmtName,
pSrvrStmt,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg,
pSrvrStmt->sqlString);
}
goto out0;
}
}
if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
resStatStatement->start(inState,
pSrvrStmt->sqlQueryType,
pSrvrStmt->stmtName,
pSrvrStmt,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg,
pSrvrStmt->sqlString);
}
pSrvrStmt->currentMethod = odbc_SQLSvc_ExecuteN_ldx_;
rc = EXECUTE2(pSrvrStmt);
// char tmpString[32];
// tmpString[0] = '\0';
// sprintf(tmpString, "e: %Ld", pSrvrStmt->cliElapseTime);
// SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
// srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
// srvrGlobal->srvrObjRef, 1, tmpString);
switch (rc)
{
case SQL_SUCCESS_WITH_INFO:
*returnCode = SQL_SUCCESS_WITH_INFO;
*rowsAffected = pSrvrStmt->rowsAffected;
if ( pSrvrStmt->sqlQueryType == SQL_SELECT_UNIQUE
|| pSrvrStmt->sqlStmtType == TYPE_CALL)
{
*outValuesLength = pSrvrStmt->outputDescVarBufferLen;
outValues = pSrvrStmt->outputDescVarBuffer;
}
else
{
if (pSrvrStmt->sqlQueryType == SQL_RWRS_SPECIAL_INSERT)
{
if (inValues != NULL)
*pSrvrStmt->inputDescVarBuffer = NULL;
}
*outValuesLength = 0;
outValues = 0;
}
if (pSrvrStmt->sqlWarningOrErrorLength > 0) // overwriting warning returned at prepare time
{
if (pSrvrStmt->sqlWarningOrError != NULL)
delete pSrvrStmt->sqlWarningOrError;
pSrvrStmt->sqlWarningOrErrorLength = 0;
pSrvrStmt->sqlWarningOrError = NULL;
}
GETSQLWARNINGORERROR2(pSrvrStmt);
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
break;
case SQL_SUCCESS:
*returnCode = SQL_SUCCESS;
*rowsAffected = pSrvrStmt->rowsAffected;
if ( pSrvrStmt->sqlQueryType == SQL_SELECT_UNIQUE
|| pSrvrStmt->sqlStmtType == TYPE_CALL)
{
*outValuesLength = pSrvrStmt->outputDescVarBufferLen;
outValues = pSrvrStmt->outputDescVarBuffer;
}
else
{
if (pSrvrStmt->sqlQueryType == SQL_RWRS_SPECIAL_INSERT)
{
if (inValues != NULL)
*pSrvrStmt->inputDescVarBuffer = NULL;
}
*outValuesLength = 0;
outValues = 0;
}
break;
case SQL_NO_DATA_FOUND:
*returnCode = SQL_NO_DATA_FOUND;
break;
case SQL_INVALID_HANDLE:
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY000", "Invalid Statement Handle.", sqlWarningOrErrorLength, sqlWarningOrError);
break;
case SQL_ERROR:
if (pSrvrStmt->sqlWarningOrErrorLength > 0) // Overwriting warning returned at prepare time
{
if (pSrvrStmt->sqlWarningOrError != NULL)
delete pSrvrStmt->sqlWarningOrError;
pSrvrStmt->sqlWarningOrErrorLength = 0;
pSrvrStmt->sqlWarningOrError = NULL;
}
GETSQLWARNINGORERROR2(pSrvrStmt);
*returnCode = SQL_ERROR;
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
break;
default:
break;
}
if (resStatStatement != NULL)
{
// Should avoid collecting statistics for
// statement types that do not fetch until end of data or close the stmt
// during execute since it's causing issues in RMS.
if( pSrvrStmt->sqlQueryType != SQL_SELECT_NON_UNIQUE && pSrvrStmt->sqlQueryType != SQL_CALL_WITH_RESULT_SETS)
resStatStatement->setStatistics(pSrvrStmt);
}
}
out0:
// resource statistics
if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
if (*returnCode == SQL_ERROR && pSrvrStmt->sqlWarningOrError != NULL)
{
inErrorCode = *(Int32 *)(pSrvrStmt->sqlWarningOrError+8);
inErrorStatement ++;
inSqlError = (char*)pSrvrStmt->sqlWarningOrError + 16;
inSqlErrorLength =*(Int32 *)(pSrvrStmt->sqlWarningOrError + 12);
}
if (*returnCode == SQL_SUCCESS_WITH_INFO)
inWarningStatement ++;
if (pSrvrStmt->rowsAffectedHigherBytes != 0)
inRowCount = -1;
else
inRowCount = *rowsAffected;
inQueryId = pSrvrStmt->sqlUniqueQueryID;
inSqlQueryType = pSrvrStmt->sqlQueryType;
resStatStatement->end(inState,
inSqlQueryType,
inSqlStmtType,
inQueryId,
inEstimatedCost,
inSqlString,
inErrorStatement,
inWarningStatement,
inRowCount,
inErrorCode,
resStatSession,
inSqlErrorLength,
inSqlError,
pSrvrStmt,
&pSrvrStmt->m_need_21036_end_msg,
pSrvrStmt->sqlNewQueryType,
pSrvrStmt->isClosed);
}
//end rs
}
}
SRVRTRACE_EXIT(FILE_SME+19);
return;
}
//--------------------------------------------------------------------------------
/*
* Synchronous method function for
* operation 'odbc_SQLSvc_Execute2withRowsets'
*/
extern "C" void
odbc_SQLSvc_Execute2withRowsets_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def *call_id_
, /* In */ DIALOGUE_ID_def dialogueId
, /* In */ Int32 sqlAsyncEnable
, /* In */ Int32 queryTimeout
, /* In */ Int32 inputRowCnt
, /* In */ Int32 sqlStmtType
, /* In */ Long stmtHandle
, /* In */ Int32 cursorLength
, /* In */ IDL_string cursorName
, /* In */ Int32 cursorCharset
, /* In */ Int32 holdableCursor
, /* In */ Int32 inValuesLength
, /* In */ BYTE *inValues
, /* Out */ Int32 *returnCode
, /* Out */ Int32 *sqlWarningOrErrorLength
, /* Out */ BYTE *&sqlWarningOrError
, /* Out */ Int32 *rowsAffected
, /* Out */ Int32 *outValuesLength
, /* Out */ BYTE *&outValues)
{
SRVRTRACE_ENTER(FILE_SME+19);
bool bRePrepare2 = false;
/*
* The performance team wanted to be able to stub out the actual inserts
* to measure the contributions of individual components to the overall
* load times. If the env variable mxosrvr-stubout-EXECUTE2withRowsets
* is set in ms.env, we will skip over the call to EXECUTE2withRowsets
* and return sql_success, and rowsAffected = input row count
*/
static bool bCheckStubExecute2WithRowsets = true;
static bool bStubExecute2WithRowsets = false;
if(bCheckStubExecute2WithRowsets)
{
char *env = getenv("mxosrvr-stubout-EXECUTE2withRowsets");
if (env != NULL && strcmp(env,"true") == 0)
bStubExecute2WithRowsets = true;
bCheckStubExecute2WithRowsets = false;
}
SRVR_STMT_HDL *pSrvrStmt = NULL;
SQLRETURN rc = SQL_SUCCESS;
if ((pSrvrStmt = (SRVR_STMT_HDL *)stmtHandle) == NULL)
{
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY000", "Statement Label not found.", sqlWarningOrErrorLength, sqlWarningOrError);
}
else
{
*returnCode = SQL_SUCCESS;
if (inputRowCnt < 0)
{
}
else if (sqlStmtType == TYPE_SELECT && inputRowCnt > 1)
{
}
else if ((pSrvrStmt->maxRowsetSize < inputRowCnt) || (pSrvrStmt->current_holdableCursor != holdableCursor))
{
rePrepare2( pSrvrStmt
, sqlStmtType
, inputRowCnt
, holdableCursor
,&rc
, returnCode
, sqlWarningOrErrorLength
, sqlWarningOrError
);
bRePrepare2 = true;
}
if (*returnCode == 0 || *returnCode == 1)
{
// resource statistics
// generate the actual start message after reprepare, if any.
if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
pSrvrStmt->inState = inState = STMTSTAT_EXECUTE;
inSqlStmtType = sqlStmtType;
inEstimatedCost = pSrvrStmt->cost_info.totalTime;
inQueryId = NULL;
inSqlString = NULL;
inErrorStatement = 0;
inWarningStatement = 0;
inRowCount = 0;
inErrorCode = 0;
inSqlError = NULL;
inSqlErrorLength = 0;
}
//end rs
if (inputRowCnt < 0)
{
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY000", "Invalid Row Count.", sqlWarningOrErrorLength, sqlWarningOrError);
}
else
{
if (sqlStmtType == TYPE_SELECT && inputRowCnt > 1)
{
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY000", "Invalid Row Count.", sqlWarningOrErrorLength, sqlWarningOrError);
}
}
if (*returnCode == 0 || *returnCode == 1)
{
// Fix for CR 5763/6389 - added additional checks to make sure the warnings, if any, are not lost from the
// rePrepare2() call in SrvrConnect.cpp (returnCode could be 0).
if ((*returnCode == 0) && (pSrvrStmt->sqlWarningOrErrorLength > 0) && pSrvrStmt->reprepareWarn == FALSE) // To preserve warning returned at prepare time
{
if (pSrvrStmt->sqlWarningOrError != NULL)
delete pSrvrStmt->sqlWarningOrError;
pSrvrStmt->sqlWarningOrErrorLength = 0;
pSrvrStmt->sqlWarningOrError = NULL;
}
if (pSrvrStmt->bSQLMessageSet)
pSrvrStmt->cleanupSQLMessage();
if(pSrvrStmt->bSQLValueListSet)
pSrvrStmt->cleanupSQLValueList();
if ( (*returnCode == 0 && rc == 0) || (*returnCode == 1 && rc == 1) )
{
pSrvrStmt->inputRowCnt = inputRowCnt;
pSrvrStmt->sqlStmtType = (short)sqlStmtType;
if (cursorLength > 0)
{
pSrvrStmt->cursorNameLen = cursorLength;
memcpy(pSrvrStmt->cursorName, cursorName, cursorLength);
}
else
pSrvrStmt->cursorName[0] = '\0';
if (pSrvrStmt->preparedWithRowsets == TRUE)
{
pSrvrStmt->transportBuffer = inValues;
pSrvrStmt->transportBufferLen = inValuesLength;
}
else if (pSrvrStmt->inputDescVarBufferLen == inValuesLength)
memcpy(pSrvrStmt->inputDescVarBuffer, inValues, inValuesLength);
else
{
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR( -1
, "HY090"
, "Invalid param Values."
, sqlWarningOrErrorLength
, sqlWarningOrError
);
goto out;
}
if (bRePrepare2)
{
// Note: The below method ends in a dummy call in CommonNSKFunctions.cpp. CR 5763 takes care of this.
rc = rePrepare2WouldLikeToExecute((Long)pSrvrStmt, (Int32*)returnCode, (Int32*)sqlWarningOrErrorLength, (char*&)sqlWarningOrError);
if (rc == false)
{
*rowsAffected = -1;
if ((resStatStatement != NULL) && (pSrvrStmt->stmtType == EXTERNAL_STMT))
{
// generate 21036 start message
resStatStatement->start(inState,
pSrvrStmt->sqlQueryType,
pSrvrStmt->stmtName,
pSrvrStmt,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg,
pSrvrStmt->sqlString);
}
goto out;
}
}
// resource statistics
if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
resStatStatement->start(inState,
pSrvrStmt->sqlQueryType,
pSrvrStmt->stmtName,
pSrvrStmt,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg,
pSrvrStmt->sqlString);
}
//end rs
pSrvrStmt->currentMethod = odbc_SQLSvc_ExecuteN_ldx_;
if(!bStubExecute2WithRowsets)
rc = EXECUTE2withRowsets(pSrvrStmt);
else {
rc = SQL_SUCCESS;
pSrvrStmt->rowsAffected = inputRowCnt;
}
switch (rc)
{
case ROWSET_SQL_ERROR:
// Copy the output values
*rowsAffected = -1;
if (pSrvrStmt->sqlWarningOrErrorLength > 0) // Overwriting warning returned at prepare time
{
if (pSrvrStmt->sqlWarningOrError != NULL)
delete pSrvrStmt->sqlWarningOrError;
pSrvrStmt->sqlWarningOrErrorLength = 0;
pSrvrStmt->sqlWarningOrError = NULL;
}
GETSQLWARNINGORERROR2forRowsets(pSrvrStmt);
*returnCode = SQL_ERROR;
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
break;
case SQL_SUCCESS_WITH_INFO:
*returnCode = SQL_SUCCESS_WITH_INFO;
*rowsAffected = pSrvrStmt->rowsAffected;
if ( pSrvrStmt->sqlQueryType == SQL_SELECT_UNIQUE
|| pSrvrStmt->sqlStmtType == TYPE_CALL)
{
*outValuesLength = pSrvrStmt->outputDescVarBufferLen;
outValues = pSrvrStmt->outputDescVarBuffer;
}
else
{
*outValuesLength = 0;
outValues = 0;
}
if (pSrvrStmt->sqlWarningOrErrorLength > 0) // Overwriting warning returned at prepare time
{
if (pSrvrStmt->sqlWarningOrError != NULL)
delete pSrvrStmt->sqlWarningOrError;
pSrvrStmt->sqlWarningOrErrorLength = 0;
pSrvrStmt->sqlWarningOrError = NULL;
}
if (pSrvrStmt->sqlWarning._length > 0)
GETSQLWARNINGORERROR2forRowsets(pSrvrStmt);
else
GETSQLWARNINGORERROR2(pSrvrStmt);
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
break;
case SQL_SUCCESS:
*returnCode = SQL_SUCCESS;
*rowsAffected = pSrvrStmt->rowsAffected;
if (pSrvrStmt->sqlWarning._length > 0)
{
if (pSrvrStmt->sqlWarningOrErrorLength > 0) // Overwriting warning returned at prepare time
{
if (pSrvrStmt->sqlWarningOrError != NULL)
delete pSrvrStmt->sqlWarningOrError;
pSrvrStmt->sqlWarningOrErrorLength = 0;
pSrvrStmt->sqlWarningOrError = NULL;
}
GETSQLWARNINGORERROR2forRowsets(pSrvrStmt);
*returnCode = SQL_SUCCESS_WITH_INFO; // We have warnings so return success witn info.
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
}
if (pSrvrStmt->sqlQueryType == SQL_SELECT_UNIQUE
|| pSrvrStmt->sqlStmtType == TYPE_CALL)
{
*outValuesLength = pSrvrStmt->outputDescVarBufferLen;
outValues = pSrvrStmt->outputDescVarBuffer;
}
else
{
*outValuesLength = 0;
outValues = 0;
}
break;
case SQL_NO_DATA_FOUND:
*returnCode = SQL_NO_DATA_FOUND;
break;
case SQL_INVALID_HANDLE:
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY000", "Invalid Statement Handle.", sqlWarningOrErrorLength, sqlWarningOrError);
break;
case SQL_ERROR:
if (pSrvrStmt->sqlWarningOrErrorLength > 0) // Overwriting warning returned at prepare time
{
if (pSrvrStmt->sqlWarningOrError != NULL)
delete pSrvrStmt->sqlWarningOrError;
pSrvrStmt->sqlWarningOrErrorLength = 0;
pSrvrStmt->sqlWarningOrError = NULL;
}
GETSQLWARNINGORERROR2(pSrvrStmt);
*returnCode = SQL_ERROR;
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
break;
default:
break;
}
if (resStatStatement != NULL)
{
// We don't need a check here similar to odbc_SQLSvc_Execute2_sme_()
// since for rowsets we don't call
// WSQL_EXEC_Exec().
resStatStatement->setStatistics(pSrvrStmt);
}
//
// The following transaction check was taken from Zbig.
//
if ( sqlStmtType == TYPE_INSERT_PARAM
&& (srvrGlobal->EnvironmentType & MXO_ROWSET_ERROR_RECOVERY)
&& pSrvrStmt->NA_supported == false
&& srvrGlobal->bAutoCommitOn == true)
{
if (SQL_EXEC_Xact(SQLTRANS_STATUS,NULL) == 0)
{
// transaction is running - do commit/rollback
SQLValueList_def inValueList;
inValueList._buffer = NULL;
inValueList._length = 0;
if (rc == ROWSET_SQL_ERROR)
{
SRVR_STMT_HDL *RbwSrvrStmt = getSrvrStmt("STMT_ROLLBACK_1", FALSE);
RbwSrvrStmt->Execute(NULL,1,TYPE_UNKNOWN,&inValueList,SQL_ASYNC_ENABLE_OFF,0);
}
else
{
SRVR_STMT_HDL *CmwSrvrStmt = getSrvrStmt("STMT_COMMIT_1", FALSE);
CmwSrvrStmt->Execute(NULL,1,TYPE_UNKNOWN,&inValueList,SQL_ASYNC_ENABLE_OFF,0);
}
}
}
}
} // end if (*returnCode == 0 && rc == 0)
// resource statistics
out:
if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
if (*returnCode == SQL_ERROR && pSrvrStmt->sqlWarningOrError != NULL)
{
inErrorCode = *(Int32 *)(pSrvrStmt->sqlWarningOrError+8);
inErrorStatement ++;
inSqlError = (char*)pSrvrStmt->sqlWarningOrError + 16;
inSqlErrorLength =*(Int32 *)(pSrvrStmt->sqlWarningOrError + 12);
}
if (*returnCode == SQL_SUCCESS_WITH_INFO)
inWarningStatement ++;
if (pSrvrStmt->rowsAffectedHigherBytes != 0)
inRowCount = -1;
else
inRowCount = *rowsAffected;
inQueryId = pSrvrStmt->sqlUniqueQueryID;
inSqlQueryType = pSrvrStmt->sqlQueryType;
resStatStatement->end(inState,
inSqlQueryType,
inSqlStmtType,
inQueryId,
inEstimatedCost,
inSqlString,
inErrorStatement,
inWarningStatement,
inRowCount,
inErrorCode,
resStatSession,
inSqlErrorLength,
inSqlError,
pSrvrStmt,
&pSrvrStmt->m_need_21036_end_msg,
pSrvrStmt->sqlNewQueryType,
pSrvrStmt->isClosed);
}
}
} // end else
outout:
pSrvrStmt->returnCodeForDelayedError = *returnCode;
SRVRTRACE_EXIT(FILE_SME+19);
return;
} // end odbc_SQLSvc_Execute2withRowsets_sme_
//------------------------------------------------------------------------------
extern "C" void
rePrepare2( SRVR_STMT_HDL *pSrvrStmt
, Int32 sqlStmtType
, Int32 inputRowCnt
, Int32 holdableCursor
, SQLRETURN *rc
, Int32 *returnCode
, Int32 *sqlWarningOrErrorLength
, BYTE *&sqlWarningOrError
)
{
UInt32 tmpSqlStringLen = pSrvrStmt->sqlStringLen;
char *tmpSqlString;
short tmpStmtType = pSrvrStmt->stmtType;
short tmpSqlStmtType = sqlStmtType; // need to do this since PREPARE does not pass this from driver
Int32 tmpMaxRowsetSize = pSrvrStmt->maxRowsetSize;
Int32 sqlQueryType;
Int32 estimatedCost;
if (pSrvrStmt->sqlWarningOrErrorLength > 0) // To preserve warning returned at prepare time
{
if (pSrvrStmt->sqlWarningOrError != NULL)
delete pSrvrStmt->sqlWarningOrError;
pSrvrStmt->sqlWarningOrErrorLength = 0;
pSrvrStmt->sqlWarningOrError = NULL;
}
if (pSrvrStmt->bSQLMessageSet)
pSrvrStmt->cleanupSQLMessage();
if(pSrvrStmt->bSQLValueListSet)
pSrvrStmt->cleanupSQLValueList();
tmpSqlString = new char[tmpSqlStringLen+1];
if (tmpSqlString == NULL)
{
SendEventMsg( MSG_MEMORY_ALLOCATION_ERROR
, EVENTLOG_ERROR_TYPE
, srvrGlobal->nskProcessInfo.processId
, ODBCMX_SERVER
, srvrGlobal->srvrObjRef
, 1
, "Execute2"
);
exit(0);
}
strcpy(tmpSqlString, pSrvrStmt->sqlString);
// cleanup all memory allocated in the previous operations
pSrvrStmt->cleanupAll();
pSrvrStmt->sqlStringLen = tmpSqlStringLen;
pSrvrStmt->sqlString = new char[pSrvrStmt->sqlStringLen+1];
if (pSrvrStmt->sqlString == NULL)
{
SendEventMsg( MSG_MEMORY_ALLOCATION_ERROR
, EVENTLOG_ERROR_TYPE
, srvrGlobal->nskProcessInfo.processId
, ODBCMX_SERVER
, srvrGlobal->srvrObjRef
, 1
, "Execute2"
);
exit(0);
}
strcpy(pSrvrStmt->sqlString, tmpSqlString);
pSrvrStmt->stmtType = tmpStmtType;
pSrvrStmt->sqlStmtType = tmpSqlStmtType;
pSrvrStmt->maxRowsetSize = inputRowCnt;
pSrvrStmt->holdableCursor= holdableCursor;
if (pSrvrStmt->maxRowsetSize == ROWSET_NOT_DEFINED)
pSrvrStmt->maxRowsetSize = DEFAULT_ROWSET_SIZE;
// resource statistics
if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
pSrvrStmt->inState = inState = STMTSTAT_PREPARE;
inSqlStmtType = TYPE_UNKNOWN;
inEstimatedCost = 0;
inQueryId = NULL;
inSqlString = NULL;
inErrorStatement = 0;
inWarningStatement = 0;
inRowCount = 0;
inErrorCode = 0;
inSqlQueryType = SQL_UNKNOWN;
inSqlNewQueryType = SQL_UNKNOWN;
inSqlError = NULL;
inSqlErrorLength = 0;
/*resStatStatement->start(inState,
inSqlQueryType,
pSrvrStmt->stmtName,
NULL,
pSrvrStmt->cost_info,
pSrvrStmt->comp_stats_info,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg,
false,
tmpSqlString);*/
resStatStatement->start(inState,
inSqlQueryType,
pSrvrStmt->stmtName,
pSrvrStmt,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg,
tmpSqlString);
}
*rc = REALLOCSQLMXHDLS(pSrvrStmt); // This is a workaround for executor when we switch between OLTP vs NON-OLTP
if (*rc < 0)
{
GETSQLWARNINGORERROR2(pSrvrStmt);
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
goto out;
}
if (pSrvrStmt->sqlStmtType == TYPE_INSERT_PARAM)
{
if (srvrGlobal->EnvironmentType & MXO_ROWSET_ERROR_RECOVERY)
*rc = WSQL_EXEC_SetStmtAttr(&pSrvrStmt->stmt, SQL_ATTR_ROWSET_ATOMICITY, SQL_NOT_ATOMIC,0);
else
*rc = WSQL_EXEC_SetStmtAttr(&pSrvrStmt->stmt, SQL_ATTR_ROWSET_ATOMICITY, SQL_ATOMIC, 0);
if (*rc < 0)
{
GETSQLWARNINGORERROR2(pSrvrStmt);
goto out;
}
WSQL_EXEC_ClearDiagnostics(&pSrvrStmt->stmt);
}
if (srvrGlobal->srvrType == CORE_SRVR)
AllocateAdaptiveSegment(pSrvrStmt);
pSrvrStmt->currentMethod = odbc_SQLSvc_PrepareRowset_ldx_; // KAS - bug. This should be Prepare2.
if(pSrvrStmt->maxRowsetSize > 1)
*rc = PREPARE2withRowsets(pSrvrStmt);
else
*rc = PREPARE2(pSrvrStmt);
if (srvrGlobal->srvrType == CORE_SRVR && *rc != SQL_SUCCESS && *rc != SQL_SUCCESS_WITH_INFO)
DeallocateAdaptiveSegment(pSrvrStmt);
switch (*rc)
{
case ODBC_RG_WARNING:
case SQL_SUCCESS_WITH_INFO:
*returnCode = SQL_SUCCESS_WITH_INFO;
estimatedCost = (Int32)pSrvrStmt->cost_info.totalTime; // change to double in future
sqlQueryType = pSrvrStmt->sqlQueryType;
if (*rc == SQL_SUCCESS_WITH_INFO)
{
GETSQLWARNINGORERROR2(pSrvrStmt);
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
}
else
{
char RGWarningOrError[256];
sprintf(b,"%lf",pSrvrStmt->cost_info.totalTime);
sprintf( RGWarningOrError
, "The query's estimated cost: %.50s exceeded resource management attribute limit set."
, b
);
GETMXCSWARNINGORERROR(1, "01000", RGWarningOrError, sqlWarningOrErrorLength, sqlWarningOrError);
}
break;
case SQL_SUCCESS:
WSQL_EXEC_ClearDiagnostics(&pSrvrStmt->stmt);
estimatedCost = (Int32)pSrvrStmt->cost_info.totalTime; // change to double in future
sqlQueryType = pSrvrStmt->sqlQueryType;
break;
case SQL_ERROR:
case ODBC_RG_ERROR:
*returnCode = SQL_ERROR;
if (*rc == SQL_ERROR)
{
GETSQLWARNINGORERROR2(pSrvrStmt);
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
}
else
{
char *RGWarningOrError;
RGWarningOrError = new char[256];
sprintf(b,"%lf",pSrvrStmt->cost_info.totalTime);
sprintf( RGWarningOrError
, "The query's estimated cost: %.50s exceeded resource management attribute limit set."
, b
);
GETMXCSWARNINGORERROR( -1
, "HY000"
, RGWarningOrError
, sqlWarningOrErrorLength
, sqlWarningOrError
);
delete RGWarningOrError;
}
break;
case PROGRAM_ERROR:
GETMXCSWARNINGORERROR( -1
, "HY000"
, SQLSVC_EXCEPTION_PREPARE_FAILED
, sqlWarningOrErrorLength
, sqlWarningOrError
);
break;
default:
break;
} // end switch
out:
// resource statistics
if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
if (*returnCode == SQL_ERROR && pSrvrStmt != NULL && pSrvrStmt->sqlWarningOrError != NULL)
{
inErrorCode = *(Int32 *)(pSrvrStmt->sqlWarningOrError+8);
inErrorStatement ++;
inSqlError = (char*)pSrvrStmt->sqlWarningOrError + 16;
inSqlErrorLength =*(Int32 *)(pSrvrStmt->sqlWarningOrError + 12);
}
if (*returnCode == SQL_SUCCESS_WITH_INFO)
inWarningStatement ++;
if (tmpSqlString == NULL)
tmpSqlString = "";
inSqlString = new char[pSrvrStmt->sqlStringLen];
if (inSqlString == NULL)
{
SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
srvrGlobal->srvrObjRef, 1, "inSqlString");
exit(0);
}
strncpy(inSqlString,tmpSqlString,pSrvrStmt->sqlStringLen);
if (pSrvrStmt != NULL)
{
inEstimatedCost = pSrvrStmt->cost_info.totalTime; // res stat reports estimated cost as double
inQueryId = pSrvrStmt->sqlUniqueQueryID;
inSqlQueryType = pSrvrStmt->sqlQueryType;
inSqlNewQueryType = pSrvrStmt->sqlNewQueryType;
}
resStatStatement->end(inState,
inSqlQueryType,
inSqlStmtType,
inQueryId,
inEstimatedCost,
inSqlString,
inErrorStatement,
inWarningStatement,
inRowCount,
inErrorCode,
resStatSession,
inSqlErrorLength,
inSqlError,
pSrvrStmt,
&pSrvrStmt->m_need_21036_end_msg,
inSqlNewQueryType);
delete inSqlString;
delete tmpSqlString;
}
//end rs
} // end rePrepare2
//------------------------------------------------------------------------------
//LCOV_EXCL_START
/*
* Synchronous method function for
* operation 'odbc_SQLSvc_Fetch2'
*/
extern "C" void
odbc_SQLSvc_Fetch2_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def *call_id_
, /* In */ DIALOGUE_ID_def dialogueId
, /* In */ Int32 sqlAsyncEnable
, /* In */ Int32 queryTimeout
, /* In */ Long stmtHandle
, /* In */ Int32 maxRowCnt
, /* In */ Int32 cursorLength
, /* In */ IDL_string cursorName
, /* In */ Int32 cursorCharset
, /* Out */ Int32 *returnCode
, /* Out */ Int32 *sqlWarningOrErrorLength
, /* Out */ BYTE *&sqlWarningOrError
, /* Out */ Int32 *rowsAffected
, /* Out */ Int32 *outValuesFormat
, /* Out */ Int32 *outValuesLength
, /* Out */ BYTE *&outValues)
{
SRVRTRACE_ENTER(FILE_SME+20);
SRVR_STMT_HDL *pSrvrStmt;
SQLRETURN rc = SQL_SUCCESS;
if ((pSrvrStmt = (SRVR_STMT_HDL *)stmtHandle) == NULL)
{
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY000", "Statement Label not found.", sqlWarningOrErrorLength, sqlWarningOrError);
}
else if (maxRowCnt < 0)
{
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY000", "Max row count < 0.", sqlWarningOrErrorLength, sqlWarningOrError);
}
else if (pSrvrStmt->isClosed)
*returnCode = SQL_NO_DATA_FOUND;
else
{
pSrvrStmt->maxRowCnt = maxRowCnt;
// resource statistics
if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
pSrvrStmt->inState = inState = STMTSTAT_FETCH;
inSqlStmtType = TYPE_UNKNOWN;
inEstimatedCost = 0;
inQueryId = NULL;
inSqlString = NULL;
inErrorStatement = 0;
inWarningStatement = 0;
inRowCount = 0;
inErrorCode = 0;
inSqlError = NULL;
inSqlErrorLength = 0;
/* resStatStatement->start(inState,
pSrvrStmt->sqlQueryType,
pSrvrStmt->stmtName,
pSrvrStmt->sqlUniqueQueryID,
pSrvrStmt->cost_info,
pSrvrStmt->comp_stats_info,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg);*/
resStatStatement->start(inState,
pSrvrStmt->sqlQueryType,
pSrvrStmt->stmtName,
pSrvrStmt,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg);
} // end if resource statistics
if (pSrvrStmt->sqlWarningOrErrorLength > 0)
{
if (pSrvrStmt->sqlWarningOrError != NULL)
delete pSrvrStmt->sqlWarningOrError;
pSrvrStmt->sqlWarningOrErrorLength = 0;
pSrvrStmt->sqlWarningOrError = NULL;
}
if (cursorLength > 0)
{
pSrvrStmt->cursorNameLen = cursorLength;
memcpy(pSrvrStmt->cursorName, cursorName, cursorLength);
}
else
pSrvrStmt->cursorName[0] = '\0';
pSrvrStmt->currentMethod = odbc_SQLSvc_FetchPerf_ldx_; // KAS - bug. Should be Fetch2
//
// We will either use fetch bulk (also known as fetch "row wise rowsets") or fetch rowsets
// (also known as fetch "column wise rowsets").
//
if (pSrvrStmt->sqlBulkFetchPossible && pSrvrStmt->sqlQueryType == SQL_SELECT_NON_UNIQUE)
{
if (pSrvrStmt->outputDataValue._buffer != NULL)
delete pSrvrStmt->outputDataValue._buffer;
pSrvrStmt->outputDataValue._buffer = NULL;
pSrvrStmt->outputDataValue._length = 0;
rc = FETCH2bulk(pSrvrStmt);
*outValuesFormat = ROWWISE_ROWSETS;
if (pSrvrStmt->rowsAffected > 0)
{
if (pSrvrStmt->outputDataValue._length == 0 && pSrvrStmt->outputDataValue._buffer == NULL)
{
outValues = pSrvrStmt->outputDescVarBuffer;
*outValuesLength = (Int32)(pSrvrStmt->outputDescVarBufferLen * pSrvrStmt->rowsAffected);
}
else
{
outValues = pSrvrStmt->outputDataValue._buffer;
*outValuesLength = (Int32)(pSrvrStmt->outputDataValue._length);
}
}
else
{
outValues = NULL;
*outValuesLength = 0;
}
}
else
rc = FETCH2(pSrvrStmt, outValuesFormat, outValuesLength, outValues);
switch (rc)
{
case SQL_SUCCESS_WITH_INFO:
*returnCode = SQL_SUCCESS_WITH_INFO;
*rowsAffected = pSrvrStmt->rowsAffected;
GETSQLWARNINGORERROR2(pSrvrStmt);
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
break;
case SQL_SUCCESS:
*returnCode = SQL_SUCCESS;
*rowsAffected = pSrvrStmt->rowsAffected;
break;
case SQL_NO_DATA_FOUND:
*returnCode = SQL_NO_DATA_FOUND;
break;
case SQL_INVALID_HANDLE:
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY000", "Invalid Statement Handle.", sqlWarningOrErrorLength, sqlWarningOrError);
break;
case SQL_ERROR:
GETSQLWARNINGORERROR2(pSrvrStmt);
*returnCode = SQL_ERROR;
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
break;
default:
break;
} // end switch
if (resStatStatement != NULL && (rc == SQL_NO_DATA_FOUND || (rc == SQL_SUCCESS && *rowsAffected < maxRowCnt)))
{
resStatStatement->setStatistics(pSrvrStmt);
}
// resource statistics
if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
if (*returnCode == SQL_ERROR && pSrvrStmt->sqlWarningOrError != NULL)
{
inErrorCode = *(Int32 *)(pSrvrStmt->sqlWarningOrError+8);
inErrorStatement ++;
inSqlError = (char*)pSrvrStmt->sqlWarningOrError + 16;
inSqlErrorLength =*(Int32 *)(pSrvrStmt->sqlWarningOrError + 12);
}
if (*returnCode == SQL_SUCCESS_WITH_INFO)
inWarningStatement ++;
inRowCount = *rowsAffected;
inQueryId = pSrvrStmt->sqlUniqueQueryID;
inSqlQueryType = pSrvrStmt->sqlQueryType;
resStatStatement->end(inState,
inSqlQueryType,
inSqlStmtType,
inQueryId,
inEstimatedCost,
inSqlString,
inErrorStatement,
inWarningStatement,
inRowCount,
inErrorCode,
resStatSession,
inSqlErrorLength,
inSqlError,
pSrvrStmt,
&pSrvrStmt->m_need_21036_end_msg,
pSrvrStmt->sqlNewQueryType,
pSrvrStmt->isClosed);
} // end resStatStatement != NULL
} // end if ((pSrvrStmt = (SRVR_STMT_HDL *)stmtHandle) == NULL) else
SRVRTRACE_EXIT(FILE_SME+20);
return;
} // end odbc_SQLSvc_Fetch2_sme_
//LCOV_EXCL_STOP
/*
* Synchronous method function for
* operation 'odbc_SQLSvc_Close'
*/
extern "C" void
odbc_SQLSvc_Close_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def *call_id_
, /* Out */ odbc_SQLSvc_Close_exc_ *exception_
, /* In */ DIALOGUE_ID_def dialogueId
, /* In */ const IDL_char *stmtLabel
, /* In */ IDL_unsigned_short freeResourceOpt
, /* Out */ Int32 *rowsAffected
, /* Out */ ERROR_DESC_LIST_def *sqlWarning
)
{
SRVRTRACE_ENTER(FILE_SME+3);
SRVR_STMT_HDL *pSrvrStmt = NULL;
SQLRETURN rc = SQL_SUCCESS;
if (freeResourceOpt != SQL_CLOSE && freeResourceOpt != SQL_DROP &&
freeResourceOpt != SQL_UNBIND && freeResourceOpt != SQL_RESET_PARAMS)
{
exception_->exception_nr = odbc_SQLSvc_Close_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_RESOURCE_OPT_CLOSE;
}
else
{
if ((pSrvrStmt = getSrvrStmt(stmtLabel, FALSE)) == NULL)
goto ret; // Statement was never allocated.
if (freeResourceOpt == SQL_CLOSE && pSrvrStmt->isClosed)
goto ret;
}
if (exception_->exception_nr == 0)
{
// resource statistics
if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
pSrvrStmt->inState = inState = STMTSTAT_CLOSE;
inSqlStmtType = TYPE_UNKNOWN;
inEstimatedCost = 0;
inQueryId = NULL;
inSqlString = NULL;
inErrorStatement = 0;
inWarningStatement = 0;
inRowCount = 0;
inErrorCode = 0;
inSqlError = NULL;
inSqlErrorLength = 0;
/*resStatStatement->start(inState,
pSrvrStmt->sqlQueryType,
stmtLabel,
pSrvrStmt->sqlUniqueQueryID,
pSrvrStmt->cost_info,
pSrvrStmt->comp_stats_info,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg);*/
resStatStatement->start(inState,
pSrvrStmt->sqlQueryType,
stmtLabel,
pSrvrStmt,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg);
// if SQLClose is called after SQLExecute/SQLExecdirect of select stmt,
// END:SQLFetch/END:QueryExecution still needs to be generated
// if (pSrvrStmt->isClosed == FALSE) pSrvrStmt->bFetchStarted = TRUE;
if (pSrvrStmt->isClosed == FALSE)
{
pSrvrStmt->bFetchStarted = FALSE;
if (exception_->exception_nr != 0 && exception_->u.SQLError.errorList._buffer != NULL)
{
inErrorStatement ++;
ERROR_DESC_def *p_buffer = exception_->u.SQLError.errorList._buffer;
inErrorCode = p_buffer->sqlcode;
inSqlError = p_buffer->errorText;
inSqlErrorLength = strlen(p_buffer->errorText);
}
inQueryId=pSrvrStmt->sqlUniqueQueryID;
inSqlQueryType = pSrvrStmt->sqlQueryType;
resStatStatement->end(inState,
inSqlQueryType,
inSqlStmtType,
inQueryId,
inEstimatedCost,
inSqlString,
inErrorStatement,
inWarningStatement,
inRowCount,
inErrorCode,
resStatSession,
inSqlErrorLength,
inSqlError,
pSrvrStmt,
&pSrvrStmt->m_need_21036_end_msg,
pSrvrStmt->sqlNewQueryType,
pSrvrStmt->isClosed);
}
}
//end rs
rc = SQL_SUCCESS;
if (pSrvrStmt->stmtType != INTERNAL_STMT)
{
if (pSrvrStmt->bSQLMessageSet)
pSrvrStmt->cleanupSQLMessage();
if(pSrvrStmt->bSQLValueListSet)
pSrvrStmt->cleanupSQLValueList();
pSrvrStmt->freeResourceOpt = freeResourceOpt;
pSrvrStmt->currentMethod = odbc_SQLSvc_Close_ldx_;
if (pSrvrStmt->sqlQueryType == SQL_SP_RESULT_SET)
{
// The result set can not be re-used, so remove it completely.
freeResourceOpt = SQL_DROP;
pSrvrStmt->freeResourceOpt = freeResourceOpt;
delete [] pSrvrStmt->SpjProxySyntaxString;
pSrvrStmt->SpjProxySyntaxString = NULL;
pSrvrStmt->SpjProxySyntaxStringLen = 0;
// remove the result set from the call statement
SRVR_STMT_HDL *prev = pSrvrStmt->previousSpjRs;
SRVR_STMT_HDL *next = pSrvrStmt->nextSpjRs;
prev->nextSpjRs = next;
if (next != NULL)
next->previousSpjRs = prev;
// If prev is the call statement itself, and the call statement has no more
// result sets, then close the call statement.
if (prev->sqlQueryType == SQL_CALL_WITH_RESULT_SETS && prev->nextSpjRs == NULL)
rc = FREESTATEMENT(prev);
}
rc = FREESTATEMENT(pSrvrStmt);
// Return back immediately since the pSrvrStmt is deleted and return SQL_SUCCESS always
if (freeResourceOpt == SQL_DROP)
{
rc = SQL_SUCCESS;
}
else
{
switch (rc)
{
case SQL_SUCCESS:
break;
case SQL_SUCCESS_WITH_INFO:
GETSQLWARNING(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlWarning);
break;
case SQL_ERROR:
GETSQLERROR(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError);
break;
case ODBC_RG_WARNING:
// if there is RG_WARNING, we don't pass SQL Warning to the application
// Hence, we need to clear any warnings
// call SQL_EXEC_ClearDiagnostics
// CLEARDIAGNOSTICS(pSrvrStmt);
rc = SQL_SUCCESS_WITH_INFO;
case ODBC_SERVER_ERROR:
case ODBC_RG_ERROR:
default:
break;
}
}
}
switch (rc)
{
case SQL_SUCCESS:
case SQL_SUCCESS_WITH_INFO:
exception_->exception_nr = 0;
if (freeResourceOpt != SQL_DROP)
{
*rowsAffected = pSrvrStmt->rowsAffected;
sqlWarning->_length = pSrvrStmt->sqlWarning._length;
sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
}
else
{
*rowsAffected = 0;
sqlWarning->_length = 0;
sqlWarning->_buffer = NULL;
}
break;
case SQL_ERROR:
exception_->exception_nr = odbc_SQLSvc_Close_SQLError_exn_;
exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
break;
case PROGRAM_ERROR:
exception_->exception_nr = odbc_SQLSvc_Close_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_CLOSE_FAILED;
default:
break;
}
}
ret:
/* This code is moved to the begining of this method since pSrvrStmt is deleted in case of a
SQL_DROP.
// resource statistics
if (resStatStatement != NULL && pSrvrStmt != NULL && pSrvrStmt->isClosed == TRUE && pSrvrStmt->bFetchStarted == TRUE && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
pSrvrStmt->bFetchStarted = FALSE;
if (exception_->exception_nr != 0 && exception_->u.SQLError.errorList._buffer != NULL)
{
inErrorStatement ++;
inErrorCode = exception_->u.SQLError.errorList._buffer->sqlcode;
}
inQueryId=pSrvrStmt->sqlUniqueQueryID;
inSqlQueryType = pSrvrStmt->sqlQueryType;
resStatStatement->end(inState,inSqlQueryType,inSqlStmtType,inQueryId,inEstimatedCost,inSqlString,inErrorStatement,inWarningStatement,inRowCount,inErrorCode,resStatSession,pSrvrStmt->isClosed);
}
*/
SRVRTRACE_EXIT(FILE_SME+3);
return;
}
//------------------------------------------------------------------------------
/*
* Synchronous method function for
* operation 'odbc_SQLSvc_Close'
*/
extern "C" void
odbc_SQLSrvr_Close_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def *call_id_
, /* In */ DIALOGUE_ID_def dialogueId
, /* In */ const IDL_char *stmtLabel
, /* In */ IDL_unsigned_short freeResourceOpt
, /* Out */ Int32 *rowsAffected
, /* Out */ Int32 *returnCode
, /* Out */ Int32 *sqlWarningOrErrorLength
, /* Out */ BYTE *&sqlWarningOrError
)
{
SRVRTRACE_ENTER(FILE_SME+3);
SRVR_STMT_HDL *pSrvrStmt = NULL;
SQLRETURN rc = SQL_SUCCESS;
if (freeResourceOpt != SQL_CLOSE && freeResourceOpt != SQL_DROP &&
freeResourceOpt != SQL_UNBIND && freeResourceOpt != SQL_RESET_PARAMS)
{
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY000", SQLSVC_EXCEPTION_INVALID_RESOURCE_OPT_CLOSE, sqlWarningOrErrorLength, sqlWarningOrError);
}
else
{
pSrvrStmt = getSrvrStmt(stmtLabel, FALSE);
if(pSrvrStmt == NULL)
goto ret; // Statement was never allocated.
else
{
if (pSrvrStmt->sqlWarningOrErrorLength > 0 &&
pSrvrStmt->sqlWarningOrError != NULL)
{
delete pSrvrStmt->sqlWarningOrError;
}
pSrvrStmt->sqlWarningOrErrorLength = 0;
pSrvrStmt->sqlWarningOrError = NULL;
}
if (freeResourceOpt == SQL_CLOSE && pSrvrStmt->isClosed)
goto ret;
}
if (*returnCode == SQL_SUCCESS)
{
// resource statistics
if (resStatStatement != NULL && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
pSrvrStmt->inState = inState = STMTSTAT_CLOSE;
pSrvrStmt->m_bqueryFinish = true;
inSqlStmtType = TYPE_UNKNOWN;
inEstimatedCost = 0;
inQueryId = NULL;
inSqlString = NULL;
inErrorStatement = 0;
inWarningStatement = 0;
inRowCount = 0;
inErrorCode = 0;
inSqlError = NULL;
inSqlErrorLength = 0;
/*resStatStatement->start(inState,
pSrvrStmt->sqlQueryType,
stmtLabel,
pSrvrStmt->sqlUniqueQueryID,
pSrvrStmt->cost_info,
pSrvrStmt->comp_stats_info,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg);*/
resStatStatement->start(inState,
pSrvrStmt->sqlQueryType,
stmtLabel,
pSrvrStmt,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg);
if (pSrvrStmt->isClosed == FALSE)
{
pSrvrStmt->bFetchStarted = FALSE;
if (*returnCode == SQL_ERROR && pSrvrStmt != NULL && pSrvrStmt->sqlWarningOrError != NULL)
{
inErrorStatement ++;
inErrorCode = *(Int32 *)(pSrvrStmt->sqlWarningOrError+8);
inSqlError = (char*)pSrvrStmt->sqlWarningOrError + 16;
inSqlErrorLength =*(Int32 *)(pSrvrStmt->sqlWarningOrError + 12);
}
inQueryId=pSrvrStmt->sqlUniqueQueryID;
inSqlQueryType = pSrvrStmt->sqlQueryType;
if (pSrvrStmt->m_need_21036_end_msg)
{
resStatStatement->end(inState,
inSqlQueryType,
inSqlStmtType,
inQueryId,
inEstimatedCost,
inSqlString,
inErrorStatement,
inWarningStatement,
inRowCount,
inErrorCode,
resStatSession,
inSqlErrorLength,
inSqlError,
pSrvrStmt,
&pSrvrStmt->m_need_21036_end_msg,
pSrvrStmt->sqlNewQueryType,
pSrvrStmt->isClosed);
}
}
}
//end rs
qrysrvcExecuteFinished(NULL, (Long)pSrvrStmt, false, *returnCode, false, false, true);
if ((resStatStatement != NULL) && (pSrvrStmt->stmtType == EXTERNAL_STMT)) // if statement is on
{
resStatStatement->endRepository(pSrvrStmt,
inSqlErrorLength,
(BYTE*)inSqlError,
true);
}
rc = SQL_SUCCESS;
if (pSrvrStmt->stmtType != INTERNAL_STMT)
{
if (pSrvrStmt->bSQLMessageSet)
pSrvrStmt->cleanupSQLMessage();
if(pSrvrStmt->bSQLValueListSet)
pSrvrStmt->cleanupSQLValueList();
pSrvrStmt->freeResourceOpt = freeResourceOpt;
pSrvrStmt->currentMethod = odbc_SQLSvc_Close_ldx_;
if (pSrvrStmt->sqlQueryType == SQL_SP_RESULT_SET)
{
// The result set can not be re-used, so remove it completely.
freeResourceOpt = SQL_DROP;
pSrvrStmt->freeResourceOpt = freeResourceOpt;
// Added deletion of proxy syntax
delete [] pSrvrStmt->SpjProxySyntaxString;
pSrvrStmt->SpjProxySyntaxString = NULL;
pSrvrStmt->SpjProxySyntaxStringLen = 0;
// remove the result set from the call statement
SRVR_STMT_HDL *prev = pSrvrStmt->previousSpjRs;
SRVR_STMT_HDL *next = pSrvrStmt->nextSpjRs;
prev->nextSpjRs = next;
if (next != NULL)
next->previousSpjRs = prev;
// If prev is the call statement itself, and the call statement has no more
// result sets, then close the call statement.
if (prev->sqlQueryType == SQL_CALL_WITH_RESULT_SETS && prev->nextSpjRs == NULL)
rc = FREESTATEMENT(prev);
}
rc = FREESTATEMENT(pSrvrStmt);
// Return back immediately since the pSrvrStmt is deleted and return SQL_SUCCESS always
if (freeResourceOpt == SQL_DROP)
{
rc = SQL_SUCCESS;
}
else
{
if(rc == SQL_SUCCESS_WITH_INFO ||
rc == SQL_ERROR )
{
GETSQLWARNINGORERROR2(pSrvrStmt);
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
}
}
}
switch (rc)
{
case SQL_SUCCESS:
*returnCode = SQL_SUCCESS;
if (freeResourceOpt != SQL_DROP)
*rowsAffected = pSrvrStmt->rowsAffected;
else
*rowsAffected = 0;
break;
case SQL_SUCCESS_WITH_INFO:
*returnCode = SQL_SUCCESS_WITH_INFO;
if (freeResourceOpt != SQL_DROP)
*rowsAffected = pSrvrStmt->rowsAffected;
else
*rowsAffected = 0;
break;
case SQL_ERROR:
*returnCode = SQL_ERROR;
break;
default:
break;
}
}
ret:
/* This code is moved to the begining of this method since pSrvrStmt is deleted in case of a
SQL_DROP.
// resource statistics
if (resStatStatement != NULL && pSrvrStmt != NULL && pSrvrStmt->isClosed == TRUE && pSrvrStmt->bFetchStarted == TRUE && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
pSrvrStmt->bFetchStarted = FALSE;
if (*returnCode == SQL_ERROR && pSrvrStmt != NULL && pSrvrStmt->sqlWarningOrError != NULL)
{
inErrorStatement ++;
inErrorCode = *(Int32 *)(pSrvrStmt->sqlWarningOrError+8);
}
inQueryId=pSrvrStmt->sqlUniqueQueryID;
inSqlQueryType = pSrvrStmt->sqlQueryType;
resStatStatement->end(inState,inSqlQueryType,inSqlStmtType,inQueryId,inEstimatedCost,inSqlString,inErrorStatement,inWarningStatement,inRowCount,inErrorCode,resStatSession,pSrvrStmt->isClosed);
}
*/
SRVRTRACE_EXIT(FILE_SME+3);
return;
} /* odbc_SQLSrvr_Close_sme_() */
/*
* Synchronous method function for
* operation 'odbc_SQLSvc_FetchN'
*/
extern "C" void
odbc_SQLSvc_FetchN_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def *call_id_
, /* Out */ odbc_SQLSvc_FetchN_exc_ *exception_
, /* In */ DIALOGUE_ID_def dialogueId
, /* In */ const IDL_char *stmtLabel
, /* In */ Int32 maxRowCnt
, /* In */ Int32 maxRowLen
, /* In */ IDL_short sqlAsyncEnable
, /* In */ Int32 queryTimeout
, /* Out */ Int32 *rowsAffected
, /* Out */ SQLValueList_def *outputValueList
, /* Out */ ERROR_DESC_LIST_def *sqlWarning
)
{
SRVRTRACE_ENTER(FILE_SME+4);
SRVR_STMT_HDL *pSrvrStmt = NULL;
SQLRETURN rc = SQL_SUCCESS;
if (maxRowCnt < 0)
{
exception_->exception_nr = odbc_SQLSvc_FetchN_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_ROW_COUNT;
}
else
{
if ((pSrvrStmt = getSrvrStmt(stmtLabel, FALSE)) == NULL)
{
exception_->exception_nr = odbc_SQLSvc_FetchN_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
}
}
if (exception_->exception_nr == 0)
{
// resource statistics
if (resStatStatement != NULL && pSrvrStmt->isClosed == FALSE && pSrvrStmt->bFetchStarted == FALSE && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
pSrvrStmt->bFetchStarted = TRUE;
pSrvrStmt->inState = inState = STMTSTAT_FETCH;
inSqlStmtType = TYPE_UNKNOWN;
inEstimatedCost = 0;
inQueryId = NULL;
inSqlString = NULL;
inErrorStatement = 0;
inWarningStatement = 0;
inRowCount = 0;
inErrorCode = 0;
inSqlError = NULL;
inSqlErrorLength = 0;
/*resStatStatement->start(inState,
pSrvrStmt->sqlQueryType,
stmtLabel,
pSrvrStmt->sqlUniqueQueryID,
pSrvrStmt->cost_info,
pSrvrStmt->comp_stats_info,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg);*/
resStatStatement->start(inState,
pSrvrStmt->sqlQueryType,
stmtLabel,
pSrvrStmt,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg);
}
//end rs
rc = SQL_SUCCESS;
if (pSrvrStmt->bSQLMessageSet)
pSrvrStmt->cleanupSQLMessage();
if (pSrvrStmt->outputValueList._buffer == NULL || pSrvrStmt->maxRowCnt < maxRowCnt)
{
if(pSrvrStmt->bSQLValueListSet)
pSrvrStmt->cleanupSQLValueList();
rc = AllocAssignValueBuffer(pSrvrStmt->bSQLValueListSet,&pSrvrStmt->outputDescList,
&pSrvrStmt->outputValueList, pSrvrStmt->outputDescVarBufferLen,
maxRowCnt, pSrvrStmt->outputValueVarBuffer);
}
else
// Reset the length to 0, but the _buffer points to array of required SQLValue_defs
pSrvrStmt->outputValueList._length = 0;
if (rc == SQL_SUCCESS)
{
pSrvrStmt->maxRowCnt = maxRowCnt;
pSrvrStmt->maxRowLen = maxRowLen;
pSrvrStmt->currentMethod = odbc_SQLSvc_FetchN_ldx_;
rc = FETCH(pSrvrStmt);
switch (rc)
{
case SQL_SUCCESS:
break;
case SQL_SUCCESS_WITH_INFO:
GETSQLWARNING(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlWarning);
break;
case SQL_ERROR:
GETSQLERROR(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError);
break;
case ODBC_RG_WARNING:
// if there is RG_WARNING, we don't pass SQL Warning to the application
// Hence, we need to clear any warnings
// call SQL_EXEC_ClearDiagnostics
// CLEARDIAGNOSTICS(pSrvrStmt);
rc = SQL_SUCCESS_WITH_INFO;
case ODBC_SERVER_ERROR:
case ODBC_RG_ERROR:
default:
break;
}
}
switch (rc)
{
case SQL_SUCCESS:
case SQL_SUCCESS_WITH_INFO:
exception_->exception_nr = 0;
*rowsAffected = pSrvrStmt->rowsAffected;
outputValueList->_length = pSrvrStmt->outputValueList._length;
outputValueList->_buffer = pSrvrStmt->outputValueList._buffer;
sqlWarning->_length = pSrvrStmt->sqlWarning._length;
sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
break;
case SQL_STILL_EXECUTING:
exception_->exception_nr = odbc_SQLSvc_FetchN_SQLStillExecuting_exn_;
break;
case SQL_INVALID_HANDLE:
exception_->exception_nr = odbc_SQLSvc_FetchN_SQLInvalidHandle_exn_;
break;
case SQL_NO_DATA_FOUND:
exception_->exception_nr = odbc_SQLSvc_FetchN_SQLNoDataFound_exn_;
break;
case SQL_ERROR:
ERROR_DESC_def *error_desc_def;
error_desc_def = pSrvrStmt->sqlError.errorList._buffer;
if (pSrvrStmt->sqlError.errorList._length != 0 && error_desc_def->sqlcode == -8007)
{
exception_->exception_nr = odbc_SQLSvc_FetchN_SQLQueryCancelled_exn_;
exception_->u.SQLQueryCancelled.sqlcode = error_desc_def->sqlcode;
}
else
{
exception_->exception_nr = odbc_SQLSvc_FetchN_SQLError_exn_;
exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
}
break;
case PROGRAM_ERROR:
exception_->exception_nr = odbc_SQLSvc_FetchN_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_FETCH_FAILED;
default:
break;
}
if (resStatStatement != NULL && (rc == SQL_NO_DATA_FOUND || rc == SQL_ERROR || ((rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) && *rowsAffected < maxRowCnt)))
resStatStatement->setStatistics(pSrvrStmt);
}
//resource statistics
if (resStatStatement != NULL && pSrvrStmt != NULL && pSrvrStmt->isClosed == TRUE && pSrvrStmt->bFetchStarted == TRUE && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
if (rc == SQL_ERROR && exception_->u.SQLError.errorList._buffer != NULL)
{
ERROR_DESC_def *p_buffer = exception_->u.SQLError.errorList._buffer;
inErrorCode = p_buffer->sqlcode;
inSqlError = p_buffer->errorText;
inSqlErrorLength = strlen(p_buffer->errorText);
}
pSrvrStmt->bFetchStarted = FALSE;
Int32 inMaxRowCnt = 0;
Int32 inMaxRowLen = 0;
inMaxRowCnt = maxRowCnt;
inMaxRowLen = maxRowLen;
if (exception_->exception_nr != 0)
inErrorStatement ++;
else
setStatisticsFlag = FALSE;
if (sqlWarning->_length != 0)
inWarningStatement ++;
if (exception_->exception_nr == 5)
{
inErrorStatement = 0;
inWarningStatement = 0;
setStatisticsFlag = TRUE;
}
inQueryId = pSrvrStmt->sqlUniqueQueryID;
inSqlQueryType = pSrvrStmt->sqlQueryType;
resStatStatement->setStatisticsFlag(setStatisticsFlag);
resStatStatement->end(inState,
inSqlQueryType,
inSqlStmtType,
inQueryId,
inEstimatedCost,
inSqlString,
inErrorStatement,
inWarningStatement,
inRowCount,
inErrorCode,
resStatSession,
inSqlErrorLength,
inSqlError,
pSrvrStmt,
&pSrvrStmt->m_need_21036_end_msg,
pSrvrStmt->sqlNewQueryType,
pSrvrStmt->isClosed);
}
// end rs
SRVRTRACE_EXIT(FILE_SME+4);
return;
}
/*
* Synchronous method function for
* operation 'odbc_SQLSvc_EndTransaction'
*/
extern "C" void
odbc_SQLSvc_EndTransaction_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def *call_id_
, /* Out */ odbc_SQLSvc_EndTransaction_exc_ *exception_
, /* In */ DIALOGUE_ID_def dialogueId
, /* In */ IDL_unsigned_short transactionOpt
, /* Out */ ERROR_DESC_LIST_def *sqlWarning
)
{
SRVRTRACE_ENTER(FILE_SME+5);
char stmtLabel[MAX_STMT_LABEL_LEN+1];
Int32 rc = SQL_SUCCESS;
SRVR_STMT_HDL *pSrvrStmt = NULL;
switch (transactionOpt) {
case SQL_COMMIT:
pSrvrStmt = getSrvrStmt("STMT_COMMIT_1", FALSE);
break;
case SQL_ROLLBACK:
pSrvrStmt = getSrvrStmt("STMT_ROLLBACK_1", FALSE);
break;
default:
exception_->exception_nr = odbc_SQLSvc_EndTransaction_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_TRANSACT_OPT;
return;
}
if (pSrvrStmt == NULL)
{
exception_->exception_nr = odbc_SQLSvc_EndTransaction_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
}
else
{
if (pSrvrStmt->bSQLMessageSet)
pSrvrStmt->cleanupSQLMessage();
if(pSrvrStmt->bSQLValueListSet)
pSrvrStmt->cleanupSQLValueList();
pSrvrStmt->inputRowCnt = 1;
pSrvrStmt->sqlStmtType = TYPE_UNKNOWN;
pSrvrStmt->cursorName[0] = '\0';
pSrvrStmt->cursorNameLen = 0;
pSrvrStmt->inputValueList._buffer = NULL;
pSrvrStmt->inputValueList._length = 0;
pSrvrStmt->currentMethod = odbc_SQLSvc_ExecuteN_ldx_;
rc = EXECUTE(pSrvrStmt);
if (rc == SQL_ERROR)
{
GETSQLERROR(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError);
ERROR_DESC_def *error_desc_def = pSrvrStmt->sqlError.errorList._buffer;
if (pSrvrStmt->sqlError.errorList._length != 0 )
{
if (error_desc_def != NULL && (error_desc_def->sqlcode == -8605 || error_desc_def->sqlcode == -8607 || error_desc_def->sqlcode == -8609))
{
exception_->exception_nr = 0;
sqlWarning->_length = 0;
sqlWarning->_buffer = NULL;
}
else
{
exception_->exception_nr = odbc_SQLSvc_EndTransaction_SQLError_exn_;
exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
}
}
else
{
exception_->exception_nr = odbc_SQLSvc_EndTransaction_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_TRANSACT_OPT;
}
}
else if (rc != SQL_SUCCESS)
{
GETSQLWARNING(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlWarning);
exception_->exception_nr = 0;
sqlWarning->_length = pSrvrStmt->sqlWarning._length;
sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
}
}
SRVRTRACE_EXIT(FILE_SME+5);
return;
}
//LCOV_EXCL_START
/*
* Synchronous method function prototype for
* operation 'odbc_SQLSvc_ExecDirect'
*/
extern "C" void
odbc_SQLSvc_ExecDirect_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def *call_id_
, /* Out */ odbc_SQLSvc_ExecDirect_exc_ *exception_
, /* In */ DIALOGUE_ID_def dialogueId
, /* In */ const IDL_char *stmtLabel
, /* In */ IDL_string cursorName
, /* In */ const IDL_char *stmtExplainLabel
, /* In */ IDL_short stmtType
, /* In */ IDL_short sqlStmtType
, /* In */ IDL_string sqlString
, /* In */ IDL_short sqlAsyncEnable
, /* In */ Int32 queryTimeout
, /* Out */ Int32 *estimatedCost
, /* Out */ SQLItemDescList_def *outputDesc
, /* Out */ Int32 *rowsAffected
, /* Out */ ERROR_DESC_LIST_def *sqlWarning)
{
SRVRTRACE_ENTER(FILE_SME+6);
SRVR_STMT_HDL *pSrvrStmt = NULL;
SQLRETURN rc = SQL_SUCCESS;
Int32 holdestimatedCost;
if (sqlString == NULL)
{
exception_->exception_nr = odbc_SQLSvc_ExecDirect_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_NULL_SQL_STMT;
}
else
{
// resource statistics
if (resStatStatement != NULL && stmtType == EXTERNAL_STMT)
{
inState = STMTSTAT_EXECDIRECT;
inSqlStmtType = sqlStmtType;
inEstimatedCost = 0;
inQueryId = NULL;
inSqlString = NULL;
inErrorStatement = 0;
inWarningStatement = 0;
inRowCount = 0;
inErrorCode = 0;
inSqlError = NULL;
inSqlErrorLength = 0;
// resStatStatement->start(inState, stmtLabel, NULL, inEstimatedCost, sqlString); called in EXECDIRECT
}
//end rs
if ((pSrvrStmt = getSrvrStmt(stmtLabel, FALSE)) != NULL)
{
pSrvrStmt->cleanupAll();
pSrvrStmt->currentMethod = odbc_SQLSvc_Close_ldx_;
pSrvrStmt->freeResourceOpt = SQL_DROP;
FREESTATEMENT(pSrvrStmt);
}
// Need to validate the stmtLabel
// Given a label find out the SRVR_STMT_HDL
if ((pSrvrStmt = getSrvrStmt(stmtLabel, TRUE)) == NULL)
{
exception_->exception_nr = odbc_SQLSvc_ExecDirect_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
}
}
if (exception_->exception_nr == 0)
{
pSrvrStmt->cleanupAll();
if (resStatStatement != NULL && stmtType == EXTERNAL_STMT)
pSrvrStmt->inState = inState;
pSrvrStmt->sqlStringLen = strlen(sqlString);
pSrvrStmt->sqlString = new char[pSrvrStmt->sqlStringLen+1];
if (pSrvrStmt->sqlString == NULL)
{
SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
srvrGlobal->srvrObjRef, 1, "ExecDirect");
exit(0);
}
strcpy(pSrvrStmt->sqlString, sqlString);
pSrvrStmt->sqlStmtType = sqlStmtType;
if (exception_->exception_nr == 0)
{
pSrvrStmt->stmtType = stmtType;
if (cursorName != NULL && cursorName[0] != '\0')
{
pSrvrStmt->cursorNameLen = strlen(cursorName);
pSrvrStmt->cursorNameLen = pSrvrStmt->cursorNameLen < sizeof(pSrvrStmt->cursorName)? pSrvrStmt->cursorNameLen : sizeof(pSrvrStmt->cursorName);
strncpy(pSrvrStmt->cursorName, cursorName, sizeof(pSrvrStmt->cursorName));
pSrvrStmt->cursorName[sizeof(pSrvrStmt->cursorName)-1] = 0;
}
else
pSrvrStmt->cursorName[0] = '\0';
pSrvrStmt->currentMethod = odbc_SQLSvc_ExecDirect_ldx_;
rc = EXECDIRECT(pSrvrStmt);
switch (rc)
{
case SQL_SUCCESS:
break;
case SQL_SUCCESS_WITH_INFO:
GETSQLWARNING(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlWarning);
break;
case SQL_ERROR:
GETSQLERROR(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError);
break;
case ODBC_RG_WARNING:
// if there is RG_WARNING, we don't pass SQL Warning to the application
// Hence, we need to clear any warnings
// call SQL_EXEC_ClearDiagnostics
// CLEARDIAGNOSTICS(pSrvrStmt);
rc = SQL_SUCCESS_WITH_INFO;
case ODBC_SERVER_ERROR:
case ODBC_RG_ERROR:
default:
break;
}
switch (rc)
{
case SQL_SUCCESS:
case SQL_SUCCESS_WITH_INFO:
break;
default:
break;
}
switch (rc)
{
case SQL_SUCCESS:
case SQL_SUCCESS_WITH_INFO:
exception_->exception_nr = 0;
// Vijay - Changes to support not to parse tokens for statement type SELECT
holdestimatedCost = (Int32)pSrvrStmt->cost_info.totalTime; // SQL returns cost in a strcuture - cost.totalTime
if ((pSrvrStmt->sqlQueryType == SQL_SELECT_NON_UNIQUE) || (pSrvrStmt->sqlQueryType == SQL_SELECT_UNIQUE))
pSrvrStmt->sqlStmtType = TYPE_SELECT;
*estimatedCost = pSrvrStmt->sqlQueryType;
*rowsAffected = pSrvrStmt->rowsAffected;
outputDesc->_length = pSrvrStmt->outputDescList._length;
outputDesc->_buffer = pSrvrStmt->outputDescList._buffer;
sqlWarning->_length = pSrvrStmt->sqlWarning._length;
sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
break;
case SQL_STILL_EXECUTING:
exception_->exception_nr = odbc_SQLSvc_ExecDirect_SQLStillExecuting_exn_;
break;
case ODBC_RG_ERROR:
case SQL_ERROR:
case INFOSTATS_STMT_NOT_FOUND:
ERROR_DESC_def *error_desc_def;
error_desc_def = pSrvrStmt->sqlError.errorList._buffer;
if (pSrvrStmt->sqlError.errorList._length != 0 && error_desc_def->sqlcode == -8007)
{
exception_->exception_nr = odbc_SQLSvc_ExecDirect_SQLQueryCancelled_exn_;
exception_->u.SQLQueryCancelled.sqlcode = error_desc_def->sqlcode;
}
else
{
exception_->exception_nr = odbc_SQLSvc_ExecDirect_SQLError_exn_;
exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
}
break;
case PROGRAM_ERROR:
exception_->exception_nr = odbc_SQLSvc_ExecDirect_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECDIRECT_FAILED;
break;
default:
break;
}
if (resStatStatement != NULL)
resStatStatement->setStatistics(pSrvrStmt);
}
}
// resource statistics
if (resStatStatement != NULL && stmtType == EXTERNAL_STMT)
{
if (exception_->exception_nr != 0 && exception_->u.SQLError.errorList._buffer != NULL)
{
inErrorStatement ++;
ERROR_DESC_def *p_buffer = exception_->u.SQLError.errorList._buffer;
inErrorCode = p_buffer->sqlcode;
inSqlError = p_buffer->errorText;
inSqlErrorLength = strlen(p_buffer->errorText);
}
if (sqlWarning->_length != 0)
inWarningStatement ++;
inRowCount = *rowsAffected;
if (sqlString == NULL)
sqlString = "";
inSqlString = new char[strlen(sqlString) + 1];
if (inSqlString == NULL)
{
SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
srvrGlobal->srvrObjRef, 1, "inSqlString");
exit(0);
}
strcpy(inSqlString,sqlString);
if (pSrvrStmt != NULL)
{
if (holdestimatedCost == -1)
inEstimatedCost = 0;
else
inEstimatedCost = pSrvrStmt->cost_info.totalTime; // res stat reports estimated cost as double
inQueryId = pSrvrStmt->sqlUniqueQueryID;
inSqlQueryType = pSrvrStmt->sqlQueryType;
inSqlNewQueryType = pSrvrStmt->sqlNewQueryType;
}
resStatStatement->end(inState,
inSqlQueryType,
inSqlStmtType,
inQueryId,
inEstimatedCost,
inSqlString,
inErrorStatement,
inWarningStatement,
inRowCount,
inErrorCode,
resStatSession,
inSqlErrorLength,
inSqlError,
pSrvrStmt,
&pSrvrStmt->m_need_21036_end_msg,
inSqlNewQueryType,
pSrvrStmt->isClosed);
delete inSqlString;
}
//end rs
SRVRTRACE_EXIT(FILE_SME+6);
return;
}
//LCOV_EXCL_STOP
//LCOV_EXCL_START
/*
* Synchronous method function for
* operation 'odbc_SQLSvc_FetchPerf'
*/
extern "C" void
odbc_SQLSvc_FetchPerf_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def *call_id_
, /* Out */ odbc_SQLSvc_FetchPerf_exc_ *exception_
, /* In */ DIALOGUE_ID_def dialogueId
, /* In */ const IDL_char *stmtLabel
, /* In */ Int32 maxRowCnt
, /* In */ Int32 maxRowLen
, /* In */ IDL_short sqlAsyncEnable
, /* In */ Int32 queryTimeout
, /* Out */ Int32 *rowsAffected
, /* Out */ SQL_DataValue_def *outputDataValue
, /* Out */ ERROR_DESC_LIST_def *sqlWarning)
{
SRVRTRACE_ENTER(FILE_SME+8);
SRVR_STMT_HDL *pSrvrStmt = NULL;
SQLRETURN rc = SQL_SUCCESS;
if (maxRowCnt < 0)
{
exception_->exception_nr = odbc_SQLSvc_FetchPerf_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_ROW_COUNT;
}
else
{
if ((pSrvrStmt = getSrvrStmt(stmtLabel, FALSE)) == NULL)
{
exception_->exception_nr = odbc_SQLSvc_FetchPerf_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
}
}
if (exception_->exception_nr == 0)
{
// resource statistics
if (resStatStatement != NULL && pSrvrStmt->isClosed == FALSE && pSrvrStmt->bFetchStarted == FALSE && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
pSrvrStmt->bFetchStarted = TRUE;
pSrvrStmt->inState = inState = STMTSTAT_FETCH;
inSqlStmtType = TYPE_UNKNOWN;
inEstimatedCost = 0;
inQueryId = NULL;
inSqlString = NULL;
inErrorStatement = 0;
inWarningStatement = 0;
inRowCount = 0;
inErrorCode = 0;
inSqlError = NULL;
inSqlErrorLength = 0;
/*resStatStatement->start(inState,
pSrvrStmt->sqlQueryType,
stmtLabel,
pSrvrStmt->sqlUniqueQueryID,
pSrvrStmt->cost_info,
pSrvrStmt->comp_stats_info,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg);*/
resStatStatement->start(inState,
pSrvrStmt->sqlQueryType,
stmtLabel,
pSrvrStmt,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg);
}
// end rs
if (pSrvrStmt->sqlStmtType != TYPE_SELECT_CATALOG)
{
if (pSrvrStmt->bSQLMessageSet)
pSrvrStmt->cleanupSQLMessage();
pSrvrStmt->outputDataValue._length = 0;
pSrvrStmt->outputDataValue._buffer = 0;
if (pSrvrStmt->isClosed)
{
exception_->exception_nr = odbc_SQLSvc_FetchPerf_SQLNoDataFound_exn_;
goto ret;
}
pSrvrStmt->currentMethod = odbc_SQLSvc_FetchPerf_ldx_;
if (pSrvrStmt->sqlBulkFetchPossible && pSrvrStmt->sqlQueryType == SQL_SELECT_NON_UNIQUE)
{
if (pSrvrStmt->outputDataValue._buffer != NULL)
delete pSrvrStmt->outputDataValue._buffer;
pSrvrStmt->outputDataValue._buffer = NULL;
pSrvrStmt->outputDataValue._length = 0;
rc = FETCH2bulk(pSrvrStmt);
if (pSrvrStmt->rowsAffected > 0)
{
if(pSrvrStmt->outputDataValue._length == 0 && pSrvrStmt->outputDataValue._buffer == NULL)
{
outputDataValue->_buffer = pSrvrStmt->outputDescVarBuffer;
outputDataValue->_length = pSrvrStmt->outputDescVarBufferLen*pSrvrStmt->rowsAffected;
}
else
{
outputDataValue->_buffer = pSrvrStmt->outputDataValue._buffer;
outputDataValue->_length = pSrvrStmt->outputDataValue._length;
}
}
else
{
outputDataValue->_buffer = NULL;
outputDataValue->_length = 0;
}
// if (pSrvrStmt->PerfFetchRetcode == SQL_NO_DATA_FOUND)
// {
// char tmpString[32];
// tmpString[0] = '\0';
// sprintf(tmpString, "f: %Ld %d", pSrvrStmt->cliElapseTime, pSrvrStmt->rowsAffected);
// SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
// srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
// srvrGlobal->srvrObjRef, 1, tmpString);
// }
}
else
{
pSrvrStmt->maxRowCnt = maxRowCnt;
pSrvrStmt->maxRowLen = maxRowLen;
rc = FETCHPERF(pSrvrStmt, outputDataValue);
}
switch (rc)
{
case ODBC_SERVER_ERROR:
case ODBC_RG_ERROR:
default:
break;
}
switch (rc)
{
case ODBC_RG_WARNING:
// if there is RG_WARNING, we don't pass SQL Warning to the application
// Hence, we need to clear any warnings
// call SQL_EXEC_ClearDiagnostics
// CLEARDIAGNOSTICS(pSrvrStmt);
rc = SQL_SUCCESS_WITH_INFO;
case SQL_SUCCESS_WITH_INFO:
GETSQLWARNING(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlWarning);
case SQL_SUCCESS:
exception_->exception_nr = 0;
*rowsAffected = pSrvrStmt->rowsAffected;
sqlWarning->_length = pSrvrStmt->sqlWarning._length;
sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
break;
case SQL_STILL_EXECUTING:
exception_->exception_nr = odbc_SQLSvc_FetchPerf_SQLStillExecuting_exn_;
break;
case SQL_INVALID_HANDLE:
exception_->exception_nr = odbc_SQLSvc_FetchPerf_SQLInvalidHandle_exn_;
break;
case SQL_NO_DATA_FOUND:
exception_->exception_nr = odbc_SQLSvc_FetchPerf_SQLNoDataFound_exn_;
break;
case SQL_ERROR:
GETSQLERROR(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError);
ERROR_DESC_def *error_desc_def;
error_desc_def = pSrvrStmt->sqlError.errorList._buffer;
if (pSrvrStmt->sqlError.errorList._length != 0 && error_desc_def->sqlcode == -8007)
{
exception_->exception_nr = odbc_SQLSvc_FetchPerf_SQLQueryCancelled_exn_;
exception_->u.SQLQueryCancelled.sqlcode = error_desc_def->sqlcode;
}
else
{
exception_->exception_nr = odbc_SQLSvc_FetchPerf_SQLError_exn_;
exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
}
break;
case PROGRAM_ERROR:
exception_->exception_nr = odbc_SQLSvc_FetchPerf_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_FETCH_FAILED;
default:
break;
}
}
else
{ // Catalog APIs
pSrvrStmt->maxRowCnt = maxRowCnt;
pSrvrStmt->maxRowLen = maxRowLen;
rc = FETCHPERF(pSrvrStmt, outputDataValue);
if (pSrvrStmt->sqlError.errorList._buffer != NULL)
{
rc = SQL_ERROR;
ERROR_DESC_def *error_desc_def;
error_desc_def = pSrvrStmt->sqlError.errorList._buffer;
if (pSrvrStmt->sqlError.errorList._length != 0 && error_desc_def->sqlcode == -8007)
{
exception_->exception_nr = odbc_SQLSvc_FetchPerf_SQLQueryCancelled_exn_;
exception_->u.SQLQueryCancelled.sqlcode = error_desc_def->sqlcode;
}
else
{
exception_->exception_nr = odbc_SQLSvc_FetchPerf_SQLError_exn_;
exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
}
}
else if (pSrvrStmt->rowsAffected == 0 || pSrvrStmt->rowsAffected == -1)
{
if (pSrvrStmt->bSQLMessageSet)
pSrvrStmt->cleanupSQLMessage();
pSrvrStmt->outputDataValue._length = 0;
pSrvrStmt->outputDataValue._buffer = 0;
pSrvrStmt->InternalStmtClose(SQL_CLOSE);
rc = SQL_NO_DATA_FOUND;
exception_->exception_nr = odbc_SQLSvc_FetchPerf_SQLNoDataFound_exn_;
}
else
{
exception_->exception_nr = 0;
*rowsAffected = pSrvrStmt->rowsAffected;
outputDataValue->_length = pSrvrStmt->outputDataValue._length;
outputDataValue->_buffer = pSrvrStmt->outputDataValue._buffer;
sqlWarning->_length = pSrvrStmt->sqlWarning._length;
sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
if (pSrvrStmt->sqlWarning._length != 0)
rc = SQL_SUCCESS_WITH_INFO;
else
rc = SQL_SUCCESS;
pSrvrStmt->rowsAffected = 0;
}
}
ret:
if (exception_->exception_nr != 0)
{
if (pSrvrStmt->outputDataValue._buffer != NULL)
delete pSrvrStmt->outputDataValue._buffer;
pSrvrStmt->outputDataValue._length = 0;
pSrvrStmt->outputDataValue._buffer = NULL;
}
if (resStatStatement != NULL && pSrvrStmt->bFetchStarted == TRUE &&
(rc == SQL_NO_DATA_FOUND || rc == SQL_ERROR ||
((rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) && *rowsAffected < maxRowCnt)))
{
resStatStatement->setStatistics(pSrvrStmt);
}
}
// resource statistics
if (resStatStatement != NULL && pSrvrStmt != NULL && pSrvrStmt->isClosed == TRUE && pSrvrStmt->bFetchStarted == TRUE && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
if (rc == SQL_ERROR && exception_->u.SQLError.errorList._buffer != NULL)
{
ERROR_DESC_def *p_buffer = exception_->u.SQLError.errorList._buffer;
inErrorCode = p_buffer->sqlcode;
inSqlError = p_buffer->errorText;
inSqlErrorLength = strlen(p_buffer->errorText);
}
pSrvrStmt->bFetchStarted = FALSE;
Int32 inMaxRowCnt = 0;
Int32 inMaxRowLen = 0;
inMaxRowCnt = maxRowCnt;
inMaxRowLen = maxRowLen;
if (exception_->exception_nr != 0)
inErrorStatement ++;
else
setStatisticsFlag = FALSE;
if (sqlWarning->_length != 0)
inWarningStatement ++;
if (exception_->exception_nr == 5)
{
inErrorStatement = 0;
inWarningStatement = 0;
setStatisticsFlag = TRUE;
}
inQueryId = pSrvrStmt->sqlUniqueQueryID;
inSqlQueryType = pSrvrStmt->sqlQueryType;
resStatStatement->setStatisticsFlag(setStatisticsFlag);
resStatStatement->end(inState,
inSqlQueryType,
inSqlStmtType,
inQueryId,
inEstimatedCost,
inSqlString,
inErrorStatement,
inWarningStatement,
inRowCount,
inErrorCode,
resStatSession,
inSqlErrorLength,
inSqlError,
pSrvrStmt,
&pSrvrStmt->m_need_21036_end_msg,
pSrvrStmt->sqlNewQueryType,
pSrvrStmt->isClosed);
}
//end rs
SRVRTRACE_EXIT(FILE_SME+8);
return;
}
/*
* Synchronous method function for
* operation 'odbc_SQLSvc_ExecuteCall'
*/
extern "C" void
odbc_SQLSvc_ExecuteCall_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def *call_id_
, /* Out */ odbc_SQLSvc_ExecuteCall_exc_ *exception_
, /* In */ DIALOGUE_ID_def dialogueId
, /* In */ const IDL_char *stmtLabel
, /* In */ IDL_string cursorName
, /* In */ IDL_short sqlStmtType
, /* In */ Int32 inputRowCnt
, /* In */ const SQLValueList_def *inputValueList
, /* In */ IDL_short sqlAsyncEnable
, /* In */ Int32 queryTimeout
, /* Out */ SQLValueList_def *outputValueList
, /* Out */ Int32 *rowsAffected
, /* Out */ ERROR_DESC_LIST_def *sqlWarning)
{
SRVRTRACE_ENTER(FILE_SME+13);
SRVR_STMT_HDL *pSrvrStmt = NULL;
SQLRETURN rc = SQL_SUCCESS;
/*
// resource statistics
inState = STMTSTAT_EXECUTE;
inSqlStmtType = sqlStmtType;
inEstimatedCost = 0;
inSqlString = NULL;
inErrorStatement = 0;
inWarningStatement = 0;
inRowCount = 0;
inErrorCode = 0;
if (resStatStatement != NULL)
resStatStatement->start(inState, stmtLabel);
//end rs
*/
if ((pSrvrStmt = getSrvrStmt(stmtLabel, FALSE)) == NULL)
{
exception_->exception_nr = odbc_SQLSvc_ExecuteCall_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
return;
}
if (exception_->exception_nr == 0)
{
rc = SQL_SUCCESS;
if (pSrvrStmt->bSQLMessageSet)
pSrvrStmt->cleanupSQLMessage();
if(pSrvrStmt->bSQLValueListSet)
pSrvrStmt->cleanupSQLValueList();
pSrvrStmt->inputValueList._buffer = inputValueList->_buffer;
pSrvrStmt->inputValueList._length = inputValueList->_length;
if (pSrvrStmt->outputValueList._buffer == NULL)
{
rc = AllocAssignValueBuffer(pSrvrStmt->bSQLValueListSet,&pSrvrStmt->outputDescList,
&pSrvrStmt->outputValueList, pSrvrStmt->outputDescVarBufferLen,
1, pSrvrStmt->outputValueVarBuffer);
}
else
pSrvrStmt->outputValueList._length = 0;
if (rc == SQL_SUCCESS)
{
pSrvrStmt->currentMethod = odbc_SQLSvc_ExecuteCall_ldx_;
rc = EXECUTECALL(pSrvrStmt);
switch (rc)
{
case SQL_SUCCESS:
break;
case SQL_SUCCESS_WITH_INFO:
GETSQLWARNING(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlWarning);
break;
case SQL_ERROR:
GETSQLERROR(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError);
break;
case ODBC_RG_WARNING:
// if there is RG_WARNING, we don't pass SQL Warning to the application
// Hence, we need to clear any warnings
// call SQL_EXEC_ClearDiagnostics
// CLEARDIAGNOSTICS(pSrvrStmt);
rc = SQL_SUCCESS_WITH_INFO;
case ODBC_SERVER_ERROR:
case ODBC_RG_ERROR:
default:
break;
}
switch (rc)
{
case SQL_SUCCESS:
case SQL_SUCCESS_WITH_INFO:
break;
case ODBC_SERVER_ERROR:
// Allocate Error Desc
kdsCreateSQLErrorException(pSrvrStmt->bSQLMessageSet, &pSrvrStmt->sqlError, 1);
// Add SQL Error
kdsCopySQLErrorException(&pSrvrStmt->sqlError, NULL_VALUE_ERROR, NULL_VALUE_ERROR_SQLCODE,
NULL_VALUE_ERROR_SQLSTATE);
break;
case -8814:
case 8814:
rc = SQL_RETRY_COMPILE_AGAIN;
break;
default:
break;
}
}
switch (rc)
{
case SQL_SUCCESS:
case SQL_SUCCESS_WITH_INFO:
exception_->exception_nr = 0;
// Copy the output values
*rowsAffected = 0;
outputValueList->_length = pSrvrStmt->outputValueList._length;
outputValueList->_buffer = pSrvrStmt->outputValueList._buffer;
sqlWarning->_length = pSrvrStmt->sqlWarning._length;
sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
break;
case SQL_STILL_EXECUTING:
exception_->exception_nr = odbc_SQLSvc_ExecuteCall_SQLStillExecuting_exn_;
break;
case SQL_INVALID_HANDLE:
exception_->exception_nr = odbc_SQLSvc_ExecuteCall_SQLInvalidHandle_exn_;
break;
case SQL_NO_DATA_FOUND:
// Added this for JDBC T4 driver since its uses this interface to get zero or one row
// for select statement besides CALL statement.
exception_->exception_nr = 100;
break;
case SQL_NEED_DATA:
exception_->exception_nr = odbc_SQLSvc_ExecuteCall_SQLNeedData_exn_;
break;
case ODBC_SERVER_ERROR:
case SQL_ERROR:
ERROR_DESC_def *error_desc_def;
error_desc_def = pSrvrStmt->sqlError.errorList._buffer;
if (pSrvrStmt->sqlError.errorList._length != 0 && error_desc_def->sqlcode == -8007)
{
exception_->exception_nr = odbc_SQLSvc_ExecuteCall_SQLQueryCancelled_exn_;
exception_->u.SQLQueryCancelled.sqlcode = error_desc_def->sqlcode;
}
else
{
exception_->exception_nr = odbc_SQLSvc_ExecuteCall_SQLError_exn_;
exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
}
break;
case -8814:
case 8814:
exception_->exception_nr = odbc_SQLSvc_ExecuteCall_SQLRetryCompile_exn_;
break;
case PROGRAM_ERROR:
exception_->exception_nr = odbc_SQLSvc_ExecuteCall_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECUTE_FAILED;
default:
break;
}
/* SQL doesn't return statistics for Call statement?
if (resStatStatement != NULL && (srvrGlobal->resourceStatistics & STMTSTAT_EXECUTE))
resStatStatement->setStatistics(pSrvrStmt);
*/
}
/* SQL doesn't return statistics for Call statement?
// resource statistics
if (exception_.exception_nr != 0 && exception_.u.SQLError.errorList._buffer != NULL)
{
inErrorCode = exception_.u.SQLError.errorList._buffer->sqlcode;
inErrorStatement ++;
}
if (sqlWarning._length != 0)
inWarningStatement ++;
inRowCount = rowsAffected;
if (resStatStatement != NULL)
resStatStatement->end(inState,inSqlStmtType,inEstimatedCost,inSqlString,inErrorStatement,inWarningStatement,inRowCount,inErrorCode, resStatSession);
//end rs
*/
SRVRTRACE_EXIT(FILE_SME+13);
return;
}
//LCOV_EXCL_STOP
/*
* * Synchronous method function prototype for
* * operation 'odbc_SQLSvc_GetSQLCatalogs'
* */
extern "C" void
odbc_SQLSvc_GetSQLCatalogs_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def *call_id_
, /* Out */ odbc_SQLSvc_GetSQLCatalogs_exc_ *exception_
, /* In */ DIALOGUE_ID_def dialogueId
, /* In */ const IDL_char *stmtLabel
, /* In */ IDL_short APIType
, /* In */ const IDL_char *catalogNm
, /* In */ const IDL_char *schemaNm
, /* In */ const IDL_char *tableNm
, /* In */ const IDL_char *tableTypeList
, /* In */ const IDL_char *columnNm
, /* In */ Int32 columnType
, /* In */ Int32 rowIdScope
, /* In */ Int32 nullable
, /* In */ Int32 uniqueness
, /* In */ Int32 accuracy
, /* In */ IDL_short sqlType
, /* In */ UInt32 metadataId
, /* In */ const IDL_char *fkcatalogNm
, /* In */ const IDL_char *fkschemaNm
, /* In */ const IDL_char *fktableNm
, /* Out */ IDL_char *catStmtLabel
, /* Out */ SQLItemDescList_def *outputDesc
, /* Out */ ERROR_DESC_LIST_def *sqlWarning
)
{
SRVRTRACE_ENTER(FILE_SME+14);
enum CATAPI_TABLE_INDEX {
COLUMNS = 0,
DEFAULTS,
INDEXES,
KEYS,
OBJECTS,
OBJECTUID,
TABLES,
VIEWS,
VIEWS_USAGE,
VERSIONS
};
char *smdCatAPITablesList[] = {
"COLUMNS",
"DEFAULTS",
"INDEXES",
"KEYS",
"OBJECTS",
"OBJECTUID",
"TABLES",
"VIEWS",
"VIEWS_USAGE",
"VERSIONS"
};
char CatalogQuery[20000];
SRVR_STMT_HDL *QryCatalogSrvrStmt = NULL;
odbc_SQLSvc_Prepare_exc_ prepareException;
odbc_SQLSvc_ExecuteN_exc_ executeException;
char *inputParam[16];
char *tableParam[20];
short retCode;
char RequestError[200 + 1];
char ConvertAPITypeToString[30];
Int32 curRowNo = 0;
Int32 numOfCols = 0;
Int32 curColNo = 0;
Int32 rowsAffected = 0;
Int32 rowsFetched;
char SQLObjType[2];
short EnvSetting = 0;
char MapDataType[2] = "0";
short retcode = 0;
char tmpBuf[20];
char odbcAppVersion[20];
char lc_tableTypeList[MAX_ANSI_NAME_LEN+1];
char *token;
char* saveptr;
odbc_SQLSvc_FetchN_exc_ fetchException;
odbc_SQLSvc_Close_exc_ CloseException;
CloseException.exception_nr=0;
fetchException.exception_nr=0;
if (resStatSession != NULL)
resStatSession->totalCatalogStatements++;
char catalogNmNoEsc[MAX_ANSI_NAME_LEN+1];
char schemaNmNoEsc[MAX_ANSI_NAME_LEN+1];
char tableNmNoEsc[MAX_ANSI_NAME_LEN+1];
char columnNmNoEsc[MAX_ANSI_NAME_LEN+1];
char expCatalogNm[MAX_ANSI_NAME_LEN+1];
char expSchemaNm[MAX_ANSI_NAME_LEN+1];
char expTableNm[MAX_ANSI_NAME_LEN+1];
char expColumnNm[MAX_ANSI_NAME_LEN+1];
char tableName1[MAX_ANSI_NAME_LEN+MAX_ANSI_NAME_LEN+MAX_ANSI_NAME_LEN+3];
char tableName2[MAX_ANSI_NAME_LEN+MAX_ANSI_NAME_LEN+MAX_ANSI_NAME_LEN+3];
char tableName3[MAX_ANSI_NAME_LEN+MAX_ANSI_NAME_LEN+MAX_ANSI_NAME_LEN+3];
_itoa(srvrGlobal->appVersion.majorVersion, odbcAppVersion, 10);
if(diagnostic_flags)
{
switch (APIType)
{
case SQL_API_SQLTABLES:
sprintf(ConvertAPITypeToString, "SQLTables (%d)", SQL_API_SQLTABLES);
break;
case SQL_API_SQLCOLUMNS:
sprintf(ConvertAPITypeToString, "SQLColumns (%d)", SQL_API_SQLCOLUMNS);
break;
case SQL_API_SQLCOLUMNPRIVILEGES:
sprintf(ConvertAPITypeToString, "SQLColumnPrivileges (%d)", SQL_API_SQLCOLUMNPRIVILEGES);
break;
case SQL_API_SQLFOREIGNKEYS:
sprintf(ConvertAPITypeToString, "SQLForeignKeys (%d)", SQL_API_SQLFOREIGNKEYS);
break;
case SQL_API_SQLPRIMARYKEYS:
sprintf(ConvertAPITypeToString, "SQLPrimaryKeys (%d)", SQL_API_SQLPRIMARYKEYS);
break;
case SQL_API_SQLSPECIALCOLUMNS:
sprintf(ConvertAPITypeToString, "SQLSpecialColumns (%d)", SQL_API_SQLSPECIALCOLUMNS);
break;
case SQL_API_SQLSTATISTICS:
sprintf(ConvertAPITypeToString, "SQLStatistics (%d)", SQL_API_SQLSTATISTICS);
break;
case SQL_API_SQLTABLEPRIVILEGES:
sprintf(ConvertAPITypeToString, "SQLTablePrivileges (%d)", SQL_API_SQLTABLEPRIVILEGES);
break;
case SQL_API_SQLGETTYPEINFO:
sprintf(ConvertAPITypeToString, "SQLGetTypeInfo (%d)", SQL_API_SQLGETTYPEINFO);
break;
case SQL_API_SQLPROCEDURES:
sprintf(ConvertAPITypeToString, "SQLProcedures (%d)", SQL_API_SQLPROCEDURES);
break;
case SQL_API_SQLPROCEDURECOLUMNS:
sprintf(ConvertAPITypeToString, "SQLProcedureColumns (%d)", SQL_API_SQLPROCEDURECOLUMNS);
break;
case SQL_API_TBLSYNONYM:
sprintf(ConvertAPITypeToString, "SQLTblsynonym (%d)", SQL_API_TBLSYNONYM);
break;
case SQL_API_TBLMVS:
sprintf(ConvertAPITypeToString, "SQLTblMvs (%d)", SQL_API_TBLMVS);
break;
default:
sprintf(ConvertAPITypeToString, "Invalid Catalog API (%d)", APIType);
break;
}
TraceOut(TR_SRVR_KRYPTON_API,"odbc_SQLSvc_GetSQLCatalogs_sme_(%#x, %#x, %#x, %ld, %s, %s, %s, %s, %s, %s, %s, %ld, %ld, %ld, %ld, %ld, %d, %s, %#x, %#x)",
objtag_,
call_id_,
exception_,
dialogueId,
stmtLabel,
ConvertAPITypeToString,
catalogNm,
schemaNm,
tableNm,
tableTypeList,
columnNm,
columnType,
rowIdScope,
nullable,
uniqueness,
accuracy,
sqlType,
fkcatalogNm,
fkschemaNm,
fktableNm,
catStmtLabel,
outputDesc,
sqlWarning);
}
if (stmtLabel != NULL)
odbc_SQLSvc_Close_sme_(objtag_, call_id_, &CloseException, dialogueId, stmtLabel,
SQL_DROP, &rowsAffected, sqlWarning);
if ((tableNm[0] == '\0') && (columnNm[0] == '\0') && (metadataId == 1))
metadataId = 0;
if (APIType != SQL_API_SQLTABLES && APIType != SQL_API_SQLTABLES_JDBC)
{
if (tableNm[0] == '\0')
strcpy((char *)tableNm,"%");
if (columnNm[0] == '\0')
strcpy((char *)columnNm,"%");
}
exception_->exception_nr = 0;
CatalogQuery[0] = '\0';
strcpy(catStmtLabel, stmtLabel);
switch(APIType)
{
case SQL_API_SQLTABLES :
case SQL_API_SQLTABLES_JDBC :
if ((strcmp(catalogNm,"%") == 0) && (strcmp(schemaNm,"") == 0) && (strcmp(tableNm,"") == 0))
{
strcpy(catalogNmNoEsc, SEABASE_MD_CATALOG);
inputParam[0] = catalogNmNoEsc;
inputParam[1] = inputParam[0];
inputParam[2] = NULL;
if (APIType == SQL_API_SQLTABLES)
{
// strcpy((char *)catStmtLabel, "SQL_TABLES_ANSI_Q1");
snprintf(CatalogQuery, sizeof(CatalogQuery),
"select distinct(cast('%s' as varchar(128))) TABLE_CAT, "
"cast(NULL as varchar(128) ) TABLE_SCHEM, "
"cast(NULL as varchar(128) ) TABLE_NAME, "
"cast(NULL as varchar(128) ) TABLE_TYPE, "
"cast(NULL as varchar(128)) REMARKS "
"from TRAFODION.\"_MD_\".objects "
"where CATALOG_NAME = '%s' "
"FOR READ UNCOMMITTED ACCESS ORDER BY 4,1,2,3;",
inputParam[0], inputParam[1]);
}
else
{
// strcpy((char *)catStmtLabel, "SQL_JAVA_TABLES_ANSI_Q1");
snprintf(CatalogQuery, sizeof(CatalogQuery),
"select distinct(cast('%s' as varchar(128) )) TABLE_CAT "
"from TRAFODION.\"_MD_\".objects "
"where CATALOG_NAME = '%s' "
"FOR READ UNCOMMITTED ACCESS ORDER BY 1;",
inputParam[0], inputParam[1]);
}
}
else
if ((strcmp(catalogNm,"") == 0) && (strcmp(schemaNm,"%") == 0) && (strcmp(tableNm,"") == 0))
{
convertWildcard(metadataId, TRUE, schemaNm, expSchemaNm);
strcpy(catalogNmNoEsc, SEABASE_MD_CATALOG);
inputParam[0] = catalogNmNoEsc;
inputParam[1] = inputParam[0];
inputParam[2] = (char*) schemaNm;
inputParam[3] = expSchemaNm;
inputParam[4] = NULL;
if (APIType == SQL_API_SQLTABLES)
{
// strcpy((char *)catStmtLabel, "SQL_TABLES_ANSI_Q2");
snprintf(CatalogQuery,sizeof(CatalogQuery),
"select distinct cast(NULL as varchar(128) ) TABLE_CAT, "
"cast(trim(SCHEMA_NAME) as varchar(128) ) TABLE_SCHEM, "
"cast(NULL as varchar(128) ) TABLE_NAME, "
"cast(NULL as varchar(128) ) TABLE_TYPE, "
"cast(NULL as varchar(128)) REMARKS "
"from TRAFODION.\"_MD_\".objects "
"where "
"(CATALOG_NAME = '%s' or "
" CATALOG_NAME LIKE '%s' ESCAPE '\\') "
"and (SCHEMA_NAME = '%s' or "
"SCHEMA_NAME LIKE '%s' ESCAPE '\\') "
"FOR READ UNCOMMITTED ACCESS ORDER BY 4,1,2,3;",
inputParam[0], inputParam[1], inputParam[2],
inputParam[3]);
}
else
{
// strcpy((char *)catStmtLabel, "SQL_JAVA_TABLES_ANSI_Q2");
snprintf(CatalogQuery,sizeof(CatalogQuery),
"select distinct "
"cast(trim(SCHEMA_NAME) as varchar(128) ) TABLE_SCHEM, "
"cast(trim(CATALOG_NAME) as varchar(128) ) TABLE_CATALOG "
"from TRAFODION.\"_MD_\".objects "
"where "
"(CATALOG_NAME = '%s' or "
" CATALOG_NAME LIKE '%s' ESCAPE '\\') "
"and (SCHEMA_NAME = '%s' or "
"SCHEMA_NAME LIKE '%s' ESCAPE '\\') "
"FOR READ UNCOMMITTED ACCESS ORDER BY 2;",
inputParam[0], inputParam[1], inputParam[2],
inputParam[3]);
}
}
else
if ((strcmp(catalogNm,"") == 0) && (strcmp(schemaNm,"")
== 0) && (strcmp(tableNm,"") == 0) && (strcmp(tableTypeList,"%") == 0))
{
strcpy(catalogNmNoEsc, "%");
strcpy(schemaNmNoEsc, "%");
strcpy(tableNmNoEsc, "%");
// strcpy((char *)catStmtLabel, "SQL_TABLES_ANSI_Q4");
tableParam[0] = NULL;
inputParam[0] = NULL;
snprintf(CatalogQuery,sizeof(CatalogQuery),
"select cast(NULL as varchar(128) ) TABLE_CAT,"
"cast(NULL as varchar(128) ) TABLE_SCHEM, "
"cast(NULL as varchar(128) ) TABLE_NAME,"
"trim(TABLE_TYPE) TABLE_TYPE,"
"cast(NULL as varchar(128)) REMARKS "
" from (VALUES "
"('TABLE'),"
"('SYSTEM TABLE'),"
"('VIEW'))"
" tp (\"TABLE_TYPE\")"
" FOR READ UNCOMMITTED ACCESS ORDER BY 4,1,2,3;");
}
else
{
if (tableNm[0] == '\0')
strcpy((char *)tableNmNoEsc,"%");
if (! checkIfWildCard(catalogNm, expCatalogNm))
{
exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_WILDCARD_NOT_SUPPORTED;
goto MapException;
}
if (strcmp(catalogNm,"") == 0) // If catalog empty default to system catalog
strcpy(tableName1,SEABASE_MD_CATALOG);
else
{
strncpy(tableName1,catalogNm, sizeof(tableName1));
tableName1[sizeof(tableName1)-1] = 0;
}
tableParam[0] = tableName1;
tableParam[1] = NULL;
convertWildcardNoEsc(metadataId, TRUE, schemaNm,schemaNmNoEsc);
convertWildcard(metadataId, TRUE, schemaNm, expSchemaNm);
if (tableNm[0] == '\0')
{
convertWildcardNoEsc(metadataId, TRUE, tableNmNoEsc, tableNmNoEsc);
convertWildcard(metadataId, TRUE, tableNmNoEsc, expTableNm);
}
else
{
convertWildcardNoEsc(metadataId, TRUE, tableNm, tableNmNoEsc);
convertWildcard(metadataId, TRUE, tableNm, expTableNm);
}
inputParam[0] = schemaNmNoEsc;
inputParam[1] = expSchemaNm;
inputParam[2] = tableNmNoEsc;
inputParam[3] = expTableNm;
if (tableTypeList == NULL || strlen(tableTypeList) == 0 || strcmp(tableTypeList,"%") == 0)
{
inputParam[4] = "UT"; // User Table
inputParam[5] = "BT";
inputParam[6] = "VI";
inputParam[7] = "SM"; // System MetaData
inputParam[8] = "BT";
inputParam[9] = NULL;
}
else
{
inputParam[4] = "";
inputParam[5] = "";
inputParam[6] = "";
inputParam[7] = "";
inputParam[8] = "";
inputParam[9] = NULL;
strncpy(lc_tableTypeList, tableTypeList, sizeof(lc_tableTypeList));
lc_tableTypeList[sizeof(lc_tableTypeList)-1] = 0;
token = strtok_r(lc_tableTypeList, " ,'", &saveptr);
while (token != NULL)
{
if (strcmp(token, "SYSTEM") == 0
)
{
token = strtok_r(NULL, ",'", &saveptr);
if (token != NULL && strcmp(token, "TABLE") == 0)
{
inputParam[7] = "SM";
inputParam[8] = "BT";
}
else
continue;
}
else
if (strcmp(token, "TABLE") == 0) {
inputParam[4] = "UT";
inputParam[5] = "BT";
}
else
if (strcmp(token, "VIEW") == 0)
{
inputParam[4] = "UT";
inputParam[6] = "VI";
}
token = strtok_r(NULL, " ,'", &saveptr);
}
}
if (APIType == SQL_API_SQLTABLES)
{
// strcpy((char *)catStmtLabel, "SQL_TABLES_ANSI_Q7");
snprintf(CatalogQuery,sizeof(CatalogQuery),
"select cast('%s' as varchar(128) ) TABLE_CAT,"
"cast(trim(SCHEMA_NAME) as varchar(128) ) TABLE_SCHEM,"
"cast(trim(OBJECT_NAME) as varchar(128) ) TABLE_NAME,"
"trim(case OBJECT_TYPE "
"when 'BT' then 'TABLE' "
"when 'VI' then 'VIEW' "
"end) TABLE_TYPE,"
"cast(NULL as varchar(128)) REMARKS "
" from TRAFODION.\"_MD_\".OBJECTS "
" where (SCHEMA_NAME = '%s' or "
" trim(SCHEMA_NAME) LIKE '%s' ESCAPE '\\')"
" and (OBJECT_NAME = '%s' or"
" trim(OBJECT_NAME) LIKE '%s' ESCAPE '\\')"
" and ((SCHEMA_NAME <> '_MD_' and '%s'='UT' and OBJECT_TYPE in ('%s', '%s'))"
" or (SCHEMA_NAME = '_MD_' and '%s'='SM' and OBJECT_TYPE in ('%s')))"
" FOR READ UNCOMMITTED ACCESS ORDER BY 4, 1, 2, 3 ;",
tableParam[0], inputParam[0], inputParam[1],
inputParam[2], inputParam[3], inputParam[4],
inputParam[5], inputParam[6], inputParam[7],
inputParam[8]);
}
else
{
// strcpy((char *)catStmtLabel, "SQL_JAVA_TABLES_ANSI_Q7");
snprintf(CatalogQuery,sizeof(CatalogQuery),
"select cast('%s' as varchar(128) ) TABLE_CAT,"
"cast(trim(SCHEMA_NAME) as varchar(128) ) TABLE_SCHEM,"
"cast(trim(OBJECT_NAME) as varchar(128) ) TABLE_NAME,"
"trim(case OBJECT_TYPE "
"when 'BT' then 'TABLE' "
"when 'VI' then 'VIEW' "
"end) TABLE_TYPE,"
"cast(NULL as varchar(128)) REMARKS, "
"cast(NULL as varchar(128)) TYPE_CAT,"
"cast(NULL as varchar(128)) TYPE_SCHEM, "
"cast(NULL as varchar(128)) TYPE_NAME,"
"cast(NULL as varchar(128)) SELF_REFERENCING_COL_NAME, "
"cast(NULL as varchar(128)) REF_GENERATION"
" from TRAFODION.\"_MD_\".OBJECTS "
" where (SCHEMA_NAME = '%s' or "
" trim(SCHEMA_NAME) LIKE '%s' ESCAPE '\\')"
" and (OBJECT_NAME = '%s' or"
" trim(OBJECT_NAME) LIKE '%s' ESCAPE '\\')"
" and ((SCHEMA_NAME <> '_MD_' and '%s'='UT' and OBJECT_TYPE in ('%s', '%s'))"
" or (SCHEMA_NAME = '_MD_' and '%s'='SM' and OBJECT_TYPE in ('%s')))"
" FOR READ UNCOMMITTED ACCESS ORDER BY 4, 1, 2, 3 ;",
tableParam[0], inputParam[0], inputParam[1],
inputParam[2], inputParam[3], inputParam[4],
inputParam[5], inputParam[6], inputParam[7],
inputParam[8]);
}
}
break;
case SQL_API_SQLGETTYPEINFO :
{
char condExpression[20] = {0};
switch(sqlType) {
case SQL_DATE:
sqlType == SQL_TYPE_DATE;
break;
case SQL_TIME:
sqlType == SQL_TYPE_TIME;
break;
case SQL_TIMESTAMP:
sqlType == SQL_TYPE_TIMESTAMP;
break;
default:
break;
}
if(sqlType == SQL_ALL_TYPES)
sprintf(condExpression, "1=1");
else
sprintf(condExpression, "DATA_TYPE=%d", sqlType);
snprintf(CatalogQuery,sizeof(CatalogQuery),
"select distinct TYPE_NAME TYPE_NAME,"
"DATA_TYPE DATA_TYPE,PREC COLUMN_SIZE,"
"LITERAL_PREFIX LITERAL_PREFIX,"
"LITERAL_SUFFIX LITERAL_SUFFIX,"
"CREATE_PARAMS CREATE_PARAMS,"
"IS_NULLABLE NULLABLE,"
"CASE_SENSITIVE CASE_SENSITIVE,"
"SEARCHABLE SEARCHABLE,"
"UNSIGNED_ATTRIBUTE UNSIGNED_ATTRIBUTE,"
"FIXED_PREC_SCALE FIXED_PREC_SCALE,"
"AUTO_UNIQUE_VALUE AUTO_UNIQUE_VALUE,"
"LOCAL_TYPE_NAME LOCAL_TYPE_NAME,"
"MINIMUM_SCALE MINIMUM_SCALE,"
"MAXIMUM_SCALE MAXIMUM_SCALE,"
"SQL_DATA_TYPE SQL_DATA_TYPE,"
"SQL_DATETIME_SUB SQL_DATETIME_SUB,"
"NUM_PREC_RADIX NUM_PREC_RADIX,"
"INTERVAL_PRECISION INTERVAL_PRECISION "
" from "
" (VALUES "
"(cast('BIGINT' as varchar(128)),cast(-5 as smallint), cast(19 as integer), cast (NULL as varchar(128)), cast (NULL as varchar(128)),"
"cast (NULL as varchar(128)), cast(1 as smallint), cast(0 as smallint), cast(2 as smallint) , cast(0 as smallint), cast(0 as smallint),"
"cast(0 as smallint), cast('LARGEINT' as varchar(128)), cast(NULL as smallint), cast(NULL as smallint), cast('LARGEINT' as varchar(128)),"
"cast(10 as smallint), cast(19 as integer), cast(20 as integer), cast(-402 as smallint), cast(NULL as smallint), cast(NULL as smallint),"
"cast(0 as smallint), cast(0 as smallint), cast(3 as smallint), cast(0 as smallint)),"
"('BIGINT SIGNED', -5, 19, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'LARGEINT', NULL, NULL, 'SIGNED LARGEINT', 19, 19, -1, -5, NULL, NULL, 0, 0, 3, 0),"
"('BIGINT UNSIGNED', -5, 20, NULL, NULL, NULL, 1, 0, 2, 1, 0, 0, 'LARGEINT', NULL, NULL, 'UNSIGNED LARGEINT', 20, 20, -1, -405, NULL, NULL, 0, 0, 3, 0),"
"('CHAR', 1, 32000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'CHARACTER', NULL, NULL, 'CHARACTER', NULL, -1, -1, 1, NULL, NULL, 0, 0, 3, 0),"
"('NCHAR', -8, 32000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'WCHAR', NULL, NULL, 'WCHAR', NULL, -1, -1, -8, NULL, NULL, 0, 0, 3, 0),"
"('NCHAR VARYING', -9, 32000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'WCHAR VARYING', NULL, NULL, 'VARWCHAR', NULL, -1, -1, -9, NULL, NULL, 0, 0, 3, 0),"
"('DATE', 91, 10, '{d ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'DATE', NULL, NULL, 'DATE', NULL, 10, 6, 9, 1, NULL, 1, 3, 3, 0),"
"('DECIMAL', 3, 18, NULL, NULL, 'precision,scale', 1, 0, 2, 0, 0, 0, 'DECIMAL', 0, 18, 'DECIMAL', 10, -2, -3, 3, NULL, NULL, 0, 0, 3, 0),"
"('DECIMAL SIGNED', 3, 18, NULL, NULL, 'precision,scale', 1, 0, 2, 0, 0, 0, 'DECIMAL', 0, 18, 'SIGNED DECIMAL', 10, -2, -3, 3, NULL, NULL, 0, 0, 3, 0),"
"('DECIMAL UNSIGNED', 3, 18, NULL, NULL, 'precision,scale', 1, 0, 2, 1, 0, 0, 'DECIMAL', 0, 18, 'UNSIGNED DECIMAL', 10, -2, -3, -301, NULL, NULL, 0, 0, 3, 0),"
"('DOUBLE PRECISION', 8, 15, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'DOUBLE', NULL, NULL, 'DOUBLE PRECISION', 2, 54, -1, 8, NULL, NULL, 0, 0, 3, 0),"
"('DOUBLE PRECISION', 8, 15, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'DOUBLE', NULL, NULL, 'DOUBLE', 2, 54, -1, 8, NULL, NULL, 0, 0, 3, 0),"
"('FLOAT', 6, 15, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'FLOAT', NULL, NULL, 'FLOAT', 2, -2, -1, 6, NULL, NULL, 0, 0, 3, 0),"
"('INTEGER', 4, 9, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'INTEGER', NULL, NULL, 'INTEGER', 9, 9, -1, 4, NULL, NULL, 0, 0, 3, 0),"
"('INTEGER SIGNED', 4, 9, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'INTEGER', NULL, NULL, 'SIGNED INTEGER', 9, 9, -1, 4, NULL, NULL, 0, 0, 3, 0),"
"('INTEGER UNSIGNED', 4, 10, NULL, NULL, NULL, 1, 0, 2, 1, 0, 0, 'INTEGER', NULL, NULL, 'UNSIGNED INTEGER', 10, 10, -1, -401, NULL, NULL, 0, 0, 3, 0),"
"('INTERVAL', 113, 0, '{INTERVAL ''', ''' MINUTE TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 3, 34, 100, 13, 2, 5, 6, 3, 0),"
"('INTERVAL', 105, 0, '{INTERVAL ''', ''' MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 0, 34, 100, 5, 2, 5, 5, 3, 0),"
"('INTERVAL', 101, 0, '{INTERVAL ''', ''' YEAR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 0, 34, 100, 1, 2, 1, 1, 3, 0),"
"('INTERVAL', 106, 0, '{INTERVAL ''', ''' SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 0, 34, 100, 6, 2, 6, 6, 3, 0),"
"('INTERVAL', 104, 0, '{INTERVAL ''', ''' HOUR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 0, 34, 100, 4, 2, 4, 4, 3, 0),"
"('INTERVAL', 107, 0, '{INTERVAL ''', ''' YEAR TO MONTH}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 3, 34, 100, 7, 2, 1, 2, 3, 0),"
"('INTERVAL', 108, 0, '{INTERVAL ''', ''' DAY TO HOUR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 3, 34, 100, 8, 2, 3, 4, 3, 0),"
"('INTERVAL', 102, 0, '{INTERVAL ''', ''' MONTH}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 0, 34, 100, 2, 2, 2, 2, 3, 0),"
"('INTERVAL', 111, 0, '{INTERVAL ''', ''' HOUR TO MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 3, 34, 100, 11, 2, 4, 5, 3, 0),"
"('INTERVAL', 112, 0, '{INTERVAL ''', ''' HOUR TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 6, 34, 100, 12, 2, 4, 6, 3, 0),"
"('INTERVAL', 110, 0, '{INTERVAL ''', ''' DAY TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 9, 34, 100, 10, 2, 3, 6, 3, 0),"
"('INTERVAL', 109, 0, '{INTERVAL ''', ''' DAY TO MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 6, 34, 100, 9, 2, 3, 5, 3, 0),"
"('INTERVAL', 103, 0, '{INTERVAL ''', ''' DAY}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', NULL, 0, 34, 100, 3, 2, 3, 3, 3, 0),"
"('NUMERIC', 2, 128, NULL, NULL, 'precision,scale', 1, 0, 2, 0, 0, 0, 'NUMERIC', 0, 128, 'NUMERIC', 10, -2, -3, 2, NULL, NULL, 0, 0, 3, 0),"
"('NUMERIC SIGNED', 2, 128, NULL, NULL, 'precision,scale', 1, 0, 2, 0, 0, 0, 'NUMERIC', 0, 128, 'SIGNED NUMERIC', 10, -2, -3, 2, NULL, NULL, 0, 0, 3, 0),"
"('NUMERIC UNSIGNED', 2, 128, NULL, NULL, 'precision,scale', 1, 0, 2, 1, 0, 0, 'NUMERIC', 0, 128, 'UNSIGNED NUMERIC', 10, -2, -3, 2, NULL, NULL, 0, 0, 3, 0),"
"('REAL', 7, 7, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'REAL', NULL, NULL, 'REAL', 2, 22, -1, 7, NULL, NULL, 0, 0, 3, 0),"
"('SMALLINT', 5, 5, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'SMALLINT', NULL, NULL, 'SMALLINT', 5, 5, -1, 5, NULL, NULL, 0, 0, 3, 0),"
"('SMALLINT SIGNED', 5, 5, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'SMALLINT', NULL, NULL, 'SIGNED SMALLINT', 5, 5, -1, 5, NULL, NULL, 0, 0, 3, 0),"
"('SMALLINT UNSIGNED', 5, 5, NULL, NULL, NULL, 1, 0, 2, 1, 0, 0, 'SMALLINT', NULL, NULL, 'UNSIGNED SMALLINT', 5, 5, -1, -502, NULL, NULL, 0, 0, 3, 0),"
"('TIME', 92, 8, '{t ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'TIME', NULL, NULL, 'TIME', NULL, 8, 6, 9, 2, NULL, 4, 6, 3, 0),"
"('TIMESTAMP', 93, 26, '{ts ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'TIMESTAMP', 0, 6, 'TIMESTAMP', NULL, 19, 16, 9, 3, NULL, 1, 6, 3, 0),"
"('VARCHAR', 12, 32000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'VARCHAR', NULL, NULL, 'VARCHAR', NULL, -1, -1, 12, NULL, NULL, 0, 0, 3, 0),"
"('LONG VARCHAR', -1, 2000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'LONG VARCHAR', NULL, NULL, 'VARCHAR', NULL, -1, -1, -1, NULL, NULL, 0, 0, 3, 0),"
"('TINYINT', -6, 3, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'TINYINT', NULL, NULL, 'TINYINT', 3, 3, -1, 4, NULL, NULL, 0, 0, 3, 0),"
"('TINYINT SIGNED', -6, 3, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'TINYINT', NULL, NULL, 'SIGNED TINYINT', 3, 3, -1, 4, NULL, NULL, 0, 0, 3, 0),"
"('TINYINT UNSIGNED', -6, 3, NULL, NULL, NULL, 1, 0, 2, 1, 0, 0, 'TINYINT', NULL, NULL, 'UNSIGNED TINYINT', 3, 3, -1, -404, NULL, NULL, 0, 0, 3, 0)"
" ) "
" dt(\"TYPE_NAME\", \"DATA_TYPE\", \"PREC\", \"LITERAL_PREFIX\", \"LITERAL_SUFFIX\", \"CREATE_PARAMS\", \"IS_NULLABLE\", \"CASE_SENSITIVE\", \"SEARCHABLE\","
"\"UNSIGNED_ATTRIBUTE\", \"FIXED_PREC_SCALE\", \"AUTO_UNIQUE_VALUE\", \"LOCAL_TYPE_NAME\", \"MINIMUM_SCALE\", \"MAXIMUM_SCALE\", \"SQL_TYPE_NAME\","
"\"NUM_PREC_RADIX\", \"USEPRECISION\", \"USELENGTH\", \"SQL_DATA_TYPE\", \"SQL_DATETIME_SUB\", \"INTERVAL_PRECISION\", \"DATETIMESTARTFIELD\","
"\"DATETIMEENDFIELD\", \"APPLICATION_VERSION\", \"TRANSLATION_ID\")"
" WHERE %s"
" ORDER BY 2,1 FOR READ UNCOMMITTED ACCESS ;", condExpression);
break;
}
case SQL_API_SQLPROCEDURES :
case SQL_API_SQLPROCEDURES_JDBC:
// strcpy((char *)catStmtLabel, "SQL_PROCEDURES_ANSI_Q4");
if (!checkIfWildCard(catalogNm, expCatalogNm) && !metadataId)
{
exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_WILDCARD_NOT_SUPPORTED;
goto MapException;
}
if (strcmp(catalogNm,"") == 0)
strcpy(tableName1,SEABASE_MD_CATALOG);
else
strcpy(tableName1,catalogNm);
tableParam[0] = tableName1;
tableParam[1] = NULL;
convertWildcardNoEsc(metadataId, TRUE, schemaNm, schemaNmNoEsc);
convertWildcard(metadataId, TRUE, schemaNm, expSchemaNm);
convertWildcardNoEsc(metadataId, TRUE, tableNm, tableNmNoEsc);
convertWildcard(metadataId, TRUE, tableNm, expTableNm);
inputParam[0] = schemaNmNoEsc;
inputParam[1] = expSchemaNm;
inputParam[2] = tableNmNoEsc;
inputParam[3] = expTableNm;
inputParam[4] = NULL;
if( APIType == SQL_API_SQLPROCEDURES )
{
snprintf(CatalogQuery,sizeof(CatalogQuery),
"select "
"cast('%s' as varchar(128) ) PROCEDURE_CAT, "
"cast(trim(SCHEMA_NAME) as varchar(128) ) PROCEDURE_SCHEM, "
"cast(trim(OBJECT_NAME) as varchar(128) ) PROCEDURE_NAME, "
"cast (NULL as smallint) NUM_INPUT_PARAMS, "
"cast (NULL as smallint) NUM_OUTPUT_PARAMS, "
"cast (NULL as smallint) NUM_RESULT_SETS, "
"cast (NULL as varchar(128)) REMARKS, "
"(case OBJECT_TYPE "
"when 'UR' then cast(1 as smallint) "
"else cast(0 as smallint) end) PROCEDURE_TYPE "
"from "
"TRAFODION.\"_MD_\".OBJECTS "
"where (SCHEMA_NAME = '%s' "
"or trim(SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
"and (OBJECT_NAME = '%s' "
"or trim(OBJECT_NAME) LIKE '%s' ESCAPE '\\') "
"and OBJECT_TYPE = 'UR' "
"FOR READ UNCOMMITTED ACCESS ORDER BY 4, 1, 2, 3 ;",
tableParam[0], inputParam[0], inputParam[1],
inputParam[2], inputParam[3]);
}
else
{
snprintf(CatalogQuery,sizeof(CatalogQuery),
"select "
"obj.CATALOG_NAME PROCEDURE_CAT, obj.SCHEMA_NAME PROCEDURE_SCHEMA,"
"obj.OBJECT_NAME PROCEDURE_NAME, cast(NULL as varchar(10)) R1,cast(NULL as varchar(10)) R2,"
"cast(NULL as varchar(10)) R3, cast(NULL as varchar(10)) REMARKS,"
"cast(case when routines.UDR_TYPE = 'P' then 1"
" when routines.UDR_TYPE = 'F' or routines.UDR_TYPE = 'T'"
" then 2 else 0 end as smallint) PROCEDURE_TYPE,"
"obj.OBJECT_NAME SPECIFIC_NAME "
"from "
"TRAFODION.\"_MD_\".OBJECTS obj "
"left join TRAFODION.\"_MD_\".ROUTINES routines on obj.OBJECT_UID = routines.UDR_UID "
"where (obj.SCHEMA_NAME = '%s' "
"or trim(obj.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
"and (obj.OBJECT_NAME = '%s' "
"or trim(obj.OBJECT_NAME) LIKE '%s' ESCAPE '\\') "
"and obj.OBJECT_TYPE = 'UR' "
"FOR READ UNCOMMITTED ACCESS ORDER BY 4, 1, 2, 3 ;",
inputParam[0], inputParam[1],
inputParam[2], inputParam[3]);
}
break;
case SQL_API_SQLPROCEDURECOLUMNS:
case SQL_API_SQLPROCEDURECOLUMNS_JDBC:
if (!checkIfWildCard(catalogNm, expCatalogNm) && !metadataId)
{
exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_WILDCARD_NOT_SUPPORTED;
goto MapException;
}
if (strcmp(catalogNm,"") == 0)
strcpy(tableName1,SEABASE_MD_CATALOG);
else
strcpy(tableName1,catalogNm);
tableParam[0] = tableName1;
tableParam[1] = NULL;
convertWildcardNoEsc(metadataId, TRUE, schemaNm, schemaNmNoEsc);
convertWildcard(metadataId, TRUE, schemaNm, expSchemaNm);
convertWildcardNoEsc(metadataId, TRUE, tableNm, tableNmNoEsc);
convertWildcard(metadataId, TRUE, tableNm, expTableNm);
convertWildcardNoEsc(metadataId, TRUE, columnNm, columnNmNoEsc);
convertWildcard(metadataId, TRUE, columnNm, expColumnNm);
inputParam[0] = schemaNmNoEsc;
inputParam[1] = expSchemaNm;
inputParam[2] = tableNmNoEsc;
inputParam[3] = expTableNm;
inputParam[4] = columnNmNoEsc;
inputParam[5] = expColumnNm;
inputParam[6] = NULL;
if( APIType == SQL_API_SQLPROCEDURECOLUMNS )
{
snprintf(CatalogQuery,sizeof(CatalogQuery),
"select obj.CATALOG_NAME PROCEDURE_CAT, obj.SCHEMA_NAME PROCEDURE_SCHEM,"
"obj.OBJECT_NAME PROCEDURE_NAME, cols.COLUMN_NAME COLUMN_NAME,"
"cast((case when cols.DIRECTION='I' then 1 when cols.DIRECTION='N' "
"then 2 when cols.DIRECTION='O' then 3 else 0 end) as smallint) COLUMN_TYPE,"
"cols.FS_DATA_TYPE DATA_TYPE, cols.SQL_DATA_TYPE TYPE_NAME,"
"cols.COLUMN_PRECISION \"PRECISION\", cols.COLUMN_SIZE LENGTH, cols.COLUMN_SCALE SCALE,"
"cast(1 as smallint) RADIX, cols.NULLABLE NULLABLE, cast(NULL as varchar(10)) REMARKS,"
"cols.DEFAULT_VALUE COLUMN_DEF, cols.FS_DATA_TYPE SQL_DATA_TYPE, cast(0 as smallint) SQL_DATETIME_SUB,"
"cols.COLUMN_SIZE CHAR_OCTET_LENGTH, cols.COLUMN_NUMBER ORDINAL_POSITION,"
"cols.NULLABLE IS_NULLABLE"
" from TRAFODION.\"_MD_\".OBJECTS obj"
" left join TRAFODION.\"_MD_\".COLUMNS cols on obj.OBJECT_UID=cols.OBJECT_UID"
" where"
" (obj.SCHEMA_NAME = '%s' or trim(obj.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
" and (obj.OBJECT_NAME = '%s' or trim(obj.OBJECT_NAME) LIKE '%s' ESCAPE '\\')"
" and (cols.COLUMN_NAME = '%s' or trim(cols.COLUMN_NAME) LIKE '%s' ESCAPE '\\')"
" order by PROCEDURE_CAT, PROCEDURE_SCHEM, PROCEDURE_NAME, ORDINAL_POSITION"
" FOR READ UNCOMMITTED ACCESS",
inputParam[0], inputParam[1],
inputParam[2], inputParam[3],
inputParam[4], inputParam[5]);
}
else
{
snprintf(CatalogQuery,sizeof(CatalogQuery),
"select obj.CATALOG_NAME PROCEDURE_CAT, obj.SCHEMA_NAME PROCEDURE_SCHEM,"
"obj.OBJECT_NAME PROCEDURE_NAME, cols.COLUMN_NAME COLUMN_NAME,"
"cast((case when cols.DIRECTION='I' then 1 when cols.DIRECTION='N' then 2 when cols.DIRECTION='O' then 3 else 0 end) as smallint) COLUMN_TYPE,"
"cols.FS_DATA_TYPE DATA_TYPE, cols.SQL_DATA_TYPE TYPE_NAME,"
"cols.COLUMN_PRECISION \"PRECISION\", cols.COLUMN_SIZE LENGTH, cols.COLUMN_SCALE SCALE,"
"cast(1 as smallint) RADIX, cols.NULLABLE NULLABLE, cast(NULL as varchar(10)) REMARKS,"
"cols.DEFAULT_VALUE COLUMN_DEF, cols.FS_DATA_TYPE SQL_DATA_TYPE, cast(0 as smallint) SQL_DATETIME_SUB,"
"cols.COLUMN_SIZE CHAR_OCTET_LENGTH, cols.COLUMN_NUMBER ORDINAL_POSITION,"
"cols.NULLABLE IS_NULLABLE, cols.COLUMN_NAME SPECIFIC_NAME"
" from TRAFODION.\"_MD_\".OBJECTS obj"
" left join TRAFODION.\"_MD_\".COLUMNS cols on obj.OBJECT_UID=cols.OBJECT_UID"
" where"
" (obj.SCHEMA_NAME = '%s' or trim(obj.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
" and (obj.OBJECT_NAME = '%s' or trim(obj.OBJECT_NAME) LIKE '%s' ESCAPE '\\')"
" and (cols.COLUMN_NAME = '%s' or trim(cols.COLUMN_NAME) LIKE '%s' ESCAPE '\\')"
" order by PROCEDURE_CAT, PROCEDURE_SCHEM, PROCEDURE_NAME, ORDINAL_POSITION"
" FOR READ UNCOMMITTED ACCESS",
inputParam[0], inputParam[1],
inputParam[2], inputParam[3],
inputParam[4], inputParam[5]);
}
break;
case SQL_API_SQLCOLUMNS :
case SQL_API_SQLCOLUMNS_JDBC :
if (!checkIfWildCard(catalogNm, catalogNmNoEsc) && !metadataId)
{
exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_WILDCARD_NOT_SUPPORTED;
goto MapException;
}
if (tableNm[0] != '$' && tableNm[0] != '\\')
{
if (strcmp(catalogNm,"") == 0)
strcpy(tableName1,SEABASE_MD_CATALOG);
else
strcpy(tableName1, catalogNm);
/*
if (APIType == SQL_API_SQLCOLUMNS)
strcpy((char *)catStmtLabel, "SQL_COLUMNS_UNICODE_Q4");
else
strcpy((char *)catStmtLabel, "SQL_JAVA_COLUMNS_ANSI_Q4");
*/
tableParam[0] = tableName1;
convertWildcard(metadataId, TRUE, schemaNm, expSchemaNm);
convertWildcardNoEsc(metadataId, TRUE, schemaNm, schemaNmNoEsc);
convertWildcard(metadataId, TRUE, tableNm, expTableNm);
convertWildcardNoEsc(metadataId, TRUE, tableNm, tableNmNoEsc);
convertWildcard(metadataId, TRUE, columnNm, expColumnNm);
convertWildcardNoEsc(metadataId, TRUE, columnNm, columnNmNoEsc);
inputParam[0] = schemaNmNoEsc;
inputParam[1] = expSchemaNm;
inputParam[2] = tableNmNoEsc;
inputParam[3] = expTableNm;
inputParam[4] = columnNmNoEsc;
inputParam[5] = expColumnNm;
inputParam[6] = odbcAppVersion;
inputParam[7] = NULL;
if (strncmp(odbcAppVersion, "3", 1) == 0)
{
snprintf(CatalogQuery,sizeof(CatalogQuery),
"select "
"cast('%s' as varchar(128) ) TABLE_CAT, "
"cast(trim(ob.SCHEMA_NAME) as varchar(128) ) TABLE_SCHEM, "
"cast(trim(ob.OBJECT_NAME) as varchar(128) ) TABLE_NAME, "
"cast(trim(co.COLUMN_NAME) as varchar(128) ) COLUMN_NAME, "
"cast((case when co.FS_DATA_TYPE = 0 and co.character_set = 'UCS2' then -8 "
"when co.FS_DATA_TYPE = 64 and co.character_set = 'UCS2' then -9 else dt.DATA_TYPE end) as smallint) DATA_TYPE, "
"trim(dt.TYPE_NAME) TYPE_NAME, "
"cast((case when co.FS_DATA_TYPE = 0 and co.character_set = 'UCS2' then co.COLUMN_SIZE/2 "
"when co.FS_DATA_TYPE = 64 and co.character_set = 'UCS2' then co.COLUMN_SIZE/2 "
"when dt.USEPRECISION = -1 then co.COLUMN_SIZE when dt.USEPRECISION = -2 then co.COLUMN_PRECISION "
"when co.FS_DATA_TYPE = 192 then dt.USEPRECISION "
"when co.FS_DATA_TYPE >= 195 and co.FS_DATA_TYPE <= 207 then dt.USEPRECISION + 1 "
"else dt.USEPRECISION end) as integer) COLUMN_SIZE, "
"cast((case when dt.USELENGTH = -1 then co.COLUMN_SIZE when dt.USELENGTH = -2 then co.COLUMN_PRECISION "
"when dt.USELENGTH = -3 then co.COLUMN_PRECISION + 2 "
"else dt.USELENGTH end) as integer) BUFFER_LENGTH, "
"cast(co.COLUMN_SCALE as smallint) DECIMAL_DIGITS, "
"cast(dt.NUM_PREC_RADIX as smallint) NUM_PREC_RADIX, "
"cast(co.NULLABLE as smallint) NULLABLE, "
"cast('' as varchar(128)) REMARKS, "
"trim(co.DEFAULT_VALUE) COLUMN_DEF, "
"cast((case when co.FS_DATA_TYPE = 0 and co.character_set = 'UCS2' then -8 "
"when co.FS_DATA_TYPE = 64 and co.character_set = 'UCS2' then -9 else dt.SQL_DATA_TYPE end) as smallint) SQL_DATA_TYPE, "
"cast(dt.SQL_DATETIME_SUB as smallint) SQL_DATETIME_SUB, cast((case dt.DATA_TYPE when 1 then co.COLUMN_SIZE "
"when -1 then co.COLUMN_SIZE when 12 then co.COLUMN_SIZE else NULL end) as integer) CHAR_OCTET_LENGTH, "
"cast((case when (trim(co1.COLUMN_CLASS) <> 'S') then co.column_number+1 else "
"co.column_number end) as integer) ORDINAL_POSITION, "
"cast((case when co.NULLABLE = 0 then 'NO' else 'YES' end) as varchar(3)) IS_NULLABLE "
"from "
"TRAFODION.\"_MD_\".objects ob, "
"TRAFODION.\"_MD_\".columns co, "
"TRAFODION.\"_MD_\".columns co1, "
"(VALUES ("
"cast('BIGINT' as varchar(128)),cast(-5 as smallint), cast(19 as integer), cast (NULL as varchar(128)), cast (NULL as varchar(128)), "
"cast (NULL as varchar(128)), cast(1 as smallint), cast(0 as smallint), cast(2 as smallint) , cast(0 as smallint), cast(0 as smallint), "
"cast(0 as smallint), cast('LARGEINT' as varchar(128)), cast(NULL as smallint), cast(NULL as smallint), cast('SIGNED LARGEINT' as varchar(128)), cast(134 as integer), "
"cast(10 as smallint), cast(19 as integer), cast(20 as integer), cast(-402 as smallint), cast(NULL as smallint), cast(NULL as smallint), "
"cast(0 as smallint), cast(0 as smallint), cast(3 as smallint), cast(0 as smallint)), "
"('CHAR', 1, 32000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'CHARACTER', NULL, NULL, 'CHARACTER', 0, NULL, -1, -1, 1, NULL, NULL, 0, 0, 3, 0), "
"('DATE', 91, 10, '{d ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'DATE', NULL, NULL, 'DATE', 192, NULL, 10, 6, 9, 1, NULL, 1, 3, 3, 0), "
"('DECIMAL', 3, 18, NULL, NULL, 'precision,scale', 1, 0, 2, 0, 0, 0, 'DECIMAL', 0, 18, 'SIGNED DECIMAL', 152, 10, -2, -3, 3, NULL, NULL, 0, 0, 3, 0), "
"('DECIMAL UNSIGNED', 3, 18, NULL, NULL, 'precision,scale', 1, 0, 2, 1, 0, 0, 'DECIMAL', 0, 18, 'UNSIGNED DECIMAL', 150, 10, -2, -3, -301, NULL, NULL, 0, 0, 3, 0), "
"('DOUBLE PRECISION', 8, 15, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'DOUBLE', NULL, NULL, 'DOUBLE', 143, 2, 54, -1, 8, NULL, NULL, 0, 0, 3, 0), "
"('INTEGER', 4, 10, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'INTEGER', NULL, NULL, 'SIGNED INTEGER', 132, 10, 10, -1, 4, NULL, NULL, 0, 0, 3, 0), "
"('INTEGER UNSIGNED', 4, 10, NULL, NULL, NULL, 1, 0, 2, 1, 0, 0, 'INTEGER', NULL, NULL, 'UNSIGNED INTEGER', 133, 10, 10, -1, -401, NULL, NULL, 0, 0, 3, 0), "
"('INTERVAL', 113, 0, '{INTERVAL ''', ''' MINUTE TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 205, NULL, 3, 34, 100, 13, 2, 5, 6, 3, 0), "
"('INTERVAL', 105, 0, '{INTERVAL ''', ''' MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 201, NULL, 0, 34, 100, 5, 2, 5, 5, 3, 0), "
"('INTERVAL', 101, 0, '{INTERVAL ''', ''' YEAR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 195, NULL, 0, 34, 100, 1, 2, 1, 1, 3, 0), "
"('INTERVAL', 106, 0, '{INTERVAL ''', ''' SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 204, NULL, 0, 34, 100, 6, 2, 6, 6, 3, 0), "
"('INTERVAL', 104, 0, '{INTERVAL ''', ''' HOUR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 199, NULL, 0, 34, 100, 4, 2, 4, 4, 3, 0), "
"('INTERVAL', 107, 0, '{INTERVAL ''', ''' YEAR TO MONTH}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 197, NULL, 3, 34, 100, 7, 2, 1, 2, 3, 0), "
"('INTERVAL', 108, 0, '{INTERVAL ''', ''' DAY TO HOUR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 200, NULL, 3, 34, 100, 8, 2, 3, 4, 3, 0), "
"('INTERVAL', 102, 0, '{INTERVAL ''', ''' MONTH}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 196, NULL, 0, 34, 100, 2, 2, 2, 2, 3, 0), "
"('INTERVAL', 111, 0, '{INTERVAL ''', ''' HOUR TO MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 202, NULL, 3, 34, 100, 11, 2, 4, 5, 3, 0), "
"('INTERVAL', 112, 0, '{INTERVAL ''', ''' HOUR TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 206, NULL, 6, 34, 100, 12, 2, 4, 6, 3, 0), "
"('INTERVAL', 110, 0, '{INTERVAL ''', ''' DAY TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 207, NULL, 9, 34, 100, 10, 2, 3, 6, 3, 0), "
"('INTERVAL', 109, 0, '{INTERVAL ''', ''' DAY TO MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 203, NULL, 6, 34, 100, 9, 2, 3, 5, 3, 0), "
"('INTERVAL', 103, 0, '{INTERVAL ''', ''' DAY}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 198, NULL, 0, 34, 100, 3, 2, 3, 3, 3, 0), "
"('NUMERIC', 2, 128, NULL, NULL, 'precision,scale', 1, 0, 2, 0, 0, 0, 'NUMERIC', 0, 128, 'SIGNED NUMERIC', 156, 10, -2, -3, 2, NULL, NULL, 0, 0, 3, 0), "
"('NUMERIC UNSIGNED', 2, 128, NULL, NULL, 'precision,scale', 1, 0, 2, 1, 0, 0, 'NUMERIC', 0, 128, 'UNSIGNED NUMERIC', 155, 10, -2, -3, 2, NULL, NULL, 0, 0, 3, 0), "
"('REAL', 7, 7, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'REAL', NULL, NULL, 'REAL', 142, 2, 22, -1, 7, NULL, NULL, 0, 0, 3, 0), "
"('SMALLINT', 5, 5, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'SMALLINT', NULL, NULL, 'SIGNED SMALLINT', 130, 10, 5, -1, 5, NULL, NULL, 0, 0, 3, 0), "
"('SMALLINT UNSIGNED', 5, 5, NULL, NULL, NULL, 1, 0, 2, 1, 0, 0, 'SMALLINT', NULL, NULL, 'UNSIGNED SMALLINT', 131, 10, 5, -1, -502, NULL, NULL, 0, 0, 3, 0), "
"('TIME', 92, 8, '{t ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'TIME', NULL, NULL, 'TIME', 192, NULL, 8, 6, 9, 2, NULL, 4, 6, 3, 0), "
"('TIMESTAMP', 93, 26, '{ts ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'TIMESTAMP', 0, 6, 'TIMESTAMP', 192, NULL, 19, 16, 9, 3, NULL, 1, 6, 3, 0), "
"('VARCHAR', 12, 32000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'VARCHAR', NULL, NULL, 'VARCHAR', 64, NULL, -1, -1, 12, NULL, NULL, 0, 0, 3, 0) "
" ) "
"dt(\"TYPE_NAME\", \"DATA_TYPE\", \"PREC\", \"LITERAL_PREFIX\", \"LITERAL_SUFFIX\", \"CREATE_PARAMS\", \"IS_NULLABLE\", \"CASE_SENSITIVE\", \"SEARCHABLE\", "
"\"UNSIGNED_ATTRIBUTE\", \"FIXED_PREC_SCALE\", \"AUTO_UNIQUE_VALUE\", \"LOCAL_TYPE_NAME\", \"MINIMUM_SCALE\", \"MAXIMUM_SCALE\", \"SQL_TYPE_NAME\", \"FS_DATA_TYPE\", "
"\"NUM_PREC_RADIX\", \"USEPRECISION\", \"USELENGTH\", \"SQL_DATA_TYPE\", \"SQL_DATETIME_SUB\", \"INTERVAL_PRECISION\", \"DATETIMESTARTFIELD\", "
"\"DATETIMEENDFIELD\", \"APPLICATION_VERSION\", \"TRANSLATION_ID\") "
"where ob.OBJECT_UID = co.OBJECT_UID "
"and dt.FS_DATA_TYPE = co.FS_DATA_TYPE "
"and co.OBJECT_UID = co1.OBJECT_UID and co1.COLUMN_NUMBER = 0 "
"and (dt.DATETIMESTARTFIELD = co.DATETIME_START_FIELD) "
"and (dt.DATETIMEENDFIELD = co.DATETIME_END_FIELD) "
"and (ob.SCHEMA_NAME = '%s' or trim(ob.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
"and (ob.OBJECT_NAME = '%s' or trim(ob.OBJECT_NAME) LIKE '%s' ESCAPE '\\') "
"and (co.COLUMN_NAME = '%s' or trim(co.COLUMN_NAME) LIKE '%s' ESCAPE '\\') "
"and (ob.OBJECT_TYPE in ('BT' , 'VI') ) "
"and (trim(co.COLUMN_CLASS) not in ('S', 'M')) "
"and dt.APPLICATION_VERSION = %s "
"FOR READ UNCOMMITTED ACCESS order by 1, 2, 3, co.COLUMN_NUMBER ; ",
tableParam[0], inputParam[0], inputParam[1],
inputParam[2], inputParam[3], inputParam[4],
inputParam[5], inputParam[6]);
}
else
{
snprintf(CatalogQuery,sizeof(CatalogQuery),
"select "
"cast('%s' as varchar(128) ) TABLE_CAT, "
"cast(trim(ob.SCHEMA_NAME) as varchar(128) ) TABLE_SCHEM, "
"cast(trim(ob.OBJECT_NAME) as varchar(128) ) TABLE_NAME, "
"cast(trim(co.COLUMN_NAME) as varchar(128) ) COLUMN_NAME, "
"cast((case when co.FS_DATA_TYPE = 0 and co.character_set = 'UCS2' then -8 "
"when co.FS_DATA_TYPE = 64 and co.character_set = 'UCS2' then -9 else dt.DATA_TYPE end) as smallint) DATA_TYPE, "
"trim(dt.TYPE_NAME) TYPE_NAME, "
"cast((case when co.FS_DATA_TYPE = 0 and co.character_set = 'UCS2' then co.COLUMN_SIZE/2 "
"when co.FS_DATA_TYPE = 64 and co.character_set = 'UCS2' then co.COLUMN_SIZE/2 "
"when dt.USEPRECISION = -1 then co.COLUMN_SIZE when dt.USEPRECISION = -2 then co.COLUMN_PRECISION "
"when co.FS_DATA_TYPE = 192 then dt.USEPRECISION + 1 "
"when co.FS_DATA_TYPE >= 195 and co.FS_DATA_TYPE <= 207 then dt.USEPRECISION + 1 "
"else dt.USEPRECISION end) as integer) COLUMN_SIZE, "
"cast((case when dt.USELENGTH = -1 then co.COLUMN_SIZE when dt.USELENGTH = -2 then co.COLUMN_PRECISION "
"when dt.USELENGTH = -3 then co.COLUMN_PRECISION + 2 "
"else dt.USELENGTH end) as integer) BUFFER_LENGTH, "
"cast(co.COLUMN_SCALE as smallint) DECIMAL_DIGITS, "
"cast(dt.NUM_PREC_RADIX as smallint) NUM_PREC_RADIX, "
"cast(co.NULLABLE as smallint) NULLABLE, "
"cast('' as varchar(128)) REMARKS "
"from "
"TRAFODION.\"_MD_\".objects ob, "
"TRAFODION.\"_MD_\".columns co, "
"TRAFODION.\"_MD_\".columns co1, "
"(VALUES ("
"cast('BIGINT' as varchar(128)),cast(-5 as smallint), cast(19 as integer), cast (NULL as varchar(128)), cast (NULL as varchar(128)), "
"cast (NULL as varchar(128)), cast(1 as smallint), cast(0 as smallint), cast(2 as smallint) , cast(0 as smallint), cast(0 as smallint), "
"cast(0 as smallint), cast('LARGEINT' as varchar(128)), cast(NULL as smallint), cast(NULL as smallint), cast('SIGNED LARGEINT' as varchar(128)), cast(134 as integer), "
"cast(10 as smallint), cast(19 as integer), cast(20 as integer), cast(-402 as smallint), cast(NULL as smallint), cast(NULL as smallint), "
"cast(0 as smallint), cast(0 as smallint), cast(3 as smallint), cast(0 as smallint)), "
"('CHAR', 1, 32000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'CHARACTER', NULL, NULL, 'CHARACTER', 0, NULL, -1, -1, 1, NULL, NULL, 0, 0, 3, 0), "
"('DATE', 91, 10, '{d ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'DATE', NULL, NULL, 'DATE', 192, NULL, 10, 6, 9, 1, NULL, 1, 3, 3, 0), "
"('DECIMAL', 3, 18, NULL, NULL, 'precision,scale', 1, 0, 2, 0, 0, 0, 'DECIMAL', 0, 18, 'SIGNED DECIMAL', 152, 10, -2, -3, 3, NULL, NULL, 0, 0, 3, 0), "
"('DECIMAL UNSIGNED', 3, 18, NULL, NULL, 'precision,scale', 1, 0, 2, 1, 0, 0, 'DECIMAL', 0, 18, 'UNSIGNED DECIMAL', 150, 10, -2, -3, -301, NULL, NULL, 0, 0, 3, 0), "
"('DOUBLE PRECISION', 8, 15, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'DOUBLE', NULL, NULL, 'DOUBLE', 143, 2, 54, -1, 8, NULL, NULL, 0, 0, 3, 0), "
"('INTEGER', 4, 10, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'INTEGER', NULL, NULL, 'SIGNED INTEGER', 132, 10, 10, -1, 4, NULL, NULL, 0, 0, 3, 0), "
"('INTEGER UNSIGNED', 4, 10, NULL, NULL, NULL, 1, 0, 2, 1, 0, 0, 'INTEGER', NULL, NULL, 'UNSIGNED INTEGER', 133, 10, 10, -1, -401, NULL, NULL, 0, 0, 3, 0), "
"('INTERVAL', 113, 0, '{INTERVAL ''', ''' MINUTE TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 205, NULL, 3, 34, 100, 13, 2, 5, 6, 3, 0), "
"('INTERVAL', 105, 0, '{INTERVAL ''', ''' MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 201, NULL, 0, 34, 100, 5, 2, 5, 5, 3, 0), "
"('INTERVAL', 101, 0, '{INTERVAL ''', ''' YEAR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 195, NULL, 0, 34, 100, 1, 2, 1, 1, 3, 0), "
"('INTERVAL', 106, 0, '{INTERVAL ''', ''' SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 204, NULL, 0, 34, 100, 6, 2, 6, 6, 3, 0), "
"('INTERVAL', 104, 0, '{INTERVAL ''', ''' HOUR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 199, NULL, 0, 34, 100, 4, 2, 4, 4, 3, 0), "
"('INTERVAL', 107, 0, '{INTERVAL ''', ''' YEAR TO MONTH}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 197, NULL, 3, 34, 100, 7, 2, 1, 2, 3, 0), "
"('INTERVAL', 108, 0, '{INTERVAL ''', ''' DAY TO HOUR}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 200, NULL, 3, 34, 100, 8, 2, 3, 4, 3, 0), "
"('INTERVAL', 102, 0, '{INTERVAL ''', ''' MONTH}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 196, NULL, 0, 34, 100, 2, 2, 2, 2, 3, 0), "
"('INTERVAL', 111, 0, '{INTERVAL ''', ''' HOUR TO MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 202, NULL, 3, 34, 100, 11, 2, 4, 5, 3, 0), "
"('INTERVAL', 112, 0, '{INTERVAL ''', ''' HOUR TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 206, NULL, 6, 34, 100, 12, 2, 4, 6, 3, 0), "
"('INTERVAL', 110, 0, '{INTERVAL ''', ''' DAY TO SECOND}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 207, NULL, 9, 34, 100, 10, 2, 3, 6, 3, 0), "
"('INTERVAL', 109, 0, '{INTERVAL ''', ''' DAY TO MINUTE}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 203, NULL, 6, 34, 100, 9, 2, 3, 5, 3, 0), "
"('INTERVAL', 103, 0, '{INTERVAL ''', ''' DAY}', NULL, 1, 0, 2, 0, 0, NULL, 'INTERVAL', 0, 0, 'INTERVAL', 198, NULL, 0, 34, 100, 3, 2, 3, 3, 3, 0), "
"('NUMERIC', 2, 128, NULL, NULL, 'precision,scale', 1, 0, 2, 0, 0, 0, 'NUMERIC', 0, 128, 'SIGNED NUMERIC', 156, 10, -2, -3, 2, NULL, NULL, 0, 0, 3, 0), "
"('NUMERIC UNSIGNED', 2, 128, NULL, NULL, 'precision,scale', 1, 0, 2, 1, 0, 0, 'NUMERIC', 0, 128, 'UNSIGNED NUMERIC', 155, 10, -2, -3, 2, NULL, NULL, 0, 0, 3, 0), "
"('REAL', 7, 7, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'REAL', NULL, NULL, 'REAL', 142, 2, 22, -1, 7, NULL, NULL, 0, 0, 3, 0), "
"('SMALLINT', 5, 5, NULL, NULL, NULL, 1, 0, 2, 0, 0, 0, 'SMALLINT', NULL, NULL, 'SIGNED SMALLINT', 130, 10, 5, -1, 5, NULL, NULL, 0, 0, 3, 0), "
"('SMALLINT UNSIGNED', 5, 5, NULL, NULL, NULL, 1, 0, 2, 1, 0, 0, 'SMALLINT', NULL, NULL, 'UNSIGNED SMALLINT', 131, 10, 5, -1, -502, NULL, NULL, 0, 0, 3, 0), "
"('TIME', 92, 8, '{t ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'TIME', NULL, NULL, 'TIME', 192, NULL, 8, 6, 9, 2, NULL, 4, 6, 3, 0), "
"('TIMESTAMP', 93, 26, '{ts ''', '''}', NULL, 1, 0, 2, NULL, 0, NULL, 'TIMESTAMP', 0, 6, 'TIMESTAMP', 192, NULL, 19, 16, 9, 3, NULL, 1, 6, 3, 0), "
"('VARCHAR', 12, 32000, '''', '''', 'max length', 1, 1, 3, NULL, 0, NULL, 'VARCHAR', NULL, NULL, 'VARCHAR', 64, NULL, -1, -1, 12, NULL, NULL, 0, 0, 3, 0) "
" ) "
"dt(\"TYPE_NAME\", \"DATA_TYPE\", \"PREC\", \"LITERAL_PREFIX\", \"LITERAL_SUFFIX\", \"CREATE_PARAMS\", \"IS_NULLABLE\", \"CASE_SENSITIVE\", \"SEARCHABLE\", "
"\"UNSIGNED_ATTRIBUTE\", \"FIXED_PREC_SCALE\", \"AUTO_UNIQUE_VALUE\", \"LOCAL_TYPE_NAME\", \"MINIMUM_SCALE\", \"MAXIMUM_SCALE\", \"SQL_TYPE_NAME\", \"FS_DATA_TYPE\", "
"\"NUM_PREC_RADIX\", \"USEPRECISION\", \"USELENGTH\", \"SQL_DATA_TYPE\", \"SQL_DATETIME_SUB\", \"INTERVAL_PRECISION\", \"DATETIMESTARTFIELD\", "
"\"DATETIMEENDFIELD\", \"APPLICATION_VERSION\", \"TRANSLATION_ID\") "
"where ob.OBJECT_UID = co.OBJECT_UID "
"and dt.FS_DATA_TYPE = co.FS_DATA_TYPE "
"and co.OBJECT_UID = co1.OBJECT_UID and co1.COLUMN_NUMBER = 0 "
"and (dt.DATETIMESTARTFIELD = co.DATETIME_START_FIELD) "
"and (dt.DATETIMEENDFIELD = co.DATETIME_END_FIELD) "
"and (ob.SCHEMA_NAME = '%s' or trim(ob.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
"and (ob.OBJECT_NAME = '%s' or trim(ob.OBJECT_NAME) LIKE '%s' ESCAPE '\\') "
"and (co.COLUMN_NAME = '%s' or trim(co.COLUMN_NAME) LIKE '%s' ESCAPE '\\') "
"and (ob.OBJECT_TYPE in ('BT' , 'VI') ) "
"and (trim(co.COLUMN_CLASS) not in ('S', 'M')) "
"FOR READ UNCOMMITTED ACCESS order by 1, 2, 3, co.COLUMN_NUMBER ; ",
tableParam[0], inputParam[0], inputParam[1],
inputParam[2], inputParam[3], inputParam[4],
inputParam[5]);
}
}
break;
case SQL_API_SQLPRIMARYKEYS :
if ((!checkIfWildCard(catalogNm, catalogNmNoEsc) || !checkIfWildCard(schemaNm, schemaNmNoEsc) || !checkIfWildCard(tableNm, tableNmNoEsc)) && !metadataId)
{
exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_WILDCARD_NOT_SUPPORTED;
goto MapException;
}
// strcpy((char *)catStmtLabel, "SQL_PRIMARYKEYS_ANSI_Q4");
if (strcmp(catalogNm,"") == 0)
strcpy(tableName1,SEABASE_MD_CATALOG);
else
strcpy(tableName1, catalogNm);
tableParam[0] = tableName1;
/*
strcpy(tableName2, SEABASE_MD_CATALOG);
strcat(tableName2, ".");
strcat(tableName2, SEABASE_MD_SCHEMA);
strcat(tableName2, ".");
strcat(tableName2, smdCatAPITablesList[OBJECTS]);
tableParam[1] = tableName2;
strcpy(tableName3, SEABASE_MD_CATALOG);
strcat(tableName3, ".");
strcat(tableName3, SEABASE_MD_SCHEMA);
strcat(tableName3, ".");
strcat(tableName3, smdCatAPITablesList[KEYS]);
tableParam[2] = tableName3;
tableParam[3] = NULL;
*/
convertWildcard(metadataId, TRUE, schemaNm, expSchemaNm);
convertWildcardNoEsc(metadataId, TRUE, schemaNm, schemaNmNoEsc);
convertWildcard(metadataId, TRUE, tableNm, expTableNm);
convertWildcardNoEsc(metadataId, TRUE, tableNm, tableNmNoEsc);
inputParam[0] = schemaNmNoEsc;
inputParam[1] = expSchemaNm;
inputParam[2] = tableNmNoEsc;
inputParam[3] = expTableNm;
inputParam[4] = NULL;
snprintf(CatalogQuery,sizeof(CatalogQuery),
"select "
"cast('%s' as varchar(128) ) TABLE_CAT,"
"cast(trim(ob.SCHEMA_NAME) as varchar(128) ) TABLE_SCHEM,"
"cast(trim(ob.OBJECT_NAME) as varchar(128) ) TABLE_NAME,"
"trim(ky.COLUMN_NAME) COLUMN_NAME,"
"cast((ky.keyseq_number) as smallint) KEY_SEQ,"
"trim(ob.OBJECT_NAME) PK_NAME "
" from TRAFODION.\"_MD_\".OBJECTS ob, "
"TRAFODION.\"_MD_\".KEYS ky "
" where (ob.SCHEMA_NAME = '%s' or "
" trim(ob.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
" and (ob.OBJECT_NAME = '%s' or "
" trim(ob.OBJECT_NAME) LIKE '%s' ESCAPE '\\') "
" and ob.OBJECT_UID = ky.OBJECT_UID and ky.COLUMN_NAME <> '_SALT_' "
" FOR READ UNCOMMITTED ACCESS order by 1, 2, 3, 5 ;",
tableParam[0], inputParam[0], inputParam[1],
inputParam[2], inputParam[3]);
break;
case SQL_API_SQLFOREIGNKEYS:
if ((!checkIfWildCard(catalogNm, catalogNmNoEsc) ||
!checkIfWildCard(schemaNm, schemaNmNoEsc) ||
!checkIfWildCard(tableNm, tableNmNoEsc)) &&
!metadataId)
{
exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_WILDCARD_NOT_SUPPORTED;
goto MapException;
}
convertWildcard(metadataId, TRUE, schemaNm, expSchemaNm);
convertWildcardNoEsc(metadataId, TRUE, schemaNm, schemaNmNoEsc);
convertWildcard(metadataId, TRUE, tableNm, expTableNm);
convertWildcardNoEsc(metadataId, TRUE, tableNm, tableNmNoEsc);
char fkcatalogNmNoEsc[MAX_ANSI_NAME_LEN + 1];
char fkschemaNmNoEsc[MAX_ANSI_NAME_LEN + 1];
char fktableNmNoEsc[MAX_ANSI_NAME_LEN + 1];
char fkexpCatalogNm[MAX_ANSI_NAME_LEN + 1];
char fkexpSchemaNm[MAX_ANSI_NAME_LEN + 1];
char fkexpTableNm[MAX_ANSI_NAME_LEN + 1];
if (strcmp(fktableNm, "") == 0)
strcpy((char *)fktableNm, "%");
if (strcmp(fkschemaNm, "") == 0)
strcpy((char *)fkschemaNm, "%");
convertWildcard(metadataId, TRUE, fkcatalogNm, fkexpCatalogNm);
convertWildcardNoEsc(metadataId, TRUE, fkcatalogNm, fkcatalogNmNoEsc);
convertWildcard(metadataId, TRUE, fkschemaNm, fkexpSchemaNm);
convertWildcardNoEsc(metadataId, TRUE, fkschemaNm, fkschemaNmNoEsc);
convertWildcard(metadataId, TRUE, fktableNm, fkexpTableNm);
convertWildcardNoEsc(metadataId, TRUE, fktableNm, fktableNmNoEsc);
snprintf(CatalogQuery, sizeof(CatalogQuery),
"select "
"cast(PKCO.CATALOG_NAME as varchar(128)) PKTABLE_CAT, "
"cast(PKCO.SCHEMA_NAME as varchar(128)) PKTABLE_SCHEM, "
"cast(PKCO.TABLE_NAME as varchar(128)) PKTABLE_NAME, "
"cast(PKCO.COLUMN_NAME as varchar(128)) PKCOLUMN_NAME, "
"cast(FKCO.CATALOG_NAME as varchar(128)) FKTABLE_CAT, "
"cast(PKCO.SCHEMA_NAME as varchar(128)) FKTABLE_SCHEM, "
"cast(FKCO.TABLE_NAME as varchar(128)) FKTABLE_NAME, "
"cast(FKCO.COLUMN_NAME as varchar(128)) FKCOLUMN_NAME, "
"cast(FKKV.ORDINAL_POSITION as smallint) KEY_SEQ, "
"cast(0 as smallint) update_rule, " // not support
"cast(0 as smallint) delete_rule, " // not support
"cast(FKKV.CONSTRAINT_NAME as varchar(128)) FK_NAME, "
"cast(PKKV.CONSTRAINT_NAME as varchar(128)) PK_NAME, "
"cast(0 as smallint) DEFERRABILITY " // not support
"from "
"TRAFODION.\"_MD_\".REF_CONSTRAINTS_VIEW rcv, "
"TRAFODION.\"_MD_\".KEYS_VIEW PKKV, "
"TRAFODION.\"_MD_\".KEYS_VIEW FKKV, "
"TRAFODION.\"_MD_\".COLUMNS_VIEW PKCO, "
"TRAFODION.\"_MD_\".COLUMNS_VIEW FKCO "
"where "
"FKKV.CONSTRAINT_NAME = rcv.CONSTRAINT_NAME "
"and PKKV.CONSTRAINT_NAME = rcv.UNIQUE_CONSTRAINT_NAME "
"and PKCO.TABLE_NAME = PKKV.TABLE_NAME "
"and FKCO.TABLE_NAME = FKKV.TABLE_NAME "
"and PKCO.COLUMN_NAME = PKKV.COLUMN_NAME "
"and FKCO.COLUMN_NAME = FKKV.COLUMN_NAME "
"and (PKCO.SCHEMA_NAME = '%s' or trim(PKCO.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
"and (PKCO.TABLE_NAME = '%s' or trim(PKCO.TABLE_NAME) LIKE '%s' ESCAPE '\\') "
"and (FKCO.SCHEMA_NAME = '%s' or trim(FKCO.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
"and (FKCO.TABLE_NAME = '%s' or trim(FKCO.TABLE_NAME) LIKE '%s' ESCAPE '\\') "
"FOR READ UNCOMMITTED ACCESS ORDER BY 1, 2, 3, 5, 6, 7, 9;",
schemaNmNoEsc, expSchemaNm,
tableNmNoEsc, expTableNm,
fkschemaNmNoEsc, fkexpSchemaNm,
fktableNmNoEsc, fkexpTableNm
);
break;
case SQL_API_SQLSTATISTICS:
if (!checkIfWildCard(catalogNm, catalogNmNoEsc) && !metadataId)
{
exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_WILDCARD_NOT_SUPPORTED;
}
if (tableNm[0] != '$' && tableNm[0] != '\\')
{
if (strcmp(catalogNm, "") == 0)
strcpy(tableName1, SEABASE_MD_CATALOG);
else
strcpy(tableName1, catalogNm);
}
tableParam[0] = tableName1;
convertWildcard(metadataId, TRUE, schemaNm, expSchemaNm);
convertWildcardNoEsc(metadataId, TRUE, schemaNm, schemaNmNoEsc);
convertWildcard(metadataId, TRUE, tableNm, expTableNm);
convertWildcardNoEsc(metadataId, TRUE, tableNm, tableNmNoEsc);
inputParam[0] = schemaNmNoEsc;
inputParam[1] = expSchemaNm;
inputParam[2] = tableNmNoEsc;
inputParam[3] = expTableNm;
snprintf(CatalogQuery, sizeof(CatalogQuery),
"select "
"cast('%s' as varchar(128)) TABLE_CAT, "
"cast(trim(ob.SCHEMA_NAME) as varchar(128)) TABLE_SCHEM, "
"cast(trim(ob.OBJECT_NAME) as varchar(128)) TABLE_NAME, "
"cast(NULL as smallint) NON_UNIQUE, " // return NULL if TYPE is SQL_TABLE_STAT
"cast(NULL as varchar(128)) INDEX_QUALIFIER, " // return NULL if TYPE is SQL_TABLE_STAT
"cast(NULL as varchar(128)) INDEX_NAME, " // return NULL if TYPE is SQL_TABLE_STAT
"cast(0 as smallint) TYPE, " // TYPE is SQL_TABLE_STAT
"cast(NULL as smallint) ORDINAL_POSITION, " // return NULL if TYPE is SQL_TABLE_STAT
"cast(trim(co.COLUMN_NAME) as varchar(128)) COLUMN_NAME, "
"cast(NULL as char(1)) ASC_OR_DESC, " // return NULL if TYPE is SQL_TABLE_STAT
"cast(sb.rowcount as integer) CARDINALITY, " // number of rows
"cast(NULL as integer) PAGES, " // not support
"cast(NULL as varchar(128)) FILTER_CONDITION " // not support
"from "
"TRAFODION.\"_MD_\".OBJECTS ob, "
"TRAFODION.\"_MD_\".COLUMNS co, "
"TRAFODION.%s.sb_histograms sb "
"where "
"ob.OBJECT_UID = co.OBJECT_UID "
"and co.OBJECT_UID = sb.TABLE_UID "
"and co.COLUMN_NUMBER = sb.COLUMN_NUMBER "
"and sb.colcount = 1 "
"and (ob.SCHEMA_NAME = '%s' or trim(ob.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
"and (ob.OBJECT_NAME = '%s' or trim(ob.OBJECT_NAME) LIKE '%s' ESCAPE '\\') "
"and (ob.OBJECT_TYPE in ('BT', 'VI')) "
"and (trim(co.COLUMN_CLASS) not in('S', 'M')) "
"union "
"select "
"cast('%s' as varchar(128)) TABLE_CAT, "
"cast(trim(ob_table.SCHEMA_NAME) as varchar(128)) TABLE_SCHEM, "
"cast(trim(ob_table.OBJECT_NAME) as varchar(128)) TABLE_NAME, "
"cast(case when idx.is_unique = 1 then 0 else 1 end as smallint) NON_UNIQUE, "
"cast(NULL as varchar(128)) INDEX_QUALIFIER, " // not support
"cast(trim(ob.OBJECT_NAME) as varchar(128)) INDEX_NAME, "
"cast(3 as smallint) TYPE, " // SQL_INDEX_OTHER
"cast(0 as smallint) ORDINAL_POSITION, "
"cast('' as varchar(128)) COLUMN_NAME, " // return an empty string if the expression cannot be determined.
"cast(NULL as char(1)) ASC_OR_DESC, " // not subsequent
"cast(NULL as integer) CARDINALITY, "
"cast(NULL as integer) PAGES, "
"cast(NULL as varchar(128)) FILTER_CONDITION "
"from "
"TRAFODION.\"_MD_\".OBJECTS ob, "
"TRAFODION.\"_MD_\".INDEXES idx, "
"TRAFODION.\"_MD_\".OBJECTS ob_table, "
"TRAFODION.\"_MD_\".TABLES tb "
"where "
"idx.BASE_TABLE_UID=tb.TABLE_UID "
"and idx.INDEX_UID=ob.OBJECT_UID "
"and idx.BASE_TABLE_UID=ob_table.OBJECT_UID "
"and (ob_table.SCHEMA_NAME = '%s' or trim(ob_table.SCHEMA_NAME) LIKE '%s' ESCAPE '\\') "
"and (ob_table.OBJECT_NAME = '%s' or trim(ob_table.OBJECT_NAME) LIKE '%s' ESCAPE '\\') "
"and (ob_table.OBJECT_TYPE in ('BT', 'VI')) "
"%s "
"ORDER BY 1, 2, 3, 7, 9, 6 ;",
tableParam[0],
inputParam[0],
inputParam[0], inputParam[1],
inputParam[2], inputParam[3],
tableParam[0],
inputParam[0], inputParam[1],
inputParam[2], inputParam[3],
uniqueness == 1 ? "" : "and idx.is_unique=1"
);
break;
default :
exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNSUPPORTED_SMD_API_TYPE;
break;
}
if (exception_->exception_nr == 0)
{
if ((QryCatalogSrvrStmt = getSrvrStmt(catStmtLabel, TRUE)) == NULL)
{
SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR,
EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId,
ODBCMX_SERVER,
srvrGlobal->srvrObjRef,
2,
"CATALOG APIs",
"Allocate Statement");
exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
}
else
{
// Temporary solution - bypass checks on metadata tables
unsigned int savedParserFlags = 0;
SQL_EXEC_GetParserFlagsForExSqlComp_Internal(savedParserFlags);
try
{
SQL_EXEC_SetParserFlagsForExSqlComp_Internal(INTERNAL_QUERY_FROM_EXEUTIL);
retcode = QryCatalogSrvrStmt->ExecDirect(NULL, CatalogQuery, EXTERNAL_STMT, TYPE_SELECT, SQL_ASYNC_ENABLE_OFF, 0);
SQL_EXEC_AssignParserFlagsForExSqlComp_Internal(savedParserFlags);
if (retcode == SQL_ERROR)
{
ERROR_DESC_def *p_buffer = QryCatalogSrvrStmt->sqlError.errorList._buffer;
char errNumStr[128] = {0};
sprintf(errNumStr, "%d", (int)p_buffer->sqlcode);
strncpy(RequestError, p_buffer->errorText,sizeof(RequestError) -1);
RequestError[sizeof(RequestError) - 1] = '\0';
SendEventMsg(MSG_SQL_ERROR,
EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId,
ODBCMX_SERVER,
srvrGlobal->srvrObjRef,
2,
errNumStr,
RequestError);
exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
exception_->u.SQLError.errorList._length = QryCatalogSrvrStmt->sqlError.errorList._length;
exception_->u.SQLError.errorList._buffer = QryCatalogSrvrStmt->sqlError.errorList._buffer;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECDIRECT_FAILED;
}
} //try
catch (...)
{
SQL_EXEC_AssignParserFlagsForExSqlComp_Internal(savedParserFlags);
SendEventMsg(MSG_PROGRAMMING_ERROR,
EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId,
ODBCMX_SERVER,
srvrGlobal->srvrObjRef,
1,
"Exception in executing Catalog API");
exception_->exception_nr = odbc_SQLSvc_GetSQLCatalogs_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECDIRECT_FAILED;
} // catch
}
}
if (exception_->exception_nr == 0)
{
QryCatalogSrvrStmt->sqlStmtType = TYPE_SELECT_CATALOG;
outputDesc->_length = QryCatalogSrvrStmt->outputDescList._length;
outputDesc->_buffer = QryCatalogSrvrStmt->outputDescList._buffer;
}
MapException:
// resource statistics
if (resStatSession != NULL)
{
if (exception_->exception_nr != 0)
resStatSession->totalCatalogErrors ++;
if (sqlWarning->_length != 0)
resStatSession->totalCatalogWarnings ++;
}
if (resStatStatement != NULL)
resStatStatement->catFlagOn = FALSE;
if (exception_->exception_nr != 0)
{
SRVR_STMT_HDL *pSrvrStmt = NULL;
if ((pSrvrStmt = getSrvrStmt(catStmtLabel, FALSE)) != NULL)
{
exception_->exception_nr = 0;
exception_->exception_detail = 0;
pSrvrStmt->rowsAffected = 0;
// CLEARDIAGNOSTICS(pSrvrStmt);
if (pSrvrStmt->bSQLMessageSet)
pSrvrStmt->cleanupSQLMessage();
}
}
SRVRTRACE_EXIT(FILE_SME+14);
return;
}
/*
* Synchronous method function prototype for
* operation 'odbc_SQLSvc_InitializeDialogue'
*/
extern "C" void
odbc_SQLSvc_InitializeDialogue_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def *call_id_
, /* Out */ odbc_SQLSvc_InitializeDialogue_exc_ *exception_
, /* In */ const USER_DESC_def *userDesc
, /* In */ const CONNECTION_CONTEXT_def *inContext
, /* In */ DIALOGUE_ID_def dialogueId
, /* Out */ OUT_CONNECTION_CONTEXT_def *outContext
)
{
SRVRTRACE_ENTER(FILE_SME+15);
exception_->exception_nr = 0;
Int32 retcode = SQL_SUCCESS;
char userSid[MAX_TEXT_SID_LEN+1];
char pwd[387];
pwd[0] = '\0';
__int64 julian = 0;
char primary_rolename[MAX_ROLENAME_LEN+1];
char logon_rolename[MAX_ROLENAME_LEN+1];
short logon_roleLen = 0;
__int64 redefTime = 0;
Int32 authIDType = 0;
int encryption = 1;
int refresh = 0;
char* pPWD = (char*)userDesc->password._buffer;
bzero(primary_rolename, sizeof(primary_rolename));
// volatile int done = 0;
// while (!done) {
// sleep(10);
// }
userSid[0] = 0;
// #ifdef _TMP_SQ_SECURITY
UA_Status authErrorDetail;
DBUserAuth *userSession = DBUserAuth::GetInstance();
size_t passwordLen = 0;
CLIENT_INFO client_info;
PERFORMANCE_INFO performanceInfo;
AUTHENTICATION_INFO authenticationInfo;
if (userDesc->userDescType != AUTHENTICATED_USER_TYPE)
{
srvrGlobal->QSRoleName[0] = '\0';
int64 tempStartTime, tempEndTime = 0;
int64 loginStartTime = JULIANTIMESTAMP();
client_info.client_name = setinit.clientId;
client_info.client_user_name = setinit.clientUserName;
client_info.application_name = setinit.applicationId;
#ifndef _DEBUG
// Disable generation of cores in release version
struct rlimit rlim;
int limit, ret_rlimit;
// Get the current limit and save.
ret_rlimit = getrlimit(RLIMIT_CORE, &rlim);
limit = rlim.rlim_cur;
// Set the current limit to 0, disabling generation of core
rlim.rlim_cur = 0;
ret_rlimit = setrlimit(RLIMIT_CORE, &rlim);
#endif
retcode = decrypt_message(pPWD,primary_rolename);
tempStartTime = JULIANTIMESTAMP() ;
if (retcode == SECMXO_NO_ERROR)
{
size_t length = strlen(userDesc->userName);
for (size_t i = 0; i < length; i++)
userDesc->userName[i] = toupper(userDesc->userName[i]);
retcode = userSession->verify(userDesc->userName
,pPWD
,authErrorDetail
,authenticationInfo
,client_info
,performanceInfo
);
}
if (retcode == 0)
{
srvrGlobal->redefTime = authenticationInfo.usersInfo.redefTime;
strcpy(srvrGlobal->QSRoleName, "NONE");
}
#ifndef _DEBUG
// Revert to the previous setting for core generation
rlim.rlim_cur = limit;
ret_rlimit = setrlimit(RLIMIT_CORE, &rlim);
#endif
tempEndTime = JULIANTIMESTAMP();
setinit.ldapLoginTime = tempEndTime - tempStartTime;
setinit.totalLoginTime = tempEndTime - loginStartTime;
setinit.sqlUserTime = performanceInfo.sqlUserTime;
setinit.searchConnectionTime = performanceInfo.searchConnectionTime;
setinit.searchTime = performanceInfo.searchTime;
setinit.authenticationConnectionTime = performanceInfo.authenticationConnectionTime;
setinit.authenticationTime = performanceInfo.authenticationTime;
if (retcode != SECMXO_NO_ERROR)
{
exception_->exception_detail = retcode;
exception_->exception_nr = odbc_SQLSvc_InitializeDialogue_SQLError_exn_;
srvrGlobal->QSRoleName[0] = '\0';
SETSECURITYERROR(retcode, &exception_->u.SQLError.errorList);
SRVRTRACE_EXIT(FILE_SME+15);
if (retcode == SECMXO_INTERNAL_ERROR_FATAL)
{
SendEventMsg(MSG_PROGRAMMING_ERROR, EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER, srvrGlobal->srvrObjRef,
1, "Security layer returned fatal error. Server exiting.");
exit(0);
}
return;
}
tempEndTime = JULIANTIMESTAMP();
setinit.totalLoginTime = tempEndTime - loginStartTime;
if (authenticationInfo.error == 0)
retcode = WSQL_EXEC_SetAuthID(userDesc->userName,
authenticationInfo.usersInfo.databaseUsername,
authenticationInfo.tokenKey,
authenticationInfo.tokenKeySize,
authenticationInfo.usersInfo.effectiveUserID,
authenticationInfo.usersInfo.sessionUserID);
else
{
bool bSQLMessageSet;
exception_->exception_detail = -8837;
if (authenticationInfo.errorDetail == 1)
{
setAuthenticationError(bSQLMessageSet,&(exception_->u.SQLError),userDesc->userName,false);
exception_->exception_nr = odbc_SQLSvc_InitializeDialogue_InvalidUser_exn_;
}
else
{
setAuthenticationError(bSQLMessageSet,&(exception_->u.SQLError),userDesc->userName,true);
exception_->exception_nr = odbc_SQLSvc_InitializeDialogue_SQLError_exn_;
ERROR_DESC_def *sqlError = exception_->u.SQLError.errorList._buffer;
SendEventMsg(MSG_SQL_ERROR, EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER, srvrGlobal->srvrObjRef,
3, ODBCMX_SERVER, sqlError->sqlstate, sqlError->errorText);
}
}
}
SRVRTRACE_EXIT(FILE_SME+15);
return;
}
/*
* Synchronous method function for
* operation 'odbc_SQLSvc_TerminateDialogue'
*/
extern "C" void
odbc_SQLSvc_TerminateDialogue_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def *call_id_
, /* Out */ odbc_SQLSvc_TerminateDialogue_exc_ *exception_
, /* In */ DIALOGUE_ID_def dialogueId
)
{
SRVRTRACE_ENTER(FILE_SME+16);
exception_->exception_nr = 0;
//odbc_SQLSvc_EndTransaction_exc_ endTransactionException;
//ERROR_DESC_LIST_def sqlWarning;
// Rollback the transaction, Don't bother to check if autocommit is on or off, since SQL
// doesn't check for it
// When there is no transaction outstanding, SQL would give an error and ignore this error.
if (WSQL_EXEC_Xact(SQLTRANS_STATUS,NULL) == 0)
EXECDIRECT("ROLLBACK WORK");
//odbc_SQLSvc_EndTransaction_sme_(objtag_, call_id_, &endTransactionException,
// dialogueId, SQL_ROLLBACK
// ,&sqlWarning
// );
// resource statistics resStatSession->end() is called in SRVR::BreakDialogue()
//if (resStatSession != NULL)
// resStatSession->end();
//end rs
SRVRTRACE_EXIT(FILE_SME+16);
return;
}
/*
*
* Synchronous method function for
* operation 'odbc_SQLSvc_SetConnectionOption'
*/
extern "C" void
odbc_SQLSvc_SetConnectionOption_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def *call_id_
, /* Out */ odbc_SQLSvc_SetConnectionOption_exc_ *exception_
, /* In */ DIALOGUE_ID_def dialogueId
, /* In */ IDL_short connectionOption
, /* In */ Int32 optionValueNum
, /* In */ IDL_string optionValueStr
, /* Out */ ERROR_DESC_LIST_def *sqlWarning
)
{
SRVRTRACE_ENTER(FILE_SME+17);
char stmtLabel[MAX_STMT_LABEL_LEN+1];
char sqlString[256];
Int32 retcode = 0;
bool sqlStringNeedsExecution = true;
SRVR_STMT_HDL *pSrvrStmt = NULL;
SRVR_STMT_HDL *resStmt;
int64 local_xid;
UINT xid_length = sizeof(local_xid);
char buffer[100];
char valueStr[MAX_SQL_IDENTIFIER_LEN+1];
char schemaValueStr[MAX_SQL_IDENTIFIER_LEN+MAX_SQL_IDENTIFIER_LEN+5+1]; // 5 for quotes + dot
char *CatalogNameTypeStr = '\0';
char *endPtr;
exception_->exception_nr = CEE_SUCCESS;
sqlWarning->_length = 0;
sqlWarning->_buffer = NULL;
memset(sqlString, 0, 256);
// Given a label find out the SRVR_STMT_HDL
if ((pSrvrStmt = getSrvrStmt("STMT_INTERNAL_1", TRUE)) == NULL)
{
exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
return;
}
// clientLCID = srvrGlobal->clientLCID, is done during the creation of statement
// handle. However, the in InitializeDialog(), the correct value of
// srvrGlobal->clientLCID is set only after the creation of statement handle.
// This causes an incorrect clientLCID value (the initalized value zero) to
// be set on pSrvrStmt. This value dectates the character set translations.
// An incorrect value of clientLCID causes incorrect translations for all the
// executions on that statement. The fix is to set the correct value after the
// creation of the statement.
pSrvrStmt->setclientLCID(srvrGlobal->clientLCID);
switch (connectionOption) {
//Special Case//
case SQL_ACCESSMODE_AND_ISOLATION:
switch (optionValueNum) {
case SQL_TXN_READ_UNCOMMITTED:
//Modified it, since on setting at DS level to uncommitted the subsequent connections were not going through.
strcpy(sqlString, "SET TRANSACTION READ ONLY, ISOLATION LEVEL READ UNCOMMITTED");
break;
case SQL_TXN_READ_COMMITTED:
//Modified it, since on setting at DS level to uncommitted the subsequent connections were not going through.
strcpy(sqlString, "SET TRANSACTION READ WRITE, ISOLATION LEVEL READ COMMITTED");
break;
default:
exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_OPTION_VALUE_NUM;
return;
}
break;
//Special Case//
case SQL_ACCESS_MODE:
strcpy(sqlString, "SET TRANSACTION ");
switch (optionValueNum) {
case SQL_MODE_READ_WRITE:
strcat(sqlString, "READ WRITE");
break;
case SQL_MODE_READ_ONLY:
if ((srvrGlobal->EnvironmentType & MXO_MSACCESS_1997) || (srvrGlobal->EnvironmentType & MXO_MSACCESS_2000)) // change this to fix MS Access problem. Since it insert, update and delete while SQL_ACCESS_MODE is SQL_MODE_READ_ONLY.
strcat(sqlString, "READ WRITE");
else
strcat(sqlString, "READ ONLY");
break;
case SQL_MODE_NULL:
// Need to find out from profile what is the access Mode
// at present return ParamError. Note there is no break
default:
exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_OPTION_VALUE_NUM;
return;
}
break;
case SQL_TXN_ISOLATION:
strcpy(sqlString, "SET TRANSACTION ISOLATION LEVEL ");
switch (optionValueNum) {
case SQL_TXN_READ_UNCOMMITTED:
strcat(sqlString, "READ UNCOMMITTED");
break;
case SQL_TXN_READ_COMMITTED:
strcat(sqlString, "READ COMMITTED");
break;
case SQL_TXN_REPEATABLE_READ:
strcat(sqlString, "REPEATABLE READ");
break;
case SQL_TXN_SERIALIZABLE:
strcat(sqlString, "SERIALIZABLE");
break;
default:
exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_OPTION_VALUE_NUM;
return;
}
break;
case SQL_ATTR_ENLIST_IN_DTC:
#ifdef TIP_DEFINED
if (srvrGlobal->tip_gateway != NULL) {
tip_close(srvrGlobal->tip_gateway);
srvrGlobal->tip_gateway = NULL;
}
// Check for non-DTC transaction
if (optionValueNum == NULL){
SetTipUrl((IDL_char *)NULL);
SetLocalXid(NULL, 0);
exception_->exception_nr = 0;
sqlWarning->_length = 0;
sqlWarning->_buffer = NULL;
return;
}
// Check for previous DTC transaction
if(GetTipUrl() != (IDL_char *)NULL){
SetTipUrl((IDL_char *)NULL);
SetLocalXid(NULL, 0);
}
retcode = tip_open(&(srvrGlobal->tip_gateway));
if (retcode != TIPOK){
exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_OPEN_TIP_GATEWAY_FAILED;
switch (retcode) {
case TIPNOTCONNECTED:
SendEventMsg (MSG_SRVR_DTC_TIP_NOTCONNECTED,
EVENTLOG_WARNING_TYPE,
srvrGlobal->nskProcessInfo.processId,
ODBCMX_SERVER,
srvrGlobal->srvrObjRef,
0);
break;
case TIPNOTCONFIGURED:
SendEventMsg (MSG_SRVR_DTC_TIP_NOTCONFIGURED,
EVENTLOG_WARNING_TYPE,
srvrGlobal->nskProcessInfo.processId,
ODBCMX_SERVER,
srvrGlobal->srvrObjRef,
0);
break;
default:
SendEventMsg (MSG_SRVR_DTC_TIP_ERROR,
EVENTLOG_WARNING_TYPE,
srvrGlobal->nskProcessInfo.processId,
ODBCMX_SERVER,
srvrGlobal->srvrObjRef,
0);
break;
}
return;
}
strncpy(buffer, optionValueStr, sizeof(buffer));
buffer[sizeof(buffer)-1] = 0;
retcode = tip_pull(srvrGlobal->tip_gateway,
(IDL_char *)buffer,
&local_xid,
xid_length);
if (retcode != TIPOK){
exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_PULL_TIP_FAILED;
switch (retcode) {
case TIPNOTCONNECTED:
SendEventMsg (MSG_SRVR_DTC_TIP_NOTCONNECTED,
EVENTLOG_WARNING_TYPE,
srvrGlobal->nskProcessInfo.processId,
ODBCMX_SERVER,
srvrGlobal->srvrObjRef,
0);
break;
case TIPNOTCONFIGURED:
SendEventMsg (MSG_SRVR_DTC_TIP_NOTCONFIGURED,
EVENTLOG_WARNING_TYPE,
srvrGlobal->nskProcessInfo.processId,
ODBCMX_SERVER,
srvrGlobal->srvrObjRef,
0);
break;
default:
SendEventMsg (MSG_SRVR_DTC_TIP_ERROR,
EVENTLOG_WARNING_TYPE,
srvrGlobal->nskProcessInfo.processId,
ODBCMX_SERVER,
srvrGlobal->srvrObjRef,
0);
break;
}
return;
}
SetTipUrl((IDL_char *)buffer);
SetLocalXid(local_xid,
xid_length);
exception_->exception_nr = 0;
sqlWarning->_length = 0;
sqlWarning->_buffer = NULL;
#else
// RS we'll return an error just in case a user tries to use TIP until we get the libraries
sqlWarning->_length = 0;
sqlWarning->_buffer = NULL;
exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_OPEN_TIP_GATEWAY_FAILED;
SendEventMsg (MSG_SRVR_DTC_TIP_ERROR,
EVENTLOG_WARNING_TYPE,
srvrGlobal->nskProcessInfo.processId,
ODBCMX_SERVER,
srvrGlobal->srvrObjRef,
0);
#endif
return;
case SET_AUTOBEGIN:
strcpy(sqlString, "SET TRANSACTION AUTOBEGIN ON");
break;
case SQL_AUTOCOMMIT:
// if a change is required
sqlStringNeedsExecution = false;
if ( ((srvrGlobal->bAutoCommitOn == TRUE) && (optionValueNum == 0 ))
|| ((srvrGlobal->bAutoCommitOn == FALSE) && (optionValueNum == 1 )) )
{
//check for active txn, if yes commit them
if ((srvrGlobal->bAutoCommitOn == FALSE) && (WSQL_EXEC_Xact(SQLTRANS_STATUS,NULL) == 0))
retcode = pSrvrStmt->ExecDirect(NULL, "COMMIT WORK", INTERNAL_STMT, TYPE_UNKNOWN, SQL_ASYNC_ENABLE_OFF, 0);
if (retcode != SQL_ERROR)
{
if (optionValueNum)
{
if( SQL_SUCCESS == (retcode = pSrvrStmt->ExecDirect(NULL, "SET TRANSACTION AUTOCOMMIT ON", INTERNAL_STMT, TYPE_UNKNOWN, SQL_ASYNC_ENABLE_OFF, 0)))
srvrGlobal->bAutoCommitOn = TRUE;
}
else
{
if( SQL_SUCCESS == (retcode = pSrvrStmt->ExecDirect(NULL, "SET TRANSACTION AUTOCOMMIT OFF", INTERNAL_STMT, TYPE_UNKNOWN, SQL_ASYNC_ENABLE_OFF, 0)))
srvrGlobal->bAutoCommitOn = FALSE;
}
}
}
else
return;
break;
case SET_CATALOG:
case SQL_ATTR_CURRENT_CATALOG:
{
sqlStringNeedsExecution = false;
int len = 0;
bool defaultCatalog = false;
bool isDoubleQuoted = false;
char* tempSqlString = NULL;
if (optionValueStr == NULL || (optionValueStr != NULL && optionValueStr[0] == '\0'))
{
len = strlen(ODBCMX_DEFAULT_CATALOG);
defaultCatalog = true;
}
else
len = strlen(optionValueStr);
tempSqlString = new char[len+20];
if (tempSqlString == NULL)
{
SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR, EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
srvrGlobal->srvrObjRef, 1, "SET CATALOG");
exit(0);
}
if (!defaultCatalog && optionValueStr[0] == '"' && optionValueStr[len-1] == '"')
isDoubleQuoted = true;
strcpy(tempSqlString, "SET CATALOG ");
if (!isDoubleQuoted)
strcat(tempSqlString, "'");
if (defaultCatalog)
strcat(tempSqlString, ODBCMX_DEFAULT_CATALOG);
else
strcat(tempSqlString, optionValueStr);
if (!isDoubleQuoted)
strcat(tempSqlString, "'");
if( SQL_SUCCESS == (retcode = pSrvrStmt->ExecDirect(NULL, tempSqlString, INTERNAL_STMT, TYPE_UNKNOWN, SQL_ASYNC_ENABLE_OFF, 0)))
{
if (defaultCatalog)
strcpy(srvrGlobal->DefaultCatalog, ODBCMX_DEFAULT_CATALOG);
else if (isDoubleQuoted)
{
strncpy(srvrGlobal->DefaultCatalog, optionValueStr+1, len-2);
srvrGlobal->DefaultCatalog[len-2] = '\0';
}
else
strcpy(srvrGlobal->DefaultCatalog, optionValueStr);
}
delete [] tempSqlString;
}
break;
case SET_SCHEMA:
{
if (optionValueStr == NULL || (optionValueStr != NULL && optionValueStr[0] == '\0'))
sprintf(schemaValueStr, "%s.%s", ODBCMX_DEFAULT_CATALOG, ODBCMX_DEFAULT_SCHEMA);
else
{
if (strlen(optionValueStr) < sizeof(schemaValueStr))
strcpy(schemaValueStr, optionValueStr);
else
{
exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_OPTION_VALUE_STR;
return;
}
}
strcpy(sqlString, "SET SCHEMA ");
strncat(sqlString, schemaValueStr, sizeof(sqlString));
sqlString[sizeof(sqlString)-1] = 0;
}
break;
case RESET_DEFAULTS:
strcpy(sqlString, "CONTROL QUERY DEFAULT * RESET");
break;
case RESET_RESET_DEFAULTS:
strcpy(sqlString, "CONTROL QUERY DEFAULT * RESET RESET");
break;
case CUT_CONTROLQUERYSHAPE:
strcpy(sqlString, "CONTROL QUERY SHAPE CUT");
break;
case BEGIN_SESSION:
if(optionValueStr != NULL && strlen(optionValueStr) > 0)
sprintf(sqlString,"SET SESSION DEFAULT SQL_SESSION 'BEGIN:%0.200s';",optionValueStr);
else
strcpy(sqlString, "SET SESSION DEFAULT SQL_SESSION 'BEGIN';");
break;
// Added the below workaround for volatile table SQL problem
// Not called any more from initailizeDialog since executor fixed it.
case SET_SESSION_USERNAME:
sprintf( sqlString, "CONTROL QUERY DEFAULT session_id '%s'", srvrGlobal->sessionId );
break;
case END_SESSION:
strcpy(sqlString, "SET SESSION DEFAULT SQL_SESSION 'END'");
break;
case SET_CATALOGNAMETYPE:
strcpy(sqlString, "SET NAMETYPE ANSI");
break;
case SET_SETANDCONTROLSTMTS:
break;
case SET_ODBC_PROCESS:
strcpy(sqlString, "CONTROL QUERY DEFAULT ODBC_PROCESS 'TRUE'");
break;
case SET_JDBC_PROCESS:
strcpy(sqlString, "CONTROL QUERY DEFAULT JDBC_PROCESS 'TRUE'");
break;
case SET_INFER_NCHAR:
strcpy(sqlString, "CONTROL QUERY DEFAULT INFER_CHARSET 'ON'");
break;
case SET_EXPLAIN_PLAN:
strcpy(sqlString,"CONTROL QUERY DEFAULT GENERATE_EXPLAIN 'ON'");
break;
case SQL_ATTR_ROWSET_RECOVERY:
if (optionValueNum)
srvrGlobal->EnvironmentType |= MXO_ROWSET_ERROR_RECOVERY;
else
srvrGlobal->EnvironmentType &= (0xFFFF-MXO_ROWSET_ERROR_RECOVERY);
return;
case SQL_ATTR_CONCURRENCY:
strcpy(sqlString, "CONTROL QUERY DEFAULT READONLY_CURSOR ");
switch (optionValueNum)
{
case SQL_CONCUR_READ_ONLY:
strcat(sqlString, "'TRUE'");
break;
case SQL_CONCUR_LOCK:
case SQL_CONCUR_ROWVER:
case SQL_CONCUR_VALUES:
strcat(sqlString, "'FALSE'");
break;
default:
exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_OPTION_VALUE_NUM;
return;
}
break;
case JDBC_ATTR_CONN_IDLE_TIMEOUT:
if (srvrGlobal->drvrVersion.componentId == JDBC_DRVR_COMPONENT)
{
if (optionValueNum > JDBC_DATASOURCE_CONN_IDLE_TIMEOUT)
srvrGlobal->javaConnIdleTimeout = optionValueNum;
else
srvrGlobal->javaConnIdleTimeout = JDBC_DATASOURCE_CONN_IDLE_TIMEOUT;
}
else
{
exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_CONNECTION_OPTION;
}
return;
case CONN_IDLE_TIMER_RESET:
// this connection attribute is JDBC exclusive, NDCS just need to recognize it and does nothing
return;
break;
// Set priority of DP2 relative to master executor/ESPs
case CONTROL_TABLE_PRIORITY:
sprintf(sqlString,"CONTROL TABLE * PRIORITY_DELTA '%d'", optionValueNum);
break;
case SET_STATISTICS:
strcpy(sqlString,"CONTROL QUERY DEFAULT detailed_statistics 'PERTABLE'");
break;
// JDBC sets this connection attribute to set the Proxy syntax for SPJ result sets
case SET_SPJ_ENABLE_PROXY:
if(optionValueNum)
srvrGlobal->bSpjEnableProxy = true;
else
srvrGlobal->bSpjEnableProxy = false;
return;
break;
case SQL_ATTR_JOIN_UDR_TRANSACTION:
errno = 0;
endPtr = NULL;
srvrGlobal->spjTxnId = strtoll(optionValueStr, &endPtr, 10);
//srvrGlobal->spjTxnId = atoll(optionValueStr);
if( errno == 0 )
{
#ifdef SPJ_TXN_TEST
sprintf(msg, "SQL_ATTR_JOIN_UDR_TRANSACTION %lld", srvrGlobal->spjTxnId);
SendEventMsg(MSG_SERVER_TRACE_INFO, EVENTLOG_INFORMATION_TYPE,
srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
srvrGlobal->srvrObjRef, 1, msg);
#endif
retcode = JOINTRANSACTION( srvrGlobal->spjTxnId );
if(retcode != 0)
{
sprintf(buffer,"Transaction join failed with error %d",retcode);
exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
exception_->u.ParamError.ParamDesc = buffer;
}
else
srvrGlobal->bspjTxnJoined = TRUE;
}
else
{
sprintf(buffer,"Unable to retrieve transaction ID. Error %d",errno);
exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
exception_->u.ParamError.ParamDesc = buffer;
}
return;
break;
case SQL_ATTR_SUSPEND_UDR_TRANSACTION:
endPtr = NULL;
errno = 0;
srvrGlobal->spjTxnId = strtoll(optionValueStr, &endPtr, 10);
//srvrGlobal->spjTxnId = atoll(optionValueStr);
if( errno == 0 )
{
#ifdef SPJ_TXN_TEST
sprintf(msg, "SQL_ATTR_SUSPEND_UDR_TRANSACTION %lld", srvrGlobal->spjTxnId);
SendEventMsg(MSG_SERVER_TRACE_INFO, EVENTLOG_INFORMATION_TYPE,
srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
srvrGlobal->srvrObjRef, 1, msg);
#endif
retcode = SUSPENDTRANSACTION( (short*)&(srvrGlobal->spjTxnId) );
if(retcode != 0)
{
sprintf(buffer,"Transaction suspend failed with error %d",retcode);
exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
exception_->u.ParamError.ParamDesc = buffer;
}
else
srvrGlobal->bspjTxnJoined = FALSE;
}
else
{
sprintf(buffer,"Unable to retrieve transaction ID. Error %d",errno);
exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
exception_->u.ParamError.ParamDesc = buffer;
}
return;
break;
case SET_INPUT_CHARSET:
snprintf(sqlString,200,"CONTROL QUERY DEFAULT input_charset '%s'", getCharsetStr(srvrGlobal->clientLCID));
break;
case SET_TERMINAL_CHARSET:
snprintf(sqlString,200,"CONTROL QUERY DEFAULT terminal_charset '%s'", getCharsetStr(srvrGlobal->clientErrorLCID));
break;
case SET_NVCI_PROCESS:
sprintf(sqlString, "CONTROL QUERY DEFAULT NVCI_PROCESS 'ON'");
break;
case WMS_QUERY_MONITORING:
strcpy(sqlString, "CONTROL QUERY DEFAULT WMS_QUERY_MONITORING 'OFF'");
break;
default:
exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_INVALID_CONNECTION_OPTION;
return;
}
if(sqlStringNeedsExecution)
{
if (connectionOption == SET_SETANDCONTROLSTMTS)
retcode = pSrvrStmt->ExecDirect(NULL, optionValueStr, INTERNAL_STMT, TYPE_UNKNOWN, SQL_ASYNC_ENABLE_OFF, 0);
else
retcode = pSrvrStmt->ExecDirect(NULL, sqlString, INTERNAL_STMT, TYPE_UNKNOWN, SQL_ASYNC_ENABLE_OFF, 0);
}
switch (retcode)
{
case SQL_SUCCESS:
exception_->exception_nr = 0;
// Ignore estimatedCost and rowsAffected
sqlWarning->_length = pSrvrStmt->sqlWarning._length;
sqlWarning->_buffer = pSrvrStmt->sqlWarning._buffer;
break;
case SQL_ERROR:
if(pSrvrStmt->sqlError.errorList._buffer->sqlcode == -15371) // Executor dev should be treated as warning.
{
exception_->exception_nr = 0;
SendEventMsg(MSG_SQL_WARNING, EVENTLOG_WARNING_TYPE,
srvrGlobal->nskProcessInfo.processId, ODBCMX_SERVER,
srvrGlobal->srvrObjRef, 3, "SQL/MX", "15371", sqlString);
}
else
{
exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_SQLError_exn_;
exception_->u.SQLError.errorList._length = pSrvrStmt->sqlError.errorList._length;
exception_->u.SQLError.errorList._buffer = pSrvrStmt->sqlError.errorList._buffer;
}
break;
case PROGRAM_ERROR:
exception_->exception_nr = odbc_SQLSvc_SetConnectionOption_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_SETCONNECTOPTION_FAILED;
default:
break;
}
SRVRTRACE_EXIT(FILE_SME+17);
return;
}
extern "C" void
odbc_SQLSrvr_FetchPerf_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def *call_id_
, /* Out */ Int32 *returnCode
, /* In */ DIALOGUE_ID_def dialogueId
, /* In */ const IDL_char *stmtLabel
, /* In */ Int32 maxRowCnt
, /* In */ Int32 maxRowLen
, /* In */ IDL_short sqlAsyncEnable
, /* In */ Int32 queryTimeout
, /* Out */ Int32 *rowsAffected
, /* Out */ Int32 *outValuesFormat
, /* Out */ SQL_DataValue_def *outputDataValue
, /* Out */ Int32 *sqlWarningOrErrorLength
, /* Out */ BYTE *&sqlWarningOrError
)
{
SRVRTRACE_ENTER(FILE_SME+8);
SRVR_STMT_HDL *pSrvrStmt = NULL;
SQLRETURN rc = SQL_SUCCESS;
int outputDataOffset = 0;
*returnCode = SQL_SUCCESS;
if (maxRowCnt < 0)
{
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY000", "Invalid Row Count", sqlWarningOrErrorLength, sqlWarningOrError);
}
else
{
pSrvrStmt = getSrvrStmt(stmtLabel, FALSE);
if (pSrvrStmt == NULL)
{
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY000", "Statement Label not found", sqlWarningOrErrorLength, sqlWarningOrError);
}
else
{
if (pSrvrStmt->sqlWarningOrErrorLength > 0 &&
pSrvrStmt->sqlWarningOrError != NULL)
{
delete pSrvrStmt->sqlWarningOrError;
}
pSrvrStmt->sqlWarningOrErrorLength = 0;
pSrvrStmt->sqlWarningOrError = NULL;
}
}
if (*returnCode == SQL_SUCCESS)
{
// limit on maxRowsFetched from WMS
if (pSrvrStmt->sqlStmtType != TYPE_SELECT_CATALOG)
{
if (srvrGlobal->maxRowsFetched != 0 && pSrvrStmt->m_bDoneWouldLikeToExecute)
{
if (srvrGlobal->maxRowsFetched <= pSrvrStmt->m_curRowsFetched)
{
WSQL_EXEC_CloseStmt(&pSrvrStmt->stmt);
WSQL_EXEC_ClearDiagnostics(&pSrvrStmt->stmt);
pSrvrStmt->isClosed = true;
pSrvrStmt->bFirstSqlBulkFetch = false;
pSrvrStmt->m_curRowsFetched = 0;
// *returnCode = SQL_NO_DATA_FOUND;
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY000", "The limit for maximum rows to be returned for a query, as set by the administrator, was exceeded", sqlWarningOrErrorLength, sqlWarningOrError);
goto ret;
}
else
{
if (pSrvrStmt->bFirstSqlBulkFetch == true)
pSrvrStmt->m_curRowsFetched = 0;
if (pSrvrStmt->m_curRowsFetched + maxRowCnt <= srvrGlobal->maxRowsFetched )
pSrvrStmt->maxRowCnt = maxRowCnt;
else
{
pSrvrStmt->maxRowCnt = srvrGlobal->maxRowsFetched - pSrvrStmt->m_curRowsFetched;
if (pSrvrStmt->maxRowCnt <= 0)
pSrvrStmt->maxRowCnt = 1;
}
}
}
else
pSrvrStmt->maxRowCnt = maxRowCnt;
}
else
pSrvrStmt->maxRowCnt = maxRowCnt;
pSrvrStmt->maxRowLen = maxRowLen;
// resource statistics
if (resStatStatement != NULL && pSrvrStmt->isClosed == FALSE && pSrvrStmt->bFetchStarted == FALSE && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
pSrvrStmt->bFetchStarted = TRUE;
pSrvrStmt->inState = inState = STMTSTAT_FETCH;
inSqlStmtType = TYPE_UNKNOWN;
inEstimatedCost = 0;
inQueryId = NULL;
inSqlString = NULL;
inErrorStatement = 0;
inWarningStatement = 0;
inRowCount = 0;
inErrorCode = 0;
inSqlError = NULL;
inSqlErrorLength = 0;
/*resStatStatement->start(inState,
pSrvrStmt->sqlQueryType,
stmtLabel,
pSrvrStmt->sqlUniqueQueryID,
pSrvrStmt->cost_info,
pSrvrStmt->comp_stats_info,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg);*/
resStatStatement->start(inState,
pSrvrStmt->sqlQueryType,
stmtLabel,
pSrvrStmt,
inEstimatedCost,
&pSrvrStmt->m_need_21036_end_msg);
}
// end rs
if (pSrvrStmt->sqlStmtType != TYPE_SELECT_CATALOG)
{
if (pSrvrStmt->bSQLMessageSet)
pSrvrStmt->cleanupSQLMessage();
if(pSrvrStmt->outputDataValue._length > 0 &&
pSrvrStmt->outputDataValue._buffer != NULL)
delete pSrvrStmt->outputDataValue._buffer;
pSrvrStmt->outputDataValue._length = 0;
pSrvrStmt->outputDataValue._buffer = NULL;
if (pSrvrStmt->isClosed)
{
pSrvrStmt->m_curRowsFetched = 0;
pSrvrStmt->bFirstSqlBulkFetch = false;
*returnCode = SQL_NO_DATA_FOUND;
goto ret;
}
pSrvrStmt->currentMethod = odbc_SQLSvc_FetchPerf_ldx_;
// if (pSrvrStmt->sqlBulkFetchPossible && (pSrvrStmt->sqlQueryType == SQL_SELECT_NON_UNIQUE || pSrvrStmt->sqlQueryType == SQL_SP_RESULT_SET))
if (srvrGlobal->drvrVersion.buildId & ROWWISE_ROWSET)
{
*outValuesFormat = ROWWISE_ROWSETS;
rc = FETCH2bulk(pSrvrStmt);
if (pSrvrStmt->rowsAffected > 0)
{
if(pSrvrStmt->outputDataValue._length == 0 && pSrvrStmt->outputDataValue._buffer == NULL)
{
outputDataValue->_buffer = pSrvrStmt->outputDescVarBuffer;
outputDataValue->_length = pSrvrStmt->outputDescVarBufferLen*pSrvrStmt->rowsAffected;
}
else
{
outputDataValue->_buffer = pSrvrStmt->outputDataValue._buffer;
outputDataValue->_length = pSrvrStmt->outputDataValue._length;
}
}
else
{
outputDataValue->_buffer = NULL;
outputDataValue->_length = 0;
}
}
else
{
*outValuesFormat = COLUMNWISE_ROWSETS;
//pSrvrStmt->maxRowCnt = maxRowCnt;
//pSrvrStmt->maxRowLen = maxRowLen;
rc = FETCHPERF(pSrvrStmt, outputDataValue);
}
switch (rc)
{
case ODBC_RG_WARNING:
case SQL_SUCCESS_WITH_INFO:
*returnCode = SQL_SUCCESS_WITH_INFO;
GETSQLWARNINGORERROR2(pSrvrStmt);
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
*rowsAffected = pSrvrStmt->rowsAffected;
if (*rowsAffected > 0)
pSrvrStmt->m_curRowsFetched += *rowsAffected;
break;
case SQL_SUCCESS:
*returnCode = SQL_SUCCESS;
*rowsAffected = pSrvrStmt->rowsAffected;
if (*rowsAffected > 0)
pSrvrStmt->m_curRowsFetched += *rowsAffected;
break;
case SQL_STILL_EXECUTING:
*returnCode = SQL_STILL_EXECUTING;
break;
case SQL_INVALID_HANDLE:
*returnCode = SQL_INVALID_HANDLE;
break;
case SQL_NO_DATA_FOUND:
pSrvrStmt->bFirstSqlBulkFetch = false;
*returnCode = SQL_NO_DATA_FOUND;
break;
case SQL_ERROR:
pSrvrStmt->bFirstSqlBulkFetch = false;
*returnCode = SQL_ERROR;
GETSQLWARNINGORERROR2(pSrvrStmt);
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
break;
case PROGRAM_ERROR:
pSrvrStmt->bFirstSqlBulkFetch = false;
*returnCode = SQL_ERROR;
GETMXCSWARNINGORERROR(-1, "HY000", "Fetch Failed", sqlWarningOrErrorLength, sqlWarningOrError);
break;
default:
break;
}
}
else
{ // Catalog APIs
outputDataOffset = *(int*)pSrvrStmt->outputDataValue.pad_to_offset_8_;
*outValuesFormat = COLUMNWISE_ROWSETS;
rc = FETCHPERF(pSrvrStmt, &pSrvrStmt->outputDataValue);
if (pSrvrStmt->sqlError.errorList._buffer != NULL)
{
*returnCode = SQL_ERROR;
GETSQLWARNINGORERROR2(pSrvrStmt);
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
if (pSrvrStmt->outputDataValue._buffer != NULL)
delete pSrvrStmt->outputDataValue._buffer;
pSrvrStmt->outputDataValue._buffer = NULL;
pSrvrStmt->outputDataValue._length = 0;
}
else if (pSrvrStmt->rowsAffected == 0 || pSrvrStmt->rowsAffected == -1)
{
if (pSrvrStmt->bSQLMessageSet)
pSrvrStmt->cleanupSQLMessage();
pSrvrStmt->outputDataValue._buffer = NULL;
pSrvrStmt->outputDataValue._length = 0;
*(int*)pSrvrStmt->outputDataValue.pad_to_offset_8_=0;
outputDataOffset = 0;
pSrvrStmt->InternalStmtClose(SQL_CLOSE);
*returnCode = SQL_NO_DATA_FOUND;
}
else
{
*rowsAffected = pSrvrStmt->rowsAffected;
if (pSrvrStmt->sqlWarning._length != 0)
{
*returnCode = SQL_SUCCESS_WITH_INFO;
GETSQLWARNINGORERROR2(pSrvrStmt);
*sqlWarningOrErrorLength = pSrvrStmt->sqlWarningOrErrorLength;
sqlWarningOrError = pSrvrStmt->sqlWarningOrError;
}
else
{
char *tmpByte = (char*)&pSrvrStmt->outputDataValue._length;
for(int i=0; i<sizeof(pSrvrStmt->outputDataValue.pad_to_offset_8_); i++) {
pSrvrStmt->outputDataValue.pad_to_offset_8_[i] = *tmpByte;
tmpByte++;
}
*returnCode = SQL_SUCCESS;
}
pSrvrStmt->rowsAffected = 0;
}
outputDataValue->_length = pSrvrStmt->outputDataValue._length - outputDataOffset;
outputDataValue->_buffer = pSrvrStmt->outputDataValue._buffer + outputDataOffset;
}
ret:
if (*returnCode != SQL_SUCCESS &&
*returnCode != SQL_SUCCESS_WITH_INFO)
{
if (pSrvrStmt->outputDataValue._buffer != NULL)
delete pSrvrStmt->outputDataValue._buffer;
pSrvrStmt->outputDataValue._length = 0;
pSrvrStmt->outputDataValue._buffer = NULL;
}
if (pSrvrStmt->sqlNewQueryType == SQL_SP_RESULT_SET)
{
if (pSrvrStmt->callStmtHandle->isClosed == true && *returnCode == SQL_NO_DATA_FOUND || *returnCode == SQL_ERROR)
{
pSrvrStmt->callStmtHandle->inState = STMTSTAT_CLOSE;
// Fix for CR 6059
if( resStatStatement != NULL )
resStatStatement->setStatistics(pSrvrStmt->callStmtHandle);
}
}
else if (resStatStatement != NULL && pSrvrStmt->bFetchStarted == TRUE &&
(*returnCode == SQL_NO_DATA_FOUND || *returnCode == SQL_ERROR ||
((*returnCode == SQL_SUCCESS || *returnCode == SQL_SUCCESS_WITH_INFO) && *rowsAffected < maxRowCnt)))
{
resStatStatement->setStatistics(pSrvrStmt);
}
}
// resource statistics
if (resStatStatement != NULL && pSrvrStmt != NULL && pSrvrStmt->isClosed == TRUE && pSrvrStmt->bFetchStarted == TRUE && pSrvrStmt->stmtType == EXTERNAL_STMT)
{
if (*returnCode == SQL_ERROR && pSrvrStmt->sqlWarningOrError != NULL)
{
inErrorCode = *(Int32 *)(pSrvrStmt->sqlWarningOrError+8);
inSqlError = (char*)pSrvrStmt->sqlWarningOrError + 16;
inSqlErrorLength =*(Int32 *)(pSrvrStmt->sqlWarningOrError + 12);
}
pSrvrStmt->bFetchStarted = FALSE;
Int32 inMaxRowCnt = 0;
Int32 inMaxRowLen = 0;
inMaxRowCnt = maxRowCnt;
inMaxRowLen = maxRowLen;
if (*returnCode != SQL_SUCCESS &&
*returnCode != SQL_SUCCESS_WITH_INFO)
inErrorStatement ++;
else
setStatisticsFlag = FALSE;
if (*returnCode == SQL_SUCCESS_WITH_INFO)
inWarningStatement ++;
if (*returnCode == SQL_NO_DATA_FOUND)
{
inErrorStatement = 0;
inWarningStatement = 0;
setStatisticsFlag = TRUE;
}
inQueryId = pSrvrStmt->sqlUniqueQueryID;
inSqlQueryType = pSrvrStmt->sqlQueryType;
resStatStatement->setStatisticsFlag(setStatisticsFlag);
resStatStatement->end(inState,
inSqlQueryType,
inSqlStmtType,
inQueryId,
inEstimatedCost,
inSqlString,
inErrorStatement,
inWarningStatement,
inRowCount,
inErrorCode,
resStatSession,
inSqlErrorLength,
inSqlError,
pSrvrStmt,
&pSrvrStmt->m_need_21036_end_msg,
pSrvrStmt->sqlNewQueryType,
pSrvrStmt->isClosed);
}
//end rs
SRVRTRACE_EXIT(FILE_SME+8);
return;
} // odbc_SQLSrvr_FetchPerf_sme_()
extern "C" void
odbc_SQLSrvr_ExtractLob_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def *call_id_
, /* Out */ odbc_SQLsrvr_ExtractLob_exc_ *exception_
, /* In */ IDL_short extractLobAPI
, /* In */ IDL_string lobHandle
, /* In */ IDL_long_long &lobLength
, /* Out */ IDL_long_long &extractLen
, /* Out */ BYTE *& extractData
)
{
char LobExtractQuery[1000] = {0};
char RequestError[200] = {0};
SRVR_STMT_HDL *QryLobExtractSrvrStmt = NULL;
if ((QryLobExtractSrvrStmt = getSrvrStmt("MXOSRVR_EXTRACRTLOB", TRUE)) == NULL)
{
SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR,
EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId,
ODBCMX_SERVER,
srvrGlobal->srvrObjRef,
2,
"EXTRACT LOB APIs",
"Allocate Statement");
exception_->exception_nr = odbc_SQLsrvr_ExtractLob_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
}
switch (extractLobAPI) {
case 0:
extractData = NULL;
snprintf(LobExtractQuery, sizeof(LobExtractQuery), "EXTRACT LOBLENGTH(LOB'%s') LOCATION %Ld", lobHandle, (Int64)&lobLength);
break;
case 1:
extractData = new BYTE[extractLen + 1];
if (extractData == NULL)
{
exception_->exception_nr = odbc_SQLsrvr_ExtractLob_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_BUFFER_ALLOC_FAILED;
}
snprintf(LobExtractQuery, sizeof(LobExtractQuery), "EXTRACT LOBTOBUFFER(LOB'%s', LOCATION %Ld, SIZE %Ld)", lobHandle, (Int64)extractData, &extractLen);
break;
case 102:
extractLen = 0;
extractData = NULL;
snprintf(LobExtractQuery, sizeof(LobExtractQuery), "EXTRACT LOBTOBUFFER(LOB'%s', LOCATION %Ld, SIZE %Ld)", lobHandle, (Int64)extractData, &extractLen);
break;
default:
return ;
}
try
{
short retcode = QryLobExtractSrvrStmt->ExecDirect(NULL, LobExtractQuery, EXTERNAL_STMT, TYPE_CALL, SQL_ASYNC_ENABLE_OFF, 0);
if (retcode == SQL_ERROR)
{
ERROR_DESC_def *p_buffer = QryLobExtractSrvrStmt->sqlError.errorList._buffer;
char errNumStr[128] = {0};
sprintf(errNumStr, "%d", (int)p_buffer->sqlcode);
strncpy(RequestError, p_buffer->errorText, sizeof(RequestError) - 1);
SendEventMsg(MSG_SQL_ERROR,
EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId,
ODBCMX_SERVER,
srvrGlobal->srvrObjRef,
2,
errNumStr,
RequestError);
exception_->exception_nr = odbc_SQLsrvr_ExtractLob_ParamError_exn_;
exception_->u.SQLError.errorList._length = QryLobExtractSrvrStmt->sqlError.errorList._length;
exception_->u.SQLError.errorList._buffer = QryLobExtractSrvrStmt->sqlError.errorList._buffer;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECUTE_FAILED;
}
}
catch (...)
{
SendEventMsg(MSG_PROGRAMMING_ERROR,
EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId,
ODBCMX_SERVER,
srvrGlobal->srvrObjRef,
1,
//"Exception in executing EXTRACT LOBTOBUFFER");
"Exception in executing EXTRACT LOBLENGTH");
exception_->exception_nr = odbc_SQLsrvr_ExtractLob_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECDIRECT_FAILED;
}
}
extern "C" void
odbc_SQLSrvr_UpdateLob_sme_(
/* In */ CEE_tag_def objtag_
, /* In */ const CEE_handle_def * call_id_
, /* In */ odbc_SQLSvc_UpdateLob_exc_ * exception_
, /* In */ IDL_short lobUpdateType
, /* In */ IDL_string lobHandle
, /* In */ IDL_long_long totalLength
, /* In */ IDL_long_long offset
, /* In */ IDL_long_long length
, /* In */ BYTE * data)
{
char lobUpdateQuery[1000] = {0};
char RequestError[200] = {0};
SRVR_STMT_HDL * QryLobUpdateSrvrStmt = NULL;
if ((QryLobUpdateSrvrStmt = getSrvrStmt("MXOSRVR_UPDATELOB", TRUE)) == NULL)
{
SendEventMsg(MSG_MEMORY_ALLOCATION_ERROR,
EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId,
ODBCMX_SERVER,
srvrGlobal->srvrObjRef,
2,
"LOB UPDATE APIs",
"Allocate Statement");
exception_->exception_nr = odbc_SQLSvc_UpdateLob_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_UNABLE_TO_ALLOCATE_SQL_STMT;
}
if (offset == 0)
{
snprintf(lobUpdateQuery, sizeof(lobUpdateQuery), "UPDATE LOB (LOB'%s', LOCATION %Ld, SIZE %Ld)", lobHandle, (Int64)data, length);
}
else
{
snprintf(lobUpdateQuery, sizeof(lobUpdateQuery), "UPDATE LOB (LOB'%s', LOCATION %Ld, SIZE %Ld, APPEND)", lobHandle, (Int64)data, length);
}
short retcode = 0;
try
{
retcode = QryLobUpdateSrvrStmt->ExecDirect(NULL, lobUpdateQuery, INTERNAL_STMT, TYPE_UNKNOWN, SQL_ASYNC_ENABLE_OFF, 0);
if (retcode == SQL_ERROR)
{
ERROR_DESC_def * p_buffer = QryLobUpdateSrvrStmt->sqlError.errorList._buffer;
char errNumStr[128] = {0};
sprintf(errNumStr, "%d", (int)p_buffer->sqlcode);
strncpy(RequestError, p_buffer->errorText, sizeof(RequestError) - 1);
SendEventMsg(MSG_SQL_ERROR,
EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId,
ODBCMX_SERVER,
srvrGlobal->srvrObjRef,
2,
errNumStr,
RequestError);
exception_->exception_nr = odbc_SQLSvc_UpdateLob_ParamError_exn_;
exception_->u.SQLError.errorList._length = QryLobUpdateSrvrStmt->sqlError.errorList._length;
exception_->u.SQLError.errorList._buffer = QryLobUpdateSrvrStmt->sqlError.errorList._buffer;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECUTE_FAILED;
}
}
catch (...)
{
SendEventMsg(MSG_PROGRAMMING_ERROR,
EVENTLOG_ERROR_TYPE,
srvrGlobal->nskProcessInfo.processId,
ODBCMX_SERVER,
srvrGlobal->srvrObjRef,
1,
"Exception in executing UPDATE_LOB");
exception_->exception_nr = odbc_SQLSvc_UpdateLob_ParamError_exn_;
exception_->u.ParamError.ParamDesc = SQLSVC_EXCEPTION_EXECUTE_FAILED;
}
if (QryLobUpdateSrvrStmt != NULL) {
QryLobUpdateSrvrStmt->Close(SQL_DROP);
}
}
//========================================================================
//LCOV_EXCL_START
short qrysrvc_GetAdaptiveSegment()
{
static ADAPTIVE_SEGMENT_DATA asd = {CATCHER, ASOPER_ALLOCATE, -1};
_cc_status cc;
short error;
//short pHandle[10];
TPT_DECL(pHandle);
unsigned short wcount;
SB_Tag_Type tag;
Int32 timeout = AS_TIMEOUT;
int size;
if (srvrGlobal->bWMS_AdaptiveSegment == false)
return -1;
if ((error = getProcessHandle(srvrGlobal->QSProcessName,
TPT_REF(pHandle))) != 0)
{
if (srvrGlobal->fnumAS != -1)
{
FILE_CLOSE_(srvrGlobal->fnumAS);
srvrGlobal->fnumAS = -1;
}
return -1;
}
if (srvrGlobal->fnumAS == -1 || 2 != PROCESSHANDLE_COMPARE_(TPT_REF(pHandle), TPT_REF(srvrGlobal->pASHandle)))
{
if (srvrGlobal->fnumAS != -1)
{
FILE_CLOSE_(srvrGlobal->fnumAS);
srvrGlobal->fnumAS = -1;
}
// bits <1> ON - nowait
short option = 0x4000;
error = FILE_OPEN_(srvrGlobal->QSProcessName
, strlen(srvrGlobal->QSProcessName)
, &srvrGlobal->fnumAS
, 0 //access
, 0 //exclusion
, 1 //nowait_depth
, 0 //sync-or-receive-depth
, option //options
);
if (error == 0)
{
cc = AWAITIOX(&srvrGlobal->fnumAS,OMITREF,OMITREF,OMITREF,timeout);
if (_status_lt(cc))
FILE_GETINFO_ (srvrGlobal->fnumAS, &error);
else
error = 0;
}
if (error == 0)
{
if ((error = getProcessHandle(srvrGlobal->QSProcessName,
TPT_REF(srvrGlobal->pASHandle))) != 0)
error = 1;
}
if (error)
{
if (srvrGlobal->fnumAS != -1) //timeout
FILE_CLOSE_(srvrGlobal->fnumAS);
srvrGlobal->fnumAS = -1;
return -1;
}
}
size = sizeof(asd);
short fnum = srvrGlobal->fnumAS;
cc = WRITEREADX( fnum,
(char*)&asd,
size,
size,
&wcount,
tag);
if (_status_lt(cc))
{
FILE_CLOSE_(srvrGlobal->fnumAS);
srvrGlobal->fnumAS = -1;
return -1;
}
cc = AWAITIOX(&fnum,OMITREF,&wcount,&tag,timeout);
if (_status_lt(cc))
{
FILE_CLOSE_(srvrGlobal->fnumAS);
srvrGlobal->fnumAS = -1;
return -1;
}
return asd.segment;
}
void AllocateAdaptiveSegment(SRVR_STMT_HDL *pSrvrStmt)
{
if (srvrGlobal->bWMS_AdaptiveSegment == false)
return;
if (pSrvrStmt->m_isAdaptiveSegmentAllocated)
{
if (pSrvrStmt->m_adaptive_segment != -1)
ClearAdaptiveSegment(pSrvrStmt->m_adaptive_segment);
}
pSrvrStmt->m_isAdaptiveSegmentAllocated = false;
pSrvrStmt->m_adaptive_segment = qrysrvc_GetAdaptiveSegment();
if (pSrvrStmt->m_adaptive_segment != -1)
pSrvrStmt->m_isAdaptiveSegmentAllocated = true;
if (pSrvrStmt->m_adaptive_segment != srvrGlobal->lastCQDAdaptiveSegment)
{
char AffinityCQD[64];
sprintf(AffinityCQD, "CONTROL QUERY DEFAULT AFFINITY_VALUE '%d'", pSrvrStmt->m_adaptive_segment);
EXECDIRECT(AffinityCQD);
srvrGlobal->lastCQDAdaptiveSegment = pSrvrStmt->m_adaptive_segment;
}
}
void DeallocateAdaptiveSegment(SRVR_STMT_HDL *pSrvrStmt)
{
if (srvrGlobal->bWMS_AdaptiveSegment == false)
return;
if (pSrvrStmt->m_isAdaptiveSegmentAllocated)
{
if (pSrvrStmt->m_adaptive_segment != -1)
ClearAdaptiveSegment(pSrvrStmt->m_adaptive_segment);
pSrvrStmt->m_isAdaptiveSegmentAllocated = false;
}
}
void ClearAdaptiveSegment(short adapiveSeg)
{
static ADAPTIVE_SEGMENT_DATA asd = {CATCHER, ASOPER_INIT, -1};
_cc_status cc;
short error;
//short pHandle[10];
TPT_DECL(pHandle);
unsigned short wcount;
SB_Tag_Type tag;
Int32 timeout = AS_TIMEOUT;
if (srvrGlobal->bWMS_AdaptiveSegment == false)
return;
if ((error = getProcessHandle(srvrGlobal->QSProcessName,
TPT_REF(pHandle))) != 0)
{
if (srvrGlobal->fnumAS != -1)
{
FILE_CLOSE_(srvrGlobal->fnumAS);
srvrGlobal->fnumAS = -1;
}
return;
}
if (adapiveSeg == -1)
{
asd.operation = ASOPER_DEALLOCATE_ALL;
}
else
{
asd.operation = ASOPER_DEALLOCATE;
asd.segment = adapiveSeg;
}
if (srvrGlobal->fnumAS == -1 || 2 != PROCESSHANDLE_COMPARE_(TPT_REF(pHandle),TPT_REF(srvrGlobal->pASHandle)))
{
if (srvrGlobal->fnumAS != -1)
{
FILE_CLOSE_(srvrGlobal->fnumAS);
srvrGlobal->fnumAS = -1;
}
// bits <1> ON - nowait
short option = 0x4000;
error = FILE_OPEN_(srvrGlobal->QSProcessName
, strlen(srvrGlobal->QSProcessName)
, &srvrGlobal->fnumAS
, 0 //access
, 0 //exclusion
, 1 //nowait_depth
, 0 //sync-or-receive-depth
, option //options
);
if (error == 0)
{
cc = AWAITIOX(&srvrGlobal->fnumAS,OMITREF,OMITREF,OMITREF,timeout);
if (_status_lt(cc))
FILE_GETINFO_ (srvrGlobal->fnumAS, &error);
else
error = 0;
}
if (error == 0)
{
if ((error = getProcessHandle(srvrGlobal->QSProcessName,
TPT_REF(srvrGlobal->pASHandle))) != 0)
error = 1;
}
if (error)
{
if (srvrGlobal->fnumAS != -1) //timeout
FILE_CLOSE_(srvrGlobal->fnumAS);
srvrGlobal->fnumAS = -1;
}
}
if (srvrGlobal->fnumAS != -1)
{
cc = WRITEREADX( srvrGlobal->fnumAS,
(char*)&asd,
sizeof(asd),
sizeof(asd),
&wcount,
tag);
if (_status_lt(cc))
{
FILE_CLOSE_(srvrGlobal->fnumAS);
srvrGlobal->fnumAS = -1;
return;
}
cc = AWAITIOX(&(srvrGlobal->fnumAS),OMITREF,&wcount,&tag,timeout);
if (_status_lt(cc))
{
FILE_CLOSE_(srvrGlobal->fnumAS);
srvrGlobal->fnumAS = -1;
}
}
}
//LCOV_EXCL_STOP
//==========================================================
static void setAuthenticationError(
bool & bSQLMessageSet,
odbc_SQLSvc_SQLError * SQLError,
const char * externalUsername,
bool isInternalError)
{
const char authErrorMessageHeader[] = "*** ERROR[8837] Invalid username or password";
const char authInternalErrorMessageHeader[] = "*** ERROR[8837] Internal error occurred";
char strNow[TIMEBUFSIZE + 1];
kdsCreateSQLErrorException(bSQLMessageSet,SQLError,1);
size_t messageHeaderLength;
if (isInternalError)
messageHeaderLength = strlen(authInternalErrorMessageHeader);
else
messageHeaderLength = strlen(authErrorMessageHeader);
size_t messageLength = (messageHeaderLength + 1) * 4 + TIMEBUFSIZE;
char *message = new char[messageLength];
if (isInternalError)
strcpy(message,authInternalErrorMessageHeader);
else
strcpy(message,authErrorMessageHeader);
strcat(message,". User: ");
strcat(message,externalUsername);
time_t now = time(NULL);
bzero(strNow,sizeof(strNow));
strftime(strNow,sizeof(strNow)," [%Y-%m-%d %H:%M:%S]", localtime(&now));
strcat(message,strNow);
kdsCopySQLErrorExceptionAndRowCount(SQLError,message,-8837," ",-1);
delete message;
}