SQL文の実行結果は状態変数SQLSTATEでアプリケーションに通知されます。ここではフェイルオーバ運用の場合の例を示します。
/*
* samplec.c -- サーバアプリケーション呼出し
*/
#include <stdio.h>
#include <string.h>
#include "orb.h"
#include "OM_imlp_rep.h"
#include "samplec.h"
:
:
static CORBA_ORB orb;
static CORBA_BOA boa;
static CORBA_Object Current;
static CORBA_Environment env;
:
:
/* サーバアプリケーションの復帰値 */
#define RET_NORMAL 0 /* 正常終了 */
#define RET_NOTFOUND 2 /* データなし */
#define RET_COMDOWN 16 /* コネクション切断 */
#define RET_ERROR -1 /* その他のSQLエラー */
/* --------------------------------------------------------*/
/* Exception */
/* --------------------------------------------------------*/
static void env_check(CORBA_string pos)
{
CORBA_string id;
if ( env._major != CORBA_NO_EXCEPTION ) {
fprintf( stderr, "env_check: %s fails code = 0x%08x, minor=0x%x\n",
pos, env._major, env._minor );
id = CORBA_exception_id( &env );
fprintf( stderr, "env_check: exception id = %s\n", id );
exit(1);
}
}
/* --------------------------------------------------------*/
/* main */
/* --------------------------------------------------------*/
int main(int argc, char *argv[])
{
int current_argc = argc;
CORBA_Object obj;
CORBA_long ret;
SAMPLEC_INTF_sdata indata;
/*--------------------------------------------------------------*/
/* 初期処理 */
/*--------------------------------------------------------------*/
:
:
/*--------------------------------------------------------------*/
/* start program */
/*--------------------------------------------------------------*/
RETRY_CALL:
indata.data1 = "Tokyo";
indata.data2 = 3;
/*
* ■サーバアプリケーション呼出し処理
*/
printf("samplec: call SAMPLEC_INTF_FUNC(INSERT)\n");
ret = SAMPLEC_INTF_FUNC(
obj,
&indata,
&env
);
printf("samplec: return code=%d\n", ret);
env_check( "invoke SAMPLEC_INTF_FUNC()" );
if (ret == RET_COMDOWN) {
/* ■コネクション切断の場合にはリトライする */
goto RETRY_CALL;
}
else if (ret != RET_NORMAL) {
/* ■その他のエラーは終了する */
goto ERR_END1;
}
return(0);
ERR_END1:
return(-1);
} /* End of main() *//*
* samples.ec - サーバアプリケーション
*/
#include <stdio.h>
#include <string.h>
#include "TD_SAMPLEC_INTF.h"
EXEC SQL BEGIN DECLARE SECTION;
char O_DATA1[7];
long O_DATA2;
char SQLSTATE[6];
char SQLMSG[256];
EXEC SQL END DECLARE SECTION;
/* 内部関数宣言 */
CORBA_long SAMPLEC_CHECK_STATE( CORBA_char * );
/*
* サーバアプリケーション:本処理
*/
CORBA_long
SAMPLEC_INTF_FUNC (
CORBA_Object obj,
SAMPLEC_INTF_sdata *indata,
CORBA_Environment *env
)
{
CORBA_long rc;
strcpy(O_DATA1, indata->data1 );
O_DATA2 = indata->data2;
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL INSERT INTO S1.T1 ( COL1, COL2 )
VALUES (:O_DATA1, :O_DATA2);
rc = SAMPLEC_CHECK_STATE("INSERT");
if (rc != RET_NORMAL) {
goto ERR_END1;
}
EXEC SQL COMMIT WORK;
rc = SAMPLEC_CHECK_STATE("COMMIT");
if (rc != RET_NORMAL) {
goto ERR_END1;
}
return(RET_NORMAL);
ERR_END1:
EXEC SQL ROLLBACK WORK;
SAMPLEC_CHECK_STATE("ROLLBACK");
return(rc);
}
/*
* SQLSTATE判定
*/
CORBA_long
SAMPLEC_CHECK_STATE (
CORBA_char *sql_p
)
{
printf("SAMPLEC: SQLSTATE(%s):%s\n", sql_p, SQLSTATE);
printf("SAMPLEC: SQLMSG (%s):%s\n", sql_p, SQLMSG);
if (memcmp(SQLSTATE, "40003", 5) == 0 ||
memcmp(SQLSTATE, "40703", 5) == 0) {
return(RET_COMDOWN);
}
else if (memcmp(SQLSTATE, "02000", 5) == 0) {
return(RET_NOTFOUND);
}
else if (memcmp(SQLSTATE, "00000", 5) == 0) {
return(RET_NORMAL);
}
else {
return(RET_ERROR);
}
}
/*
* 前出口プログラム -- WU起動時に実行される処理
*/
CORBA_long
SAMPLEC_INTF_FUNC_PRE ()
{
EXEC SQL CONNECT TO 'SV1' USER 'user001/user001';
if (memcmp(SQLSTATE, "00", 2) != 0) {
return(RET_ERROR);
}
return(RET_NORMAL);
}
/*
* 後出口プログラム -- WU停止時に実行される処理
*/
CORBA_long
SAMPLEC_INTF_FUNC_POST ()
{
EXEC SQL ROLLBACK WORK;
EXEC SQL DISCONNECT ALL;
return(RET_NORMAL);
}