가변배열 사용예제

가변배열을 사용하는 DBIO 출력 예제를 다음과 같이 설명한다. 데이터베이스에 접근하여 가져온 데이터를 ProMapper에서 정의한 가변배열 구조체에 담는다.

이 사용예제는 가변배열 사용의 대표적인 경우로 애플리케이션 프로그램을 작성하는데 참고한다.

/**************************************
 * KIND     : Intermediary Module Function
 * NODE ID  : 1
 * NAME     : 가변 출력 처리
 * DESCRIPTION :
 *************************************/
static long innerModule1(test_biz2Context *context)
{
    long rc = RC_NRM;

    // Variables Declaration
    long fetchCnt = 0; /*  */
    long fetchRc = 0; /*  */

    // Variables Initialization

    {
        /**************************************
         * KIND     : DBIO Fetch Loop
         * NODE ID  : 2
         * NAME     : testdev_meta_pf990 Fetch loop
         * DESCRIPTION :
         *************************************/
        testdev_meta_pf990In temporaryInput2;
        testdev_meta_pf990Out temporaryOutput2[10];

        bzero(&temporaryInput2, sizeof(testdev_meta_pf990In));
        bzero(temporaryOutput2, sizeof(testdev_meta_pf990Out) * 10);

        //DO_NOT_MODIFY_THIS_LINE-----------START_OF_CODE:DBIO_DYNAMIC_PARAMETER
           NODEID3----------------//
        //TODO Auto-generated method stub
        //DO_NOT_MODIFY_THIS_LINE-----------END_OF_CODE:DBIO_DYNAMIC_PARAMETER
          NODEID3------------------//


①     PFM_TRYNJ(pfmDbioOpenCursorArray("testdev_meta_pf990",
                 &temporaryInput2, NULL, FMWDBIO_NOLOCK));
        //START_OF_CODE:testdev_meta_pf990 Fetch loop DBIO_FETCH_LOOP
        while (1)
        {
          {
                //DO_NOT_MODIFY_THIS_LINE-----------START_OF_CODE:BEFORE_CODE
                  NODEID3------------------//
                // TODO Auto-generated method stub
                //DO_NOT_MODIFY_THIS_LINE-----------END_OF_CODE:BEFORE_CODE
                  NODEID3--------------------//


                /**************************************
                 *   KIND              : DBIO_FETCH Callee Info
                 *   NAME              : testdev_meta_pf990
                 *   EXEC              : FETCH
                 *   INPUT             : testdev_meta_pf990In
                 *   OUTPUT            : testdev_meta_pf990Out
                 *   ARRAY INPUT       : NONE
                 *   ARRAY OUTPUT      : testdev_meta_pf990BundleOut
                 *   DYNAMIC STRUCTURE : NONE
                 *************************************/
②               PFM_TRYNJ(pfmDbioFetchArray("testdev_meta_pf990", 10,
                                              &temporaryOutput2));
                 //DO_NOT_MODIFY_THIS_LINE-----------
                   START_OF_CODE:DBIO_FETCH_EXCEPTION NODEID3--------//

                 fetchRc = rc;

                 if (fetchRc != RC_NRM)
                 {
③                 if (fetchRc == RC_NFD && pfmDbioGetRecordCount() == 0 )
                   {
                     PFM_ERR("TRSE001001", "조건에 맞는 데이터가 존재하지
                     않습니다 [%ld]", rc);
                     PFM_TRY(pfmDbioCloseCursorArray("testdev_meta_pf990"));
                     return fetchRc;
                   }
                   else if(fetchRc != RC_NFD ) {
                    PFM_ERR("TRSE001001", "[FAIL] Fetch Result rc=[%ld]
                             ErrCode[%ld], ErrorString[%s]", rc, pfmDbioGetErrorNo(),
                             pfmDbioGetErrorString());
④                  PFM_TRY(pfmDbioCloseCursorArray("testdev_meta_pf990"));
                     return fetchRc;
                   }
                 }

⑤               if(fetchRc==RC_NRM||(fetchRc==RC_NFD &&
                     pfmDbioGetRecordCount()%AS_TESTDEV_META_PF990>0 ))
                 {
                   PFM_DBG("가변 출력 처리를 위한 처리");

                   /* 최대 출력 건수 초과인지 Check */
                   if( pfmVarrayCount(OUTPUT->test) >= 25 )
                   {
                     PFM_ERR("TRSE001001", "최대 출력 건수 초과입니다.
                              할당된 건수:[%ld] 건 ", pfmVarrayCount(OUTPUT->test));
                     return RC_ERR;
                   }

                   /* 가변 배열 정의 건수 */
                   if( rc==RC_NFD)
                   {
                     fetchCnt = pfmDbioGetRecordCount() % AS_TESTDEV_META_PF990;
                   }
                   else
                   {
                     fetchCnt = AS_TESTDEV_META_PF990;
                   }

                   /* 가변 배열로 할당 */
⑥                   for( int i = 0; i < fetchCnt; i++){
                   pfmVarrayAppend( OUTPUT->test, &temporaryOutput2[i]);
                     OUTPUT->cnt++;
                   }
                 }

                 /* 마지막 처리인 경우 break */
                 if(fetchRc == RC_NFD )
                 {
                   PFM_DBG("rc=[%ld]로 break처리", rc);
⑦                 break;
                 }
                 //DO_NOT_MODIFY_THIS_LINE-----------
                   END_OF_CODE:DBIO_FETCH_EXCEPTION NODEID3----------//

                 //DO_NOT_MODIFY_THIS_LINE-----------
                   START_OF_CODE:AFTER_CODE NODEID3------------------//
                 // TODO Auto-generated method stub
                 //DO_NOT_MODIFY_THIS_LINE-----------
                   END_OF_CODE:AFTER_CODE NODEID3--------------------//
          }
        }
        //END_OF_CODE:testdev_meta_pf990 Fetch loop DBIO_FETCH_LOOP

        PFM_TRY(pfmDbioCloseCursorArray("testdev_meta_pf990"));
        //DO_NOT_MODIFY_THIS_LINE-----------
          START_OF_CODE:DBIO_FETCH_LOOP_EXCEPTION NODEID2------------//
        // TODO Auto-generated method stub
        //DO_NOT_MODIFY_THIS_LINE-----------
        END_OF_CODE:DBIO_FETCH_LOOP_EXCEPTION NODEID2--------------//

    }
    return RC_NRM;

    FMW_CATCH:
       return rc;
}

다음은 위 소스의 내용 중 각 번호에 대한 설명이다.

① 여러 건의 FETCH Exec 타입으로 생성된 DBIO의 경우 Cursor를 Open한 후 반복 실행하여 데이터를 배열 크기만큼 가져온다.

② 여러 건의 DBIO 파라미터는 맵 ID와 한 번에 FETCH할 데이터 개수, 출력 구조체가 있다.

③ FETCH Exec 타입으로 생성된 DBIO가 Not Found 에러를 반환하는 경우 실제로 데이터가 존재하지 않는 것인지 아니면 FETCH 배열 개수를 채우지 못해 RC_NFD를 반환하는 경우인지에 대한 예외처리를 해줘야 한다.

④ 오류가 발생되는 경우를 처리하는 부분으로 DBIO 오류가 발생한 경우 Cursor를 Close한다.

⑤ RC_NRM인 경우와 마지막으로 FETCH 처리를 할 때 RC_NFD이면서 배열 개수를 채우지 못한 경우 DBIO의 결과 값으로 처리한다.

⑥ fetch_cnt는 실제 데이터베이스에서 가져온 데이터의 개수이다. 따라서 출력 구조체가 가변일 때는 fetch_cnt만큼 pfmVarrayAppend API를 사용하여 출력 구조체에 추가해야 한다. 또한 출력 구조체의 가변인자를 OUTPUT→cnt를 통해 데이터의 개수를 처리한다.

⑦ FETCH 배열 개수를 채우지 못해 에러를 반환하는 경우 더 이상 데이터가 없는 것으로 판단하여 while 문을 빠져 나온다.