2010년 11월 5일 금요일

PowerBuilder DB로 부터 새로운 버전의 파일을 다운로드

Oracle DB의 LONGRAW 필드에 binary EXE 또는 Image 등을 업로드 해 놓고 Client의 Program 실행시에
버전을 검사하여 하위버전인 경우 다운로드 하도록 하는 프로그램.
업무구분에 따라 경로가 고정되어 있었으나 경로의 복잡성이 추가되어
파일이름에 경로를 붙여 사용하도록 협의되어 일부 수정되었다.

SetPointer(HourGlass!)
/* Transaction Connection */
File_Tran = Create Transaction
File_Tran.dbms       = dbms
File_Tran.logid      = userid
File_Tran.logpass    = passwd
File_Tran.servername = servername

Connect Using File_Tran;
If File_Tran.sqlcode <> 0  Then
    MessageBox ("확인",' 데이터베이스 연결 실패입니다.')
    Halt Close
    Return
End If


/* 선언부 */
String   FileName,   Version_PC,  FileStyle
String   RootPath,   FullPath,    EtcPath, FilePath, IniPath, ExePath
String   ConnectParm
Boolean  lb_Check = False

Integer  li_I, FP ,  Loops,       li_Complete,    Version_SR
Long     FLen = 0,   bytes_Read = 0,  Start_Pos = 0, Next_Pos = 0
Blob     ImageData,  Blob_Chunk


/* PC 에서 최초 실행시 각 사용자별  디렉토리 생성 */
RootPath = 'c:\program'                 // 기본 디렉토리
FullPath = RootPath + '\' + gs_UserID   //------ 실행 화일관리
EtcPath  = FullPath + '\' + 'etc'       //------ 기타화일 관리

/* 화일 저장 디렉토리 생성 */
If FileExists(RootPath) Then
    If FileExists(FullPath) Then
    If FileExists(EtcPath) = False Then
            CreateDirectoryA(EtcPath,0) 
        End If
    Else
        CreateDirectoryA(FullPath,0) 
        CreateDirectoryA(EtcPath,0)     
    End If
Else
    CreateDirectoryA(RootPath,0)
    CreateDirectoryA(FullPath,0) 
    CreateDirectoryA(EtcPath,0)       
End If  

/* 각 단위 업무 수정사항  조회 */
DECLARE Cur_File CURSOR FOR
    SELECT VER_FILENAME,         VER_VERSION,    VER_EXT_STYLE
    FROM CLSM_VER11_PROGRAM
    WHERE VER_UPMUCODE = :gs_JobGubun OR
        VER_UPMUCODE = 'S'
    ORDER BY VER_FILENAME   ASC  using File_Tran;

OPEN Cur_File;
FETCH Cur_File INTO :FileName, :Version_SR,  :FileStyle;

/* 화일 버전 체크 위항 ini 화일 체크하고 생성 */
IniPath = FullPath + '\' + gs_UserID + '.ini'
wf_Write_ini(IniPath, gs_UserID)


// 2010. 11. 6 수정
// dwis 추가로 Filename에 경로를 붙여 처리하도록 수정
//-----------------------------------------------------------------------------------------------------

String ls_full_name = ""
String ls_split_name = ""
String ls_target_path = ""
integer li_root_pos

