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); }