#include <stdio.h>
#include <time.h>
#include <xa.h>
#include <atmi.h>
#include <userlog.h>
#include "vql_client.h"
#include <libudbc.h>
#ifndef SQL_SUCCEEDED
#define SQL_SUCCEEDED(rc) (((rc)&(~1))==0)
#endif
#define MAXNAME SQL_MAX_DSN_LENGTH
int sql_exec (HDBC hdbc, char* text);
/* VirtRM test service */
int
tpsvrinit(int argc, char *argv[])
{
if (tpopen () == -1)
{
userlog ("tpsrvinit: could not open RM, %s\n", tpstrerror (tperrno));
return -1;
}
/* userlog writes to the central TUXEDO message log */
userlog("Welcome to the VirtRMtest server");
return 0;
}
int
tpsrvdone()
{
if (tpclose () == -1)
{
userlog ("tpsrvinit: could not close RM, %s\n", tpstrerror (tperrno));
return -1;
}
/* userlog writes to the central TUXEDO message log */
userlog("By!! the VirtRMtest server");
return 0;
}
static void
DoSQLError (HDBC hdbc, HSTMT hstmt);
#define CHECK_RC(rc) \
if (!SQL_SUCCEEDED (rc)) { DoSQLError (hdbc, stmt); return -1; };
int sql_exec (HDBC hdbc, char* text)
{
RETCODE rc;
HSTMT stmt;
rc = SQLAllocStmt (hdbc, &stmt);
CHECK_RC(rc);
rc = SQLExecDirect (stmt, text, SQL_NTS);
CHECK_RC(rc);
SQLFreeStmt (stmt, SQL_DROP);
return 0;
}
void
VRMTEST(TPSVCINFO *rqst)
{
HDBC hdbc;
int rc;
rc = vql_get_connection (&hdbc, VQL_CTX_TYPE);
if (rc != VQL_SUCCESS)
{
#ifdef TMS_TRACE
userlog ("AP[%d]: vql_get_connection error %d\n", getpid(), rc);
#endif
goto _fail;
}
rc = sql_exec (hdbc, "UPDATE sal set amount = amount + 10 where name = 'jfk'");
if (rc == -1)
{
#ifdef TMS_TRACE
userlog ("AP[%d]: vql_get_connection error %d\n", getpid(), rc);
#endif
goto _fail;
}
userlog ("AP[%d]: exec sql succ.\n", getpid());
tpreturn(TPSUCCESS, 0, rqst->data, 0L, 0);
return;
_fail:
userlog ("FAILED: exec sql.\n");
tpreturn(TPFAIL, 0, rqst->data, 0L, 0);
return;
}
void
VRMTEST2(TPSVCINFO *rqst)
{
HDBC hdbc;
int rc;
rc = vql_get_connection (&hdbc, VQL_CTX_TYPE);
if (rc != VQL_SUCCESS)
goto _fail;
rc = sql_exec (hdbc, "UPDATE sal set amount = amount - 10 where name = 'jfk'");
if (rc == -1)
goto _fail;
userlog ("AP[%d]: exec sql succ.\n", getpid());
tpreturn(TPSUCCESS, 0, rqst->data, 0L, 0);
return;
_fail:
userlog ("AP[%d]: service #2 error %d\n", getpid(), rc);
tpreturn(TPFAIL, 0, rqst->data, 0L, 0);
return;
tpreturn(TPSUCCESS, 0, rqst->data, 0L, 0);
}
#define MSG_BUF_SIZE 300
static void
DoSQLError (HDBC hdbc, HSTMT hstmt)
{
UCHAR szSqlState[MSG_BUF_SIZE];
UCHAR szErrorMsg[MSG_BUF_SIZE];
SQLINTEGER fNativeError = 0;
SWORD cbErrorMsg = MSG_BUF_SIZE;
RETCODE rc;
HENV env;
#ifndef TMS_TRACE
return;
#else
vql_get_env (&env);
rc = SQLError (env,
hdbc,
hstmt,
szSqlState, &fNativeError, szErrorMsg, MSG_BUF_SIZE, &cbErrorMsg);
if (rc != SQL_NO_DATA_FOUND || rc != SQL_ERROR)
{
if (fNativeError != 0x1645) // ignore change database to master context message
{
userlog ("SqlState: %s, fNativeError: %x m=%s\n", szSqlState,
fNativeError, szErrorMsg);
}
}
else
{
userlog ("SQLError() failed: %x, NO_DATA_FOUND OR SQL_ERROR\n", rc);
}
return;
#endif
}
|
Previous
Clients |
Chapter Contents |
Next
Contents of Appendix |