ページの先頭行へ戻る
Symfoware Server V10.0.1 Connection Managerユーザーズガイド(9.x)

5.3.1 埋込みCプログラムの作成例

SQL文の実行結果は状態変数SQLSTATEでアプリケーションに通知されます。ここではフェイルオーバ運用の場合の例を示します。

静的SQL文を使用したアプリケーションの作成例

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