Tuxedo資料buffer基本型別介紹

gaoyj1973發表於2008-07-18

轉載:http://dev2dev.bea.com.cn/techdoc/200305561.html

作者:吳紹永是(dev2dev ID: wsywin) BEA dev2dev中文網站--線上技術論壇Tuxedo欄目版主,資深Tuxedo專家

一、 課程目標
透過本課程學習,你可以掌握如下知識:

  • 掌握tuxedo中STRING型別buffer的用途
  • 掌握tuxedo中CARRAY型別buffer的用途
  • 掌握tuxedo中FML(FML32)型別buffer的用途
  • 掌握tuxedo中VIEW(VIEW32)型別buffer的用途
    注:後續的課程將介紹Tuxedo新增的資料型別:EFML(Embedded Record in FML)、XML Buffer

    二、 String型別buffer介紹
    (1)STRING型別buffer簡介
    STRING型別buffer是主要用於面向行、變長度的文字資訊型別buffer。STRING型別buffer要求必須以NULL作為結束符的。如果系統採用STRING型別,那麼在配置ubbconfig檔案時,必須在*MACHINE部分配置TYPE,指明buffer型別為STRING型別。在兩種不同型別架構的機器進行buffer傳輸時候,TUXEDO對STRING型別buffer進行加碼、解碼過程。無論系統申請了多少長度的buffer,系統自動按著NULL所在的位置決定STRING型別的buffer長度。
    (2)STRING型別buffer如何申請
    char *SndBuf;
    SndBuf = (char *) tpalloc("STRING",NULL,1024)
    (3)STRING型別使用方法和呼叫方法
    strcpy(SndBuf,"Bea Tuxedo");
    tpcall("TOUPPER",SndBuf,0,&RcvBuf,&len,0);

    三、 CARRAY型別buffer介紹
    (1)CARRAY型別buffer簡介
    CARRAY型別buffer是一種獨立於機器的buffer型別。使用者在使用時必須指定CARRAY型別資料的長度,CARRAY型別資料可以包含NULL字元。CARRAY型別資料不需要加、解碼過程。CARRAY型別資料可以用來傳輸漢字、二進位制資料、檔案、圖形等。CARRAY型別可以作為FML(FML32)、VIEW(VIEW32)的資料型別子項buffer。
    (2)CARRAY型別buffer如何申請
    tpalloc("CARRAY",NULL,1024*2)
    (3)CARRAY型別使用方法和呼叫方法

    四、 VIEW(VIEW32)型別buffer介紹
    (1)VIEW型別buffer簡介
    Tuxedo使用VIEW型別buffer處理類似C語言的結構等資料型別複雜資料。使用VIEW型別buffer可以將各資料元素與一種結構資料型別結合,透過結構就可以訪問各資料元素。VIEW型別資料即使沒有沒有資料也佔用空間,結構發生變化,需要重新編譯程式。
    註明:(VIEW型別buffer是16位定址的,VIEW32是32位定址的.)

    (2)VIEW型別buffer使用方法
    使用VIEW型別資料步驟:

  • 建立VIEW檔案
  • 設定環境變數
  • 編譯VIEW檔案
  • 在程式碼中包含VIEW標頭檔案,在程式中使用VIEW結構及API函式
  • 編譯程式
  • 執行程式
    (1)建立VIEW檔案

    VIEW user

    $ /* VIEW structure for user information */

    #type cname fbname count flag size null

    long count COUNT 1 - - “” 0

    float sumfee SUMFEE 1 - - 0.0

    string usrname USRNAME 1 - 80 “”

    short num NUM 1 - - 0

    END


    (2)設定環境變數
    /* view檔案存放路徑,使用冒號分割(NT用分號)*/
    VIEWDIR=$APPDIR/inc
    /* 用逗號分割的二進位制view檔案 */
    VIEWFILES=user.V
    export VIEWDIR VIEWFILES

    (3)編譯VIEW檔案

  • 使用viewc(viewc32)編譯view檔案
    $viewc -n user.v
  • view命令簡介:
    viewc [-n] [-d viewdir] viewfile [viewfile ...]
    或者:
    viewc32 [-n] [-d viewdir] viewfile [viewfile ...]
    [-d viewdir]:指定輸出檔案的路徑(預設在當前目錄下)
    [-n]:指定在編譯view結構型別資料不產生FML buffer資料結構

    (4)view編譯後生成的標頭檔案

    struct user {

    /* VIEW structure for user information */

    long count;

    float sumfee;

    char usrname[80];

    short num;

    };



    (5)VIEW型別buffer的使用
    struct user *pszUser;
    pszUser=(struct user *)tpalloc("VIEW"," user",sizeof(user));
    …………………
    pszUser ->count = 1680;
    pszUser ->sumfee = 198.96;
    strcpy(pszUser->usrname,"Wsy");
    pszUser->num = 160;
    …………………
    tpcall("PSVC",(char *)pszUser,0,(char **)&pszUser,&rcvlen,0);
    …………………

    五、 FML(FML32)型別buffer介紹
    (1)VIEW型別buffer簡介
    FML型別buffer允許存取多個命名的欄位。例如:(NAME: "BEA",ADDRESS "China Beijing",PHONE "010-85281188")。每一個命名的欄位可以在buffer中存放零個或更多個(occurrences)的值.
    註明:(FML型別buffer是16位定址的,FML32是32位定址的.)


    (2)FML支援的資料型別:
  • Short
  • Char
  • Long
  • Float
  • Double
  • String
  • Carray
    (3)FML型別buffer使用方法
    使用FML型別資料步驟:
  • 建立FML檔案
  • 設定環境變數
  • 編譯FML檔案
  • 在程式碼中包含FML標頭檔案,在程式中使用FML API函式
  • 編譯程式
  • 執行程式
    (1)建立FML Field Table檔案

    *base 1000

    # name number type flags comments

    COUNT 1 long - -

    SUMFEE 2 float - -

    USRNAME 3 string - -

    NUM 4 short - -


    (2)設定環境變數
    set FLDTBLDIR32="c:tuxedowsy"
    set FIELDTBLS32=user.fld
    其中:
    FLDTBLDIR(FLDTBLDIR32):指明Field Table檔案的名字,多個用逗號分割
    FIELDTBLS (FIELDTBLS32):Filed Table檔案的所在路徑,多個用冒號分割,在WinNT系統中使用分號分割.
    (3)編譯FML Field Table檔案
  • 使用mkfldhdr(mkfldhdr32)編譯Field Table檔案
    $mkfldhdr32 user.fld
    (4)FML Field Table編譯後生成的標頭檔案

    /* fname fldid */

    /* ----- ----- */

    #define COUNT ((FLDID32)33555433) /* number: 1001 type: long */

    #define SUMFEE ((FLDID32)100664298)/* number: 1002 type: float */

    #define USRNAME ((FLDID32)167773163)/* number: 1003 type: string */

    #define NUM ((FLDID32)1004) /* number: 1004 type: short */



    (5)FML型別buffer的使用
    FBFR32 *SndBuf;
    SndBuf = (FBFR32 *)tpalloc("FML32",NULL,1024);
    …………………
    lCount = 1680;
    Fchg32(SndBuf, COUNT,0,(char *)&lCount ,0);
    fSumFee = 198.96;
    Fchg32(SndBuf, SUMFEE, (char *)&fSumFee,0);
    Strcpy(sUsrName , "wsy");
    Fchg32(SndBuf, USRNAME, (char *)sUsrName,0);
    iNum = 160;
    Fchg32(SndBuf, SUMFEE, (char *)&iNum,0);
    …………………
    tpcall("PSVC",(char *) SndBuf,0,(char **)& SndBuf,&rcvlen,0);
    Fget32(SndBuf, COUNT,0, (char *)&lCount ,0);
    Fget32(SndBuf, USRNAME,0, (char *)sUsrName,0);
    …………………
    注:FML和VIEW型別buffer的API函式在後續的文章有詳細的介紹和程式碼分析.
  • [@more@]

    來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267897/viewspace-1007485/,如需轉載,請註明出處,否則將追究法律責任。

    相關文章