- 論壇徽章:
- 5
|
本帖最后由 pacman2000 于 2015-06-07 22:43 編輯
*用戶空間USER SPACE的使用
用戶空間USER SPACE,是AS400所提供進程間通訊的另一個機制,可以保存一塊較大的持久化數(shù)據(jù)。常用的三大機制,DATA AREA在核心系統(tǒng)中用于控制參數(shù)的設置,例如批處理平臺并發(fā)數(shù)控制,聯(lián)機平臺各種標志,以及全局內(nèi)容在*LDA的跨PGM保存?zhèn)鬟f。DATA QUEUE可用于進程間傳遞消息數(shù)據(jù),因核心系統(tǒng)設計上處理進程的隔離性而沒有用到。USER SPACE則用于實現(xiàn)輸出報文的靈活性,保存核心系統(tǒng)交易處理過程中,可能產(chǎn)生返回的憑證打印報文接口段。
USER SPACE最大長度可達16M,必須命名以持久化。由于在系統(tǒng)中用于暫存一筆聯(lián)機交易需要返回的附加報文數(shù)據(jù),因此對持久化其實沒有要求,但性能要求很高,又不能互相影響。于是將USER SPACE建立在QTEMP中。這樣不同JOB各自有一份使用,而且QTEMP數(shù)據(jù)系統(tǒng)應該是在內(nèi)存中建立的,恰好符合要求。
那么程序中如何訪問呢,可以看實際使用的例子。
創(chuàng)建USER SPACE,名稱為QTEMP/JOBADDUS。
- PGM PARM(&SPCLEN)
- INCLUDE SRCMBR(CLHD) SRCFILE(DSCPPGM)
- DCL VAR(&PASSPCNM) TYPE(*CHAR) LEN(20)
- DCL VAR(&SPCATTR) TYPE(*CHAR) LEN(10)
- DCL VAR(&SPCLEN) TYPE(*UINT) LEN(4)
- DCL VAR(&SPCVALUE) TYPE(*CHAR) LEN(1)
- DCL VAR(&SPCAUTH) TYPE(*CHAR) LEN(10)
- DCL VAR(&SPCTEXT) TYPE(*CHAR) LEN(50)
- CHGVAR VAR(&PASSPCNM) VALUE('JOBADDUS QTEMP ')
- CHGVAR VAR(&SPCAUTH) VALUE('*CHANGE')
- CHGVAR VAR(&SPCTEXT) VALUE('附加報文用戶空間')
- CHGVAR VAR(&SPCVALUE) VALUE(X'00')
- CALL PGM(QUSCRTUS) PARM(&PASSPCNM &SPCATTR +
- &SPCLEN &SPCVALUE &SPCAUTH &SPCTEXT)
- MONMSG MSGID(CPF9870)
- ENDPGM
復制代碼 .
因為JOB結(jié)束時QTEMP自動釋放,而JOB不結(jié)束的話USER SPACE可以重復使用,因此不需要人為去刪除這個USER SPACE。
使用這個USER SPACE,會有兩種情況。
一是交易運行過程中,產(chǎn)生需要附加的打印接口數(shù)據(jù),這時候調(diào)用下面的程序記錄進USER SPACE,注意,同時將已附加長度寫進*LDA記錄。另一種情況是組返回報文時,讀取數(shù)據(jù)打包進報文,這個用的是后續(xù)的USER SPACE指針操作。
- #include <stdio.h>
- #include <string.h>
- #include <arpa/inet.h>
- #include "dscppgm/cpyrgt_h"
- #include "config_h"
- #include "msginfo_h"
- #include "opdtaac_h"
- extern void JOBUSPTR(char **usptr);
- extern void fill_str(char *buf, const char *str, int len);
- extern int get_output_arrays_count(oa_otct*);
- extern int set_otlen(int len);
- /* parm1 MESG
- parm2 ITNAME 10A
- parm3 ITCNT 2B hostorder
- parm4 ITPLEN 2B hostorder
- parm5 ITBUF ITCNT*ITPLEN
- */
- int main(int argc, char **argv)
- {
- oa_otct oa;
- rpg_msg_info *rpginfo;
- int olen, tlen;
- unsigned short pcnt, plen, tmp;
- char *obuf, *itbuf;
- char *itnm;
- char linebuf[LINENO_LEN+1];
- if (argc<2)
- return -1;
- rpginfo=(rpg_msg_info *)argv[1];
- if (argc!=6)
- {
- fill_str(rpginfo->msgflnm, __FILE__, FILENM_LEN);
- sprintf(linebuf, "%6d", __LINE__);
- fill_str(rpginfo->msgline, linebuf, LINENO_LEN);
- fill_str(rpginfo->msgid, "EPLMNOPCK ", MSG_ID_LEN);
- fill_str(rpginfo->msgtext, "組附加報文接口不正確", MSG_TEXT_LEN);
- fill_str(rpginfo->msgotds, "", MSG_TEXT_LEN);
- return -1;
- }
- itnm=argv[2];
- pcnt=*(unsigned short *)argv[3];
- plen=*(unsigned short *)argv[4];
- itbuf=argv[5];
- JOBUSPTR(&obuf);
- get_output_arrays_count(&oa);
- olen=oa.ot_len;
- obuf += olen;
- tlen = olen + ITNAME_SIZE + ITCNT_SIZE + ITPLEN_SIZE
- + (pcnt==0 ? plen : pcnt*plen);
- if (tlen > DAT_MAX_LEN)
- {
- char errbuf[MSG_TEXT_LEN];
- fill_str(rpginfo->msgflnm, __FILE__, FILENM_LEN);
- sprintf(linebuf, "%6d", __LINE__);
- fill_str(rpginfo->msgline, linebuf, LINENO_LEN);
- fill_str(rpginfo->msgid, "EPLMNOLEN ", MSG_ID_LEN);
- sprintf(errbuf, "組附加報文時長度%d + %d超過最大長度%d",
- olen, tlen-olen, DAT_MAX_LEN);
- fill_str(rpginfo->msgtext, errbuf, MSG_TEXT_LEN);
- fill_str(rpginfo->msgotds, "", MSG_TEXT_LEN);
- return -1;
- }
- fill_str(obuf, itnm, ITNAME_SIZE);
- obuf += ITNAME_SIZE;
- tmp = htons(pcnt);
- memcpy(obuf, &tmp, ITCNT_SIZE);
- obuf += ITCNT_SIZE;
- tmp = htons(plen);
- memcpy(obuf, &tmp, ITPLEN_SIZE);
- obuf += ITPLEN_SIZE;
- memcpy(obuf, itbuf, pcnt==0 ? plen : pcnt*plen);
- set_otlen(olen);
- return tlen;
- }
復制代碼 .
這個程序?qū)⒁粋報文接口,以ITNAME接口名,ITCNT接口數(shù)組條數(shù),ITLEN接口單條長度,ITBUF接口數(shù)據(jù)的方式,打包記錄進USER SPACE。其中,JOBUSPTR用于獲取USER SPACE的指針,然后就像普通內(nèi)存一樣操作。下面就是JOBUSPTR的程序。
- PGM PARM(&USPTR)
- INCLUDE SRCMBR(CLHD) SRCFILE(DSCPPGM)
- DCL VAR(&PASSPCNM) TYPE(*CHAR) LEN(20)
- DCL VAR(&USPTR) TYPE(*PTR)
- CHGVAR VAR(&PASSPCNM) VALUE('JOBADDUS QTEMP ')
- CALL PGM(QUSPTRUS) PARM(&PASSPCNM &USPTR)
- ENDPGM
復制代碼 .
核心系統(tǒng)中的用法到此為止。實際上,USER SPACE相關的命令和調(diào)用有不少,修改內(nèi)容的方式除了獲取指針,還可以用QUSRTVUS獲取USER SPACE內(nèi)容,QUSCHGUS修改USER SPACE內(nèi)容。這兩個調(diào)用以字符串的形式操作。遺憾的是,CL對USER SPACE的支持較少,需要用到的話自己寫程序擴充吧。
|
|