/************************************************************************ * name: SQLNativeSqlW * arguments: * returns/side-effects: * description: * NOTE: ************************************************************************/ ODBC_INTERFACE RETCODE SQL_API SQLNativeSqlW (SQLHDBC hdbc, SQLWCHAR *in, SQLINTEGER in_len, SQLWCHAR *out, SQLINTEGER out_max, SQLINTEGER *out_len) { RETCODE ret = ODBC_ERROR; SQLCHAR *sql_state, *sql_text_buffer = NULL; int sql_state_len; ODBC_CONNECTION * ConnectionHandle = (ODBC_CONNECTION *) hdbc; OutputDebugString ("SQLNativeSqlW called.\n"); ret = wide_char_to_bytes (in, in_len, &sql_state, &sql_state_len, NULL); sql_text_buffer = UT_ALLOC (out_max); if (sql_text_buffer == NULL && out_max > 0) { odbc_set_diag (ConnectionHandle->diag, "HY001", 0, "malloc failed"); return ODBC_ERROR; } memset (sql_text_buffer, 0 , out_max); ret = SQLNativeSql(hdbc, sql_state, sql_state_len, sql_text_buffer, out_max, out_len); if (ret == ODBC_ERROR) { UT_FREE (sql_text_buffer); return ret; } bytes_to_wide_char (sql_state, sql_state_len, &out, out_max, out_len, NULL); UT_FREE (sql_text_buffer); return ret; }
std::string ODBCStatementImpl::nativeSQL() { std::string statement = toString(); SQLINTEGER length = (SQLINTEGER) statement.size() * 2; char* pNative = 0; SQLINTEGER retlen = length; do { delete [] pNative; pNative = new char[retlen]; memset(pNative, 0, retlen); length = retlen; if (Utility::isError(SQLNativeSql(_rConnection, (SQLCHAR*) statement.c_str(), (SQLINTEGER) statement.size(), (SQLCHAR*) pNative, length, &retlen))) { delete [] pNative; throw ConnectionException(_rConnection, "SQLNativeSql()"); } ++retlen;//accomodate for terminating '\0' }while (retlen > length); std::string sql(pNative); delete [] pNative; return sql; }
/* --------------------------------------------------------- TestSQLNativeSql --------------------------------------------------------- */ PassFail TestSQLNativeSql(TestInfo *pTestInfo) { TEST_DECLARE; RETCODE returncode; SQLHANDLE henv; SQLHANDLE hdbc; SQLHANDLE hstmt; CHAR *szSqlStrIn[3]; CHAR szSqlStrOut[SQLSTR_LEN]; SDWORD pcbSqlStr; //=========================================================================================================== var_list_t *var_list; var_list = load_api_vars("SQLNativeSql", charset_file); if (var_list == NULL) return FAILED; //print_list(var_list); szSqlStrIn[0] = var_mapping("SQLNativeSql_szSqlStrIn_1", var_list); szSqlStrIn[1] = var_mapping("SQLNativeSql_szSqlStrIn_2", var_list); szSqlStrIn[2] = var_mapping("SQLNativeSql_szSqlStrIn_3", var_list); //=========================================================================================================== LogMsg(LINEBEFORE+SHORTTIMESTAMP,"Begin testing API =>SQLNativeSql | SQLNativeSQL | natsql.c\n"); TEST_INIT; returncode=FullConnect(pTestInfo); if (pTestInfo->hdbc == (SQLHANDLE)NULL) { TEST_FAILED; TEST_RETURN; } henv = pTestInfo->henv; hdbc = pTestInfo->hdbc; hstmt = (SQLHANDLE)pTestInfo->hstmt; returncode = SQLAllocStmt((SQLHANDLE)hdbc, &hstmt); if (returncode == SQL_SUCCESS) { //================================================================================================== TESTCASE_BEGIN("Test the positive functionality of SQLNativeSql with null terminated string\n"); returncode = SQLNativeSql((SQLHANDLE)hdbc, (SQLCHAR*)szSqlStrIn[0], SQL_NTS, (SQLCHAR*)szSqlStrOut, SQLSTR_LEN, &pcbSqlStr); if(!CHECKRC(SQL_SUCCESS,returncode,"SQLNativeSql")) { TEST_FAILED; LogAllErrors(henv,hdbc,hstmt); } if (strcmp(szSqlStrOut,szSqlStrIn[0]) == 0) { LogMsg(NONE,"expect: %s and actual: %s are matched\n", szSqlStrIn[0], szSqlStrOut); } else { TEST_FAILED; LogMsg(NONE,"expect: %s and actual: %s are not matched\n", szSqlStrIn[0], szSqlStrOut); } TESTCASE_END; //================================================================================================== TESTCASE_BEGIN("Test the positive functionality of SQLNativeSql with string length as input\n"); returncode = SQLNativeSql((SQLHANDLE)hdbc, (SQLCHAR*)szSqlStrIn[1], strlen(szSqlStrIn[1]), (SQLCHAR*)szSqlStrOut, SQLSTR_LEN, &pcbSqlStr); if(!CHECKRC(SQL_SUCCESS,returncode,"SQLNativeSql")) { TEST_FAILED; LogAllErrors(henv,hdbc,hstmt); } if (strcmp(szSqlStrOut,szSqlStrIn[1]) == 0) { LogMsg(NONE,"expect: %s and actual: %s are matched\n", szSqlStrIn[1], szSqlStrOut); } else { TEST_FAILED; LogMsg(NONE,"expect: %s and actual: %s are not matched\n", szSqlStrIn[1], szSqlStrOut); } TESTCASE_END; //================================================================================================== TESTCASE_BEGIN("Test the positive functionality of SQLNativeSql with max length same as string length\n"); returncode = SQLNativeSql((SQLHANDLE)hdbc, (SQLCHAR*)szSqlStrIn[2], strlen(szSqlStrIn[2]), (SQLCHAR*)szSqlStrOut, strlen(szSqlStrIn[2])+1, &pcbSqlStr); if(!CHECKRC(SQL_SUCCESS,returncode,"SQLNativeSql")) { TEST_FAILED; LogAllErrors(henv,hdbc,hstmt); } if (strcmp(szSqlStrOut,szSqlStrIn[2]) == 0) { LogMsg(NONE,"expect: %s and actual: %s are matched\n", szSqlStrIn[2], szSqlStrOut); } else { TEST_FAILED; LogMsg(NONE,"expect: %s and actual: %s are not matched\n", szSqlStrIn[2], szSqlStrOut); } TESTCASE_END; } //================================================================================================== FullDisconnect(pTestInfo); LogMsg(SHORTTIMESTAMP+LINEAFTER,"End testing API => SQLNativeSql.\n"); free_list(var_list); TEST_RETURN; }
static int odbc_dispatch21(void) { unsigned long retval; PWord rval; int rtype; PWord arg1; int type1; PWord arg2; int type2; PWord arg3; int type3; PWord arg4; int type4; PWord arg5; int type5; PWord arg6; int type6; PWord arg7; int type7; PWord arg8; int type8; PI_getan(&arg1,&type1,1); if (type1 != PI_INT) if (!CI_get_integer((unsigned long *)&arg1,type1)) PI_FAIL; PI_getan(&arg2,&type2,2); if (type2 != PI_INT) if (!CI_get_integer((unsigned long *)&arg2,type2)) PI_FAIL; PI_getan(&arg3,&type3,3); if (type3 == PI_SYM) arg3 = (unsigned long) PI_getsymname(0,arg3,0); else if (!CI_get_integer((unsigned long *)&arg3,type3)) PI_FAIL; PI_getan(&arg4,&type4,4); if (type4 != PI_INT) if (!CI_get_integer((unsigned long *)&arg4,type4)) PI_FAIL; PI_getan(&arg5,&type5,5); if (type5 == PI_SYM) arg5 = (unsigned long) PI_getsymname(0,arg5,0); else if (!CI_get_integer((unsigned long *)&arg5,type5)) PI_FAIL; PI_getan(&arg6,&type6,6); if (type6 != PI_INT) if (!CI_get_integer((unsigned long *)&arg6,type6)) PI_FAIL; PI_getan(&arg7,&type7,7); if (type7 != PI_INT) if (!CI_get_integer((unsigned long *)&arg7,type7)) PI_FAIL; PI_getan(&arg8,&type8,8); switch(arg1) { case 0: retval = (unsigned long) SQLNativeSql(((SQLHDBC ) arg2),((SQLCHAR * ) arg3),((SQLINTEGER ) arg4),((SQLCHAR * ) arg5),((SQLINTEGER ) arg6),((SQLINTEGER * ) arg7)); break; case 1: retval = (unsigned long) SQLBrowseConnect(((SQLHDBC ) arg2),((SQLCHAR * ) arg3),((SQLSMALLINT ) arg4),((SQLCHAR * ) arg5),((SQLSMALLINT ) arg6),((SQLSMALLINT * ) arg7)); break; default: PI_FAIL; } PI_makedouble(&rval,&rtype,(double) retval); if (PI_unify(arg8,type8,rval,rtype)) PI_SUCCEED; PI_FAIL; }
int main(int argc, char *argv[]) { SQLRETURN cliRC = SQL_SUCCESS; int rc = 0; SQLHANDLE henv; /* environment handle */ SQLHANDLE hdbc; /* connection handle */ /* SQL SELECT statement to be executed */ SQLCHAR inODBCStmt[] = "SELECT * FROM employee WHERE hiredate={d '1994-03-29'}"; SQLCHAR odbcEscapeClause[] = "{d '1994-03-29'}"; SQLCHAR outDbStmt[1024]; SQLINTEGER dbStmtLen; char dbAlias[SQL_MAX_DSN_LENGTH + 1]; char user[MAX_UID_LENGTH + 1]; char pswd[MAX_PWD_LENGTH + 1]; /* check the command line arguments */ rc = CmdLineArgsCheck1(argc, argv, dbAlias, user, pswd); if (rc != 0) { return rc; } printf("\nTHIS SAMPLE SHOWS HOW TO TRANSLATE A STATEMENT\n"); printf("THAT CONTAINS AN ODBC ESCAPE CLAUSE TO\n"); printf("A DATA SOURCE-SPECIFIC FORMAT.\n"); /* initialize the CLI application by calling a helper utility function defined in utilcli.c */ rc = CLIAppInit(dbAlias, user, pswd, &henv, &hdbc, (SQLPOINTER) SQL_AUTOCOMMIT_ON); if (rc != 0) { return rc; } printf("\n-----------------------------------------------------------"); printf("\nUSE THE CLI FUNCTION\n"); printf(" SQLNativeSql\n"); printf("TO:\n"); printf(" translate the statement\n"); printf(" %s\n", inODBCStmt); printf(" that contains the ODBC escape clause %s\n", odbcEscapeClause); printf(" to a data source-specific format.\n"); /* get the native SQL text */ SQLNativeSql(hdbc, inODBCStmt, SQL_NTS, outDbStmt, 1024, &dbStmtLen); DBC_HANDLE_CHECK(hdbc, cliRC); if (dbStmtLen == SQL_NULL_DATA) { printf("\n Invalid ODBC statement\n"); } else { printf("\n the data source specific format is:\n" " %s\n", outDbStmt); } /* terminate the CLI application by calling a helper utility function defined in utilcli.c */ rc = CLIAppTerm(&henv, &hdbc, dbAlias); return rc; } /* main */