DO WHILE File_Tran.SQLCode = 0 
    //-----------------------------------------------------------------------------------------------------
    // 저장할 경로가 존재하는지 검사 : 없으면 새로 만듦
    //-----------------------------------------------------------------------------------------------------
 

    ls_full_name = FileName 
    // 먼저 파일명을 제외한 패스가 존재하는지 부터 점검 
    ls_target_path = midA(ls_full_name, 1, Len(ls_full_name) - Pos(Reverse(ls_full_name), "\")) 
    ls_split_name = ""
    // 없으면 아래를 실행
    If Not FileExists(ls_target_path) Then
        DO while(true)
            li_root_pos = pos(ls_full_name, "\")
   

            // 마지막 자료는(\가 없음) Skip << 파일이름
            IF li_root_pos < 1 THEN
                EXIT
            END IF
            If ls_split_name = "" then
                ls_split_name += midA(ls_full_name, 1, li_root_pos - 1)
            else
                ls_split_name += "\" + midA(ls_full_name, 1, li_root_pos - 1)
            end if
            ls_full_name = midA(ls_full_name, li_root_pos + 1)

            // 드라이브 문자열만 들어올 경우 Skip (ex: c:, d: << \ 기호가 없음)

            If pos(ls_split_name, "\") > 0 Then   
                // 경로가 없을 경우 생성
                If Not FileExists(ls_split_name) Then
                    CreateDirectoryA(ls_split_name,0)
                End If
            End If
        LOOP
    End If

    //-----------------------------------------------------------------------------------------------------
    Version_PC = ProfileString(IniPath, FileName, 'FileVersion', "X")

    If (Version_SR <> Integer(Version_PC)) OR Version_PC = 'X' Then
        If lb_Check = False Then
            // 다운 받고 있을때의 Animation // 

            This.Title = '화일 내려받는 중 '        
            DelAnim()
            Trigger Event ue_animation()
  
             lb_Check = True
        End If     
 
        uo_1.uf_setvisible(0)
        st_filename.Text = FileName
      
        SELECTBLOB VER_FILESOURCE
        INTO :ImageData
        FROM CLSM_VER11_PROGRAM
        WHERE VER_FILENAME = :FileName    AND
             (VER_UPMUCODE= :gs_jobgubun OR
            VER_UPMUCODE= 'S' )
        using File_Tran ;

        IF File_Tran.Sqlcode <> 0  THEN
        DisConnect Using File_Tran;
        DelAnim()
        Halt Close
        Return
    End If 

    //-----------------------------------------------------------------------------------------------------
    // 파일 이름에 \이 포함된경우 이름 그대로 경로처리 : 추가

    If Pos(FileName, "\") > 0  Then
        FilePath = FileName
    Else

        // 기존 처리 방식
        /* 실행화일과 PBD 이외의 화일은 BMP 디렉토리에 관리 */

        If Upper(FileStyle) = 'EXE' OR Upper(FileStyle) = 'PBD' Then
            FilePath = FullPath + '\' + FileName               
        ElseIf Upper(FileStyle) = 'BMP' Then
            FilePath = RootPath + '\install\bmp\' + FileName
        ElseIf Upper(FileStyle) = 'DLL' Then 
            FilePath = RootPath + '\install\lib\' + FileName
        Else
            FilePath = EtcPath + '\' + FileName
        End If
    End If
    //----------------------------------------------------------------------------------------------------- 
    FP = FileOpen(FilePath, StreamMode!, Write!,LockWrite!, replace!)  
    ///// **** 화일 변수 책정 초기화 **** ///////

    Next_Pos = 1;   Loops = 0;   FLen = 0
    IF FP <> 0 then
        Flen = Len(ImageData)
        st_size.Text = String(FLen,'#,###,###')
        If FLen > 32765 Then
            If Mod(FLen,32765) = 0 Then
                Loops = FLen/32765
            Else
                Loops = (FLen/32765) + 1
            End If
        Else
            Loops = 1
        End If

        If Loops = 1 Then
            Bytes_Read = FileWrite(FP,ImageData)
            uo_1.uf_setvisible(100)  
        Else
            For li_I = 1 To Loops
                    li_Complete = ( (32765 * li_I ) / Len(ImageData)) * 100
                    uo_1.uf_setvisible(li_Complete)
                    If li_I = Loops Then
                        Blob_Chunk = BlobMid(ImageData,Next_Pos)
                    Else
                        Blob_Chunk = BlobMid(ImageData,Next_Pos,32765)
                    End If
                    Bytes_Read = FileWrite(FP, Blob_Chunk)
                    Next_Pos   = Next_Pos + Bytes_Read
                Next 
            End If
         
            FileClose(FP)
 
            ///// 차후 화일 다운 받기 위한 초기화 화일 /////

            SetProfileString(IniPath, FileName, 'FileVersion', String(Version_SR)) 
        End If
    End If

    FileName = '';    Version_PC = '';

    FETCH Cur_File INTO :FileName, :Version_SR,  :FileStyle;
LOOP

CLOSE Cur_File;
/* 실행 화일 넘겨질 변수 설정 */
ConnectParm = gs_UserID + '/' + gs_UserPassWD + '/' + dbms + '/' + servername +&
              '/' + gs_Jobgubun + '/' + gs_Sabun + '/' + gs_Passwd + '/' + '' + '/'

ExePath = FullPath + '\' + gs_UserID + '.exe '

If FileExists(ExePath) = False Then
    DisConnect Using File_Tran;
    MessageBox("확인", '당 업무 해당 실행화일이 없습니다. 프로그램을 종료하겠습니다.'&
                       ,StopSign!)
    Halt Close
    Return
End If  

Close(This)
Close(w_jobbmp_display)

//각 단위 업무 화일  실행 //
Run(ExePath + ConnectParm)



댓글 없음:

댓글 쓰기