728x90

여신 김만기 차장님의 요청에 의하여 오전에 오전임과 같이 만들었으니 향후 검토하신 후에 compile shell 뒤에 append 하여 모든 프로그램 컴파일 할 때 warning 을 보여 준다면 어떨까 검토해 주신 후 적용해 주세요.

프로그램명 : inspect_code
적용룰 : PFM_TRYNJ 절 뒤에 SET_ERR 을 안 한 경우를 찾아 줌
사용예 : 소스가 존재하는 디렉토리로 이동해서 inspect_code 를 실행합니다.

nbtap01#/nbsdev/compile/NLDS/src/service>inspect_code NLDS1001I0
"NLDS1001I0.c", line 475: warning #9999: not found SET_ERR after PFM_TRYNJ
"NLDS1001I0.c", line 1541: warning #9999: not found SET_ERR after PFM_TRYNJ
"NLDS1001I0.c", line 1727: warning #9999: not found SET_ERR after PFM_TRYNJ
nbtap01#/nbsdev/compile/NLDS/src/service>
 
더 필요한 체크 룰이 있다면( code inspection 툴이 체크해 내지 못하는 ) 오전임에게 요청해서 반영하면 되겠죠.
(문의) 프레임웍팀 오은경


/*
 * @file            inspect_code.c
 * @brief           코드 점검
 *
 * @dep-header
 *
 * @history
 *    버    전 : 성  명  :  일  자    :  근거  자료    :          변       경        내       용
 *    --------   ------     --------     -----------     -------------------------------------------
 *    VER1.00  : 오은경  :  20080522  :  proframe 구축 :  신규 개발
 *
 */

/* --------------------------------------- include files ---------------------------------------- */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*--------------------------------- constant, macro definitions --------------------------------- */
#define RC_NRM     0
#define RC_ERR    -1
#define STRSIZE 1024
#define TRUE       1
#define FALSE      0

#define START_TAG  "//DO_NOT_MODIFY_THIS_LINE-----------START_OF_CODE"
#define END_TAG    "//DO_NOT_MODIFY_THIS_LINE-----------END_OF_CODE"


#define PFM_TRY( _Ftn )                                                             \
        do {                                                                        \
            rc = _Ftn;                                                              \
            if( rc != RC_NRM) goto PFM_CATCH;                                       \
        } while (0)

#define PFM_TRYNJ( _Ftn )                                                           \
        do {                                                                        \
            rc = _Ftn;                                                              \
        } while (0)

/* ------------------------------------ function prototypes ------------------------------------- */
/* static long open_file( FILE *fp, char *file_name ); */
static long read_file( FILE *fp, char * );

/* ------------------------------------ function main ------------------------------------------- */
int main(int argc, char *argv[] )
{
    FILE *fp = NULL;
    FILE *ofp;
    long rc = RC_NRM;
    char file_name[100];
    char base_name[100];

    if ( argc != 2 ) {
        printf("\nargument needed!\n\n");
        return RC_ERR;
    }

    strcpy( base_name, argv[1] );
    sprintf(file_name, "%s.c", base_name );
    fp = fopen(file_name, "r");

    if(fp == NULL) {
        /* printf("FILE OPEN FAILED\n");   */
        return RC_ERR;
    }
    /* printf("FILE OPEN SUCCEED\n");   */


    PFM_TRY(read_file( fp, file_name ));


    fclose(fp);


PFM_CATCH :
    return RC_ERR;
}

/* ---------------------------------------- function body ----------------------------------------*/
static long read_file( FILE *fp, char *file_name ) {

    char line[1028];
    char excpt[10280];
    long line_no = 0;
    long excpt_flag = FALSE;
    long start_flag = FALSE;
    long end_flag = FALSE;
    long seterr_flag = FALSE;
    long trynj_no = 0;

    memset(line, 0x00, sizeof(line));
    while( fgets(line, STRSIZE, fp ) != NULL )  {
        line_no++;

        if ( strstr( line, "PFM_TRYNJ" ) > 0 ) {
            /* printf("PFM_TRYNJ founded line_no=[%ld] \n", line_no); */
            excpt_flag  = TRUE;
            trynj_no    = line_no;
            start_flag  = FALSE;
            end_flag    = FALSE;
            seterr_flag = FALSE;
            continue;
        }

        if( excpt_flag == TRUE ) {
            if ( strstr( line, START_TAG ) > 0 ) {
                start_flag  = TRUE;
                continue;
            }
            else if ( strstr( line, END_TAG ) > 0 ) {
                end_flag = TRUE;
            }
            else if ( strstr( line, "SET_ERR" ) > 0 ) {
                seterr_flag = TRUE;
            }

            if ( start_flag == TRUE ) {
                if( seterr_flag == TRUE ) {
                    excpt_flag  = FALSE;
                    continue;
                }
            }
            if ( end_flag == TRUE && start_flag == TRUE ) {
                if( seterr_flag == FALSE ) {
                    printf("\"%s\", line %ld: warning #9999: not found SET_ERR after PFM_TRYNJ\n",file_name, tr
                    start_flag  = FALSE;
                    end_flag    = FALSE;
                    seterr_flag = FALSE;
                    excpt_flag  = FALSE;
                }
            }

        }

        memset(line, 0x00, sizeof(line));

    }

    return RC_NRM;
}

/* --------------------------------------- E N D  O F  F I L E -----------------------------------*/



이 프로그램을 해당 팀에 일괄 돌리겠다면 다음의 shell 을 이용하면 되겠죠..

#!/bin/ksh
#----------------------------------------------------------#
# 작성자 : 오은경  작성일:2008.5.20
#----------------------------------------------------------#

#----------------------------------------------------------#
# 입력 된 아규먼트 개수를 체크한다
#----------------------------------------------------------#
if [ $# -ne  1 ]
then
    echo "\nUsage : $0 team_code(대문자)"
    echo " \n"
    exit
fi


team_code=$1
cd $PRJROOT/compile/$team_code/src/service

pgm_lst=`ls *.c`
for pgm_one in ${pgm_lst};  do
#    echo $pgm_one
    BASE=`echo $pgm_one|cut -d"." -f1-1`
    inspect_code $BASE
done

cd $PRJROOT/compile/$team_code/src/module

pgm_lst=`ls *.c`
for pgm_one in ${pgm_lst};  do
#    echo $pgm_one
    BASE=`echo $pgm_one|cut -d"." -f1-1`
    inspect_code $BASE
done

cd -

출처 : http://pangate.com/50

728x90

1. 입력값 오류

DBIO 를 작성할 때 VIEW의 출력변수 생성 버튼을 눌렀을 때 아래 그림과 같은 오류 메시지가 나오는 경우가 있다.  이것은 스튜디오의 버그라기 보다는 개발자의 프로프레임 스튜디오 사용법의 미숙함에 기인된다. 

ORA-01840 : 입력된 값의 길이가 날짜 형식에 비해 부족합니다.


사용자 삽입 이미지


DBIO 스튜디오의 view 출력변수 생성시에는 개발자의 편의를 위하여 입력값 자동 설정기능이 있는데 이것을 체크해 놓았을 경우 입력변수에 디폴트 값으로 1 을 세팅하여 SQL을 실행한다. VIEW의 출력변수 생성은 작성된 SQL이 문법적으로 오류가 없는지 수행해 보고 정상동작될 경우 출력변수를 생성해 주는 편의 기능이다.  따라서 원래는 입력변수에 값을 일일이 개발자가 넣어서 실행시켜 주어야 하나 개발자의 편의를 위하여 "입력값자동설정" 기능을 제공하고 있는 것이다.

따라서  이 입력값자동설정 체크를 해제하고 출력변수생성 버튼을 클릭하면 다음과 같이 입력값을 직접 넣을 수 있는 팝업이 뜨게 된다.

사용자 삽입 이미지

기본 세팅 값이 1 로 되어 있는데 이것을 포맷에 맞는 적당한 값을 넣으면 정상 실행 될 것이다. SQL 상에서 포맷이 'YYYYMMDD' 이므로 20080404 와 같은 년월일 모양대로 입력하고 실행하면 오류 없이 출력변수 생성을 할 수 있을 것이다.


2. 수행시간


간혹 SQL 튜닝이 제대로 되지 않아 실행시간이 너무 오래 걸리는 경우  timeout 이 나서 출력변수 생성을 하지 못 하는 경우가 있다. 이런 경우 우선적으로 해야 할 것은 해당 SQL 이 빨리 수행될 수 있도록 튜닝을 하는 것이 우선이다.

그러나 개발 형편상 튜닝을 뒤로 미루고 우선 dbio 부터 작성하고자 한다면 다음과 같은 편법을 이용하여 출력변수를 작성할 수 있다.

출력변수가 FTR_DT, MO_ACNO  두개 라고 가정할 때 다음과 같이 정상 수행될 수 있는 임시 SQL 을 작성하고 이것을 실행하여 출력변수를 먼저 작성할 수 있다.

SELECT '1' FTR_DT, '2' MO_ACNO FROM DUAL

사용자 삽입 이미지

출력변수가 생성이 된 후에 원래의 SQL 을 바꿔서 붙여 넣고 저장을 한다.

(문의) 프레임웍팀 이영균 책임

출처 : http://pangate.com/49

728x90
농협에서 HP 장비를 개발장비로 사용하고 있으며 dbio 는 60여초, 매퍼는 40여초 정도의 컴파일 시간이 걸리고 있습니다.
 
IBM 장비를 사용하고 있는 프로젝트로서 3.0을 사용하고 있는 신협, 4.0 사용중인 대우증권, 하나은행에서는 컴파일 속도 때문에 문제된 경우는 없다고 합니다. ( 전화문의 )
그러나 HP 장비를 사용하고 있는 신한은행의 경우 농협의 경우와 같이  DBIO를 컴파일 하는데 1분 이상이 걸린다는 것을 들었습니다.( 전화문의 )
 
make 시 시간이 오래 걸리는 것은 HP 장비의 일반적인 현상으로 보입니다.
 
다음은 농협에 투입되어 있는 HP 기술자의 현재까지의 진행상황에 대한 답변 내용인데요.
 
[ 원 본 글 ]====================================================================================
* 발 신 자 : 류익상 차장/한국HP/인프라
* 발신시각 : 2008-05-22 09:23:13

안녕하세요? 
컴파일 속도 지연에 대한 진행상황을 업데이트정보입니다.
<진행상황>
-HP RC에 환경구성 후 테스트 프로그램으로 상황 재연 테스트(파일 120,000개 생성후)==>농협에서와 같이 성능지연, 문제파악
         -컴파일 옵션 변경에 의한 개선 테스트==> 효과 없음
         -컴파일 과정의 분석에 의한 개선부분을 체크 테스트 ==> 지연원인 파악 및 농협과 화일시스템 변경테스트 효과없음
         -WTEC에 의해 개선부분 진행중 ==> 현재 개선부분에 대한 문의중

 
<5월 21일 HP RC 김병수, 정영훈에 의한 테스트 및 진행과정의 1차 답변>
================================================================================================
make 유틸리티가 실행 되면서 내부적으로 opendir(), readdir() 함수를 통해 현재 디렉터리의 내용(directory entry)을 읽으면서 시간 지연이 있는 것으로 판단됩니다.
10:39:24 {3675851} <0.000011> open(".", O_RDONLY|0x200000, 0)
................................................ = 5
10:39:24 {3675851} <0.000006> fstat(5, 0x7fffd380)
........................................................... = 0
10:39:24 {3675851} <0.000005> fcntl(5, F_SETFD, 0)
........................................................... = 0
10:39:24 {3675851} <0.000052> getdents(5, 0x40450ec0, 8192)
.................................................. = 7960
10:39:24 {3675851} <0.000036> getdents(5, 0x40450ec0, 8192)
.................................................. = 7952
10:39:24 {3675851} <0.000037> getdents(5, 0x40450ec0, 8192)
.................................................. = 7728
10:39:24 {3675851} <0.000025> getdents(5, 0x40450ec0, 8192)
.................................................. = 7872
...
위 부분이 "." directory (현재 directory)를 open 한 후 getdents()를 계속 호출하는 부분인데 이 부분은 아래와 같이 directory open 후에 readdir() 이 호출되는 과정입니다.
    struct dirent *d;
    ....
    if ((dp = opendir(".")) == NULL) {
        perror(".");
        exit(1);
    }
   ...
    while ((d = readdir(dp)) != NULL) {
        ....
이렇게 가져온 dirent 구조체를 통해 파일 정보를 얻을 수 있습니다.
 120,000 개 정도 되는 파일을 prealloc 으로 실제 size를 줘서 생성한 후 테스트를 해 보면 make 시간이 상당히 지연되는 것을 확인했습니다. HP-UX 에서 이 시간 지연 문제는 make 유틸리티의 옵션 조정 등 으로는 해결하기 어렵다고 판단됩니다.
화일 시스템을 변경하여 HFS 파일 시스템에서도 테스트를 해보았으나 성능 향상은 없었습니다.
현재 까지의 테스트 결과에 의해 결과는 Compile 시의 작업 디렉터리에 파일을 적게 두는 방법이 개선의 방법입니다.
===================================================================================
감사합니다.
류익상

출처 : http://pangate.com/48

+ Recent posts