8.1.4 反映情報編集UOCで使う関数の文法
反映情報編集UOCは,C言語を使ってプログラミングします。反映側Datareplicatorには,反映情報編集UOCを作成するときに使う関数を備えています。
反映情報編集UOCで使える関数名と機能の概要を次の表に示します。
関数名 |
機能 |
---|---|
hds_ubegin() (編集開始指示) |
反映情報の編集を開始することを指示します。ユーザは,反映側HiRDBへの接続処理又は環境の初期設定の処理を実行します。 |
hds_uedit() (編集・加工指示) |
反映情報の編集・加工及び同期点処理を指示します。ユーザは,反映情報を編集・加工してSQLを発行したり一般ファイルへ出力したりします。 |
hds_uend() (編集終了指示) |
反映情報の編集を終了することを指示します。ユーザは,反映側HiRDBからの切り離し処理又は環境の終了処理を実行します。 |
- 〈この項の構成〉
(1) hds_ubegin()(編集開始指示関数)
(a) 関数の形式
#include<hds_ucommon.h> #include<hds_ureflect.h> int hds_ubegin(UINTERFACE_BLK *インタフェースブロック名, int *ステータス);
(b) パラメタの説明
-
hds_uedit()関数又はhds_uend()関数に情報を引き継ぎたい場合に設定する情報を格納するための領域の名称を指定します。UINTERFACE_BLKは呼び出し元が確保します。インタフェースブロックの内容を次の表に示します。
表8‒3 インタフェースブロック(UINTERFACE_BLK)の内容 メンバ名
長さ(バイト)
属性
領域名
設定者
内容
auth_id
8
char
認可識別子
呼び出し元
反映システム定義で指定した接続認可識別子
password
30
char
パスワード
呼び出し元
反映システム定義で指定したパスワード
exsysid
2
char
抽出側Datareplicator識別子
抽出元
抽出側Datareplicatorの抽出システム定義で指定した抽出側Datareplicator識別子。小文字の16進数字が文字列として設定されます。
XDM/DSとの連動時は,'00'が設定されます。
repid1
2
char
識別子1
呼び出し元
反映システム定義で指定したデータ連動識別子
repid2
2
char
識別子2
呼び出し元
反映システム定義で指定した反映側Datareplicator識別子
*inherinf1
8
char*
引き継ぎ情報1
呼び出し先
hds_uedit()関数とhds_uend()関数に引き継ぐ領域のアドレス
inherinf2
4
int
引き継ぎ情報2
呼び出し先
hds_uedit()関数とhds_uend()関数に引き継ぐ情報
stopinf
4
int
終了モード
呼び出し元
UOC終了時の終了モード
この領域は,hds_uend()関数の呼び出し時だけ有効です。
- HDS_FLG_NORMAL
-
正常終了
- HDS_FLG_FORCE
-
強制停止
- 注1
-
反映側Datareplicatorでは,UINTERFACE_BLKのヘッダファイルを用意しているので,それを使ってください。ヘッダファイルについては,「表8-13 反映情報編集UOCのヘッダファイルの一覧」を参照してください。
- 注2
-
ユーザは,設定者が呼び出し元になっている領域を書き換えないでください。
-
int *ステータス
編集開始指示関数の中でエラーを検知した場合,ステータスに値を設定できます。ステータスに値を設定すると,呼び出し元であるDatareplicatorからメッセージが出力され,その中にこのステータス値が表示されます。
(c) 戻り値
呼び出し元に戻るときに戻り値を設定します。設定できる戻り値を次の表に示します。
(d) 抽出側Datareplicatorを使うときの注意
抽出側Datareplicatorの送信環境定義のnsndidxxxオペランド(xxxは001〜256の整数)に,送信抑止受信元識別子を指定している場合,HiRDBのCONNECT処理の直前に,HiRDBの環境変数である$PDCLTAPNAMEに,hdssqleで始まり抽出側Datareplicator識別子で終わる20バイト以内の文字列を設定してください。
抽出側Datareplicator識別子として設定される文字列は,インタフェースブロック内に設定される文字列と同じです(2バイトの16進数字の文字列)。
(2) hds_uedit()(編集・加工指示関数)
(a) 関数の形式
#include<hds_ucommon.h> #include<hds_ureflect.h> int hds_uedit(UINTERFACE_BLK *インタフェースブロック名, UREFLECT_BLK *反映制御ブロック名, UDATA_BLK *キー情報ブロック名, UDATA_BLK *反映データブロック名, int *ステータス);
(b) パラメタの説明
-
hds_begin()関数からの情報を引き継ぎたい場合に設定する情報を格納するための領域の名称を指定します。インタフェースブロック名については,「表8-3 インタフェースブロック(UINTERFACE_BLK)の内容」を参照してください。
-
反映情報の共通情報を格納するための領域の名称を指定します。反映制御ブロックは呼び出し元が確保します。反映制御ブロックの内容を次の表に示します。
表8‒5 反映制御ブロック(UREFLECT_BLK)の内容 メンバ名
長さ(バイト)
属性
領域名
設定者
内容
updkind
8
char
更新種別
呼び出し元
抽出側DBを更新するときの種別。次に種別を示します。種別を示す文字列は,8バイト固定です。8バイトに満たない部分は,空白で埋められます。
- INSERT
-
INSERTを示します。
- UPDATE
-
UPDATEを示します。
- DELETE
-
DELETEを示します。
- PURGE
-
PURGEを示します。
- COMMIT
-
COMMITを示します。※
- 注※
-
この値の格納時は,認可識別子以降の項目の値は意味がありません。
auth_id
30
char
認可識別子
呼び出し元
抽出側DBを更新するときの認可識別子
tbl_id
30
char
表識別子
呼び出し元
抽出側DBを更新するときの表識別子
upd_date
4
char
更新日付
呼び出し元
抽出側DBを更新するときの日付(更新情報をジャーナルに出力した日付)。日付は10進符号なしパック形式(YYYYMMDD)で出力します。
YYYY:西暦年
MM:月
DD:日
upd_time
4
char
更新時刻
呼び出し元
抽出側DB更新時の時刻(更新情報をジャーナルに出力した時刻)時刻は10進符号なしパック形式(HHMMSSTT)で出力します。
HH:時
MM:分
SS:秒
TT:1/100秒
uapname
8
char
抽出側のUAP名
呼び出し元
抽出側DBを更新するときのユーザアプリケーションプログラムの名称
extsysid
4
char
抽出側DBのシステムID
呼び出し元
- 抽出側DBがHiRDBの場合
-
抽出側DBのHiRDB識別子
- 抽出側DBがメインフレーム(XDM/DS,PDMII E2,RDB1 E2)の場合
-
抽出側DBのサブシステムID
infflag1
1
unsigned char
予備領域1
−
予備
infflag2
1
unsigned char
予備領域2
−
予備
infflag3
1
unsigned char
予備領域3
−
予備
reserve1
1
char
予備領域4
−
予備
infflag4
4
int
予備領域5
−
予備
- 注1
-
反映側Datareplicatorでは,UREFLECT_BLKのヘッダファイルを用意しているので,それを使ってください。ヘッダファイルについては,「表8-13 反映情報編集UOCのヘッダファイルの一覧」を参照してください。
- 注2
-
ユーザは,設定者が呼び出し元になっている領域を書き換えないでください。
-
反映情報を格納するための領域の名称を指定します。hds_uedit()の第3パラメタのキー情報ブロックと第4パラメタの反映データブロックの両方でこの構造体を使います。
キー情報ブロックでは,UDATA_BLKにマッピングキーの情報を格納します。反映データブロックでは,UDATA_BLKに反映データの情報を格納します。
キー情報ブロックは,INSERT,PURGE及びCOMMITの場合には列数に0が設定されます。また,キー値が変更された場合には,キー情報ブロックには更新前のキー値が設定されます。更新後のキー値及びINSERT時のキー値は,反映データブロックの中に設定されます。
DELETE,PURGE,COMMITの場合は,反映データブロックの列数に0が設定されます。
キー情報及び反映データ情報は,UDATA_BLKとUDATA_BLKからポイントされる構造体(これをUCOLUMN_BLKといいます)とスカラデータから構成されます。UDATA_BLKの列数に0が設定されている場合,UCOLUMN_BLKは参照しないでください。UDATA_BLKとその関連構造を次の図に示します。
図8‒4 UDATA_BLKとその関連構造
- 注※1
-
UDATA_BLKの内容については,「表8-6 UDATA_BLKの内容」を参照してください。
- 注※2
-
UCOLUMN_BLKの内容については,「表8-7 UCOLUMN_BLKの内容」を参照してください。
- 注※3
-
BLOB型又はBINARY型の後方削除更新をしている場合のデータ構造です。USUBSTR_BLKの内容については,「表8-8 USUBSTR_BLKの内容」を参照してください。
表8‒6 UDATA_BLKの内容 メンバ名
長さ(バイト)
属性
領域名
設定者
内容
colnum
4
int
列数
呼び出し元
マッピングキーの列数又は反映データの列数が設定されます。
*colinfptr
8
UCOLUMN_BLK*
UCOLUMN_BLK*アドレス
呼び出し元
UCOLUMN_BLKのアドレスが設定されます。
- 注
-
Datareplicatorでは,UDATA_BLKのヘッダファイルを用意しているので,それを使ってください。ヘッダファイルについては,「表8-13 反映情報編集UOCのヘッダファイルの一覧」を参照してください。
表8‒7 UCOLUMN_BLKの内容 メンバ名
長さ(バイト)
属性
領域名
設定者
内容
colname
30
char
列名
呼び出し元
列の名前が設定されます。
coltype
1
unsigned char
列データ型
呼び出し元
列のデータ型が設定されます。設定内容については,「表8-9 列データ型のニモニック」を参照してください。
coloption
1
unsigned char
列オプション
呼び出し元
列のオプションが設定されます。オプションの種類を次に示します。
- HDS_COL_NOOPT(0x00):
-
オプションなし
- HDS_COL_NULL(0x01):
-
NULLデータ
- HDS_COL_MAPK(0x02):
-
マッピングキー
反映データブロックだけ設定されます。キー情報ブロックには設定されません。
- HDS_COL_ARRAY(0x04):
-
配列列
- HDS_COL_REPET(0x08):
-
繰返し列
- HDS_COL_ELMNL(0x10):
-
繰返し列の要素の値がNULL
- HDS_COL_REPTCOL(0x20):
-
繰返し構造指定
- HDS_COL_BLOBSUB(0x40):
-
連結演算データ
- HDS_COL_SUBSTR(0x80):
-
SUBSTR演算後方削除更新ログ
elementnum
4
union
繰返し列の有効要素番号
又は抽象データ型の数
呼び出し元
- 繰返し列のとき:
-
前2バイト(short)には有効要素番号が設定されます。*指定のときは−2が設定されます。
後2バイト(short)には該当する列の要素データの数が設定されます。
- 抽象データ型の列のとき:
-
継承関係を含めたデータ型の数が設定されます。継承がないときは1が設定されます。
- 配列列のとき:
-
前2バイトには抽出側配列列の要素番号が設定されます。
後2バイトには0が設定されます。
mltcolkind
1
unsigned char
繰返し列の更新種別
呼び出し元
繰返し列の場合の更新種別を次に示します。更新種別がUPDATEのときだけ有効になります。
HDS_COL_ADDV(0x01):ADD
HDS_COL_DELV(0x02):DELETE
HDS_COL_SETV(0x04):SET
adtfunc
1
char
抽象データ型の反映方式
呼び出し元
「0x01」で固定です。
charset
1
char
文字集合種別
呼び出し元
UOCに渡す列データの文字集合種別が設定されます。
- 文字集合指定なし:
-
X'00'(HDS_CSET_DEFAULT)
- 文字集合指定あり(EBCDIK):
-
X'01'(HDS_CSET_EBCDIK)
reserve1
2
char
予備領域
−
予備
collen
4
int
列データ長
呼び出し元
列のデータ長が設定されます。列オプションがNULLデータの場合,0が設定されます。
dataptr
4
union
データアドレス
呼び出し元
列データのアドレスが設定されます。列オプションがNULLデータの場合,NULLポインタが設定されます。設定内容については,「表8-10 データアドレスのニモニック」を参照してください。
- 注
-
反映側Datareplicatorでは,UCOLUMN_BLKのヘッダファイルを用意しているので,それを使ってください。ヘッダファイルについては,「表8-13 反映情報編集UOCのヘッダファイルの一覧」を参照してください。
表8‒8 USUBSTR_BLKの内容 メンバ名
長さ(バイト)
属性
領域名
設定者
内容
reserve1
4
int
内部情報1
呼び出し元
内部情報
data_len
4
int
内部情報2
呼び出し元
内部情報
reserve2
4
int
予備領域1
呼び出し元
予備
substr_spos
4
unsigned int
SUBSTR開始位置
呼び出し元
スカラ関数SUBSTR使用時の,切り出すデータ列の開始位置
reserve3
4
int
予備領域2
呼び出し元
予備
substr_len
4
unsigned int
SUBSTRデータ長
呼び出し元
スカラ関数SUBSTR使用時の,切り出すデータ列の長さ
reserve4
16
char
予備領域3
呼び出し元
予備
列データ型のニモニックを「表8-9 列データ型のニモニック」に,データアドレスのニモニックを「表8-10 データアドレスのニモニック」に示します。
列データ型 |
ニモニック |
データコード |
---|---|---|
INTEGER |
HDS_T_INT |
(0xF1) |
SMALLINT |
HDS_T_SINT |
(0xF5) |
LARGE DECIMAL |
HDS_T_DEC |
(0xE5) |
FLOAT |
HDS_T_FLT |
(0xE1) |
DOUBLE PRECISION |
HDS_T_DBL |
(0xE1) |
SMALL FLOAT |
HDS_T_SFLT |
(0xE3) |
REAL |
HDS_T_REAL |
(0xE3) |
CHARACTER |
HDS_T_CHAR |
(0xC5) |
VARCHAR |
HDS_T_VCHAR |
(0xC1) |
NCHAR |
HDS_T_NCHAR |
(0xB5) |
NVARCHAR |
HDS_T_NVCHAR |
(0xB1) |
MCHAR |
HDS_T_MCHAR |
(0xA5) |
MVCHAR |
HDS_T_MVCHAR |
(0xA1) |
DATE |
HDS_T_DATE |
(0x71) |
TIME |
HDS_T_TIME |
(0x79) |
TIMESTAMP |
HDS_T_TIMESTAMP |
(0x7D) |
INTERVAL YEAR TO DAY |
HDS_T_YTD |
(0x65) |
INTERVAL HOUR TO SECOND |
HDS_T_HTS |
(0x6F) |
BLOB |
HDS_T_BLOB |
(0x93) |
BINARY |
HDS_T_BINARY |
(0x91) |
UNPACK |
HDS_T_UNPACK |
(0xFF) |
データ型 |
ニモニック |
アドレスタイプ |
---|---|---|
INTEGER |
HDS_A_INT |
int* |
SMALLINT |
HDS_A_SINT |
short* |
LARGE DECIMAL |
HDS_A_DEC |
char* |
FLOAT |
HDS_A_FLT |
double* |
DOUBLE PRECISION |
HDS_A_DBL |
double* |
SMALL FLOAT |
HDS_A_SFLT |
float* |
REAL |
HDS_A_REAL |
float* |
CHARACTER |
HDS_A_CHAR |
char* |
VARCHAR |
HDS_A_VCHAR |
char* |
NCHAR |
HDS_A_NCHAR |
char* |
NVARCHAR |
HDS_A_NVCHAR |
char* |
MCHAR |
HDS_A_MCHAR |
char* |
MVCHAR |
HDS_A_MVCHAR |
char* |
DATE |
HDS_A_DATE |
char* |
TIME |
HDS_A_TIME |
char* |
INTERVAL YEAR TO DAY |
HDS_A_YTD |
char* |
INTERVAL HOUR TO SECOND |
HDS_A_HTS |
char* |
BLOB |
HDS_A_BLOB |
char* |
UNPACK |
HDS_A_UNPACK |
char* |
TIMESTAMP |
HDS_A_TIMESTAMP |
char* |
BINARY |
HDS_A_BINARY |
char* |
SUBSTR演算後方削除更新ログ |
HDS_A_SUBSTR |
USUBSTR_BLK* |
-
int *ステータス
編集・加工指示関数の中でエラーを検知した場合,ステータスに値を設定できます。ステータスに値を設定すると,関数から戻った後に呼び出し元であるインタフェースプロセスからメッセージを出力し,その中にステータス値を表示します。
(3) hds_uend()(編集終了指示関数)
(a) 関数の形式
#include<hds_ucommon.h> #include<hds_ureflect.h> int hds_uend(UINTERFACE_BLK *インタフェースブロック名, int *ステータス);
(b) パラメタの説明
-
hds_begin()関数又はhds_edit()関数からの情報を引き継ぎたい場合に設定する情報を格納するための領域の名称を指定します。インタフェースブロック名については,「表8-3 インタフェースブロック(UINTERFACE_BLK)の内容」を参照してください。
hds_ubegin()関数で動的に領域を割り当てた場合には,hds_uend()関数の中で解放してください。また,オープンしたファイルがある場合にはクローズしてください。hds_uend()関数から戻った後では,UINTERFACE_BLKで設定されているユーザ設定項目に対しては何もしないで,構造体の領域を解放してください。
データベースアクセスしているUOCで終了モードが強制停止のときは,DBMSにROLLBACKを実行してからDISCONNECTを実行してください。
-
int *ステータス
編集終了指示関数の中でエラーを検知した場合,ステータスに値を設定できます。ステータスに値を設定すると,関数から戻った後に呼び出し元であるインタフェースプロセスからメッセージを出力し,その中にこのステータス値を表示します。
(4) 反映情報編集UOCで使うヘッダファイル
反映側Datareplicatorでは,hds_ubegin(),hds_uedit(),hds_uend()の関数のインタフェースになる構造体及びニモニックコードをヘッダファイルで用意しています。
反映情報編集UOCで使うヘッダファイルは,次に示すディレクトリに格納してあります。
UNIX版の場合: /opt/hirdbds/include/
Windows版の場合:Datareplicatorをインストールしたディレクトリ\include\
反映情報編集UOCのヘッダファイルの一覧を次の表に示します。
(5) 規則
(a) ファイル
反映情報編集UOCの関数の中で,操作できるファイルはユーザ独自のファイル(オープンしたファイル)だけです。ファイルの規則を次に示します。
-
標準入力,標準出力,標準エラー出力は,使わないでください。
ただし,反映側Datareplicatorの環境変数HDS_MST_STDCLOSEに「FALSE」を指定した場合は,標準入力,標準出力,標準エラー出力を使用できます。
-
自身でオープンしたファイル以外を書き込んだり読み込んだりしないでください。
-
反映側Datareplicatorのファイルを操作しないでください。
(b) 定義との関連
-
UOCを実行する場合,反映方式は表単位反映方式となります。このため,Datareplicatorは次のように動作します。
-
反映環境定義のstartmodeパラメタは無効になります。
-
hdsstateコマンドの表示内容の<REFLECTION INFORMATION>中のreflection modeは"tbl"となります。
-
-
UOCに対しては,control_trigger指示をしません。このため,UOCで実行する場合には,反映環境定義のcontrol_triggerパラメタは無効になります。
-
UOCに対しては,disconnect指示をしません。このため,UOCで実行する反映の場合には,反映システム定義のdiscintvlオペランドの指定は無効になります。
-
UOC内部で使う表の存在チェックをしません。このため,UOCで実行する反映の場合には,反映環境定義のtblcheckオペランドの指定は無効になります。
-
UOCで反映処理を実行する場合には,反映定義でユーザが作成したUOCの名称を設定します。反映処理の実行時には,指定した名称のUOCが自動的に起動されます。
(c) SQL記述領域への設定
SQL記述領域を使って反映側DBを更新する場合,必要な内容をUOCインタフェーステーブルからSQL記述領域に設定して,UOCを作成します。
UOCで直接,UOCインタフェーステーブルの列データを参照する場合は,データ型によってはC言語のキャストをし,参照する必要があります。UOCインタフェーステーブルの列データアドレスが指すデータのデータ形式,実データ長とC言語での表記の関係を次の表に示します。
UOCインタフェーステーブル |
データ領域長 (バイト) |
C言語での表記 |
|
---|---|---|---|
ニモニック |
列データ長 |
||
HDS_T_INT |
4 |
4 |
int |
HDS_T_SINT |
2 |
2 |
short |
HDS_T_DEC |
先頭2バイト:精度 後ろ2バイト:位取り |
精度÷2+1 |
char データエリア〔実データ長〕 |
HDS_T_FLT |
8 |
8 |
double |
HDS_T_DBL |
|||
HDS_T_SFLT |
4 |
4 |
float |
HDS_T_REAL |
|||
HDS_T_CHAR |
文字列長(バイト数) |
UOCの列データ長 |
char データエリア〔実データ長〕 |
HDS_T_MCHAR |
|||
HDS_T_VCHAR |
データ部文字列長(バイト数) |
UOCの列データ長+2 |
struct{ unsigned short 実データ長 char データエリア〔実データ長〕 } |
HDS_T_NCHAR |
文字列長(文字数) |
UOCの列データ長*2 |
char データエリア〔実データ長〕 |
HDS_T_NVCHAR |
データ部文字列長(文字数) |
UOCの列データ長*2+2 |
struct{ unsigned short 実データ長 char データエリア〔実データ長〕 } |
HDS_T_DATE |
4 |
4 |
char データエリア〔実データ長〕 |
HDS_T_TIME |
3 |
3 |
char データエリア〔実データ長〕 |
HDS_T_YTD |
先頭2バイト:精度(8) 後ろ2バイト:位取り(0) |
5 |
char データエリア〔実データ長〕 |
HDS_T_HTS |
先頭2バイト:精度(6) 後ろ2バイト:位取り(0) |
4 |
char データエリア〔実データ長〕 |
HDS_T_BLOB (列オプションが0x80以外の場合) |
データ部データ長(バイト数) |
UOCの列データ長+8 |
struct{ int 予備領域 unsigned int 実データ長 char データエリア〔実データ長〕 }※ |
HDS_T_BLOB (列オプションが0x80の場合) |
32 |
UOCの列データ長+8 |
「表8-8 USUBSTR_BLKの内容」を参照してください。 |
HDS_T_UNPACK |
UNPACKデータ長(バイト数) |
整数部けた数+小数部けた数 |
char データエリア〔実データ長〕 |
HDS_T_TIMESTAMP |
7+↑p÷2↑(バイト数) p:小数部のけた数 |
UOC列データ長 |
char データエリア〔実データ長〕 |
HDS_T_BINARY (列オプションが0x80以外の場合) |
データ部データ長(バイト数) |
UOCの列データ長+4 |
struct{ int 実データ長 char データエリア〔実データ長〕 }※ |
HDS_T_BINARY (列オプションが0x80の場合) |
32 |
UOCの列データ長+8 |
「表8-8 USUBSTR_BLKの内容」を参照してください。 |
- 注
-
繰返し列のデータは,一つの要素のデータ情報が一つのUCOLUMN_BLKに格納されます。
- 注※
-
連結演算のときも受け渡し方法は同じです。
(d) データ型
-
抽出側DBがメインフレーム側DBの場合,データ変換が必要なときには,データ変換をしたデータがUOCに渡されます。データ変換については,「4.3.4 データ型の対応の設計」を参照してください。
-
DATE型,TIME型のデータ形式は,符号なしパック形式で格納されています。SQL記述領域を使ったUAPを作成する場合には,データが格納されているエリアのアドレスを,直接SQL記述領域に設定して処理できます。SQL記述領域を使わないUAPを作成する場合,DATE型,TIME型のデータを文字列の日付データ,時刻データに変換した後,埋込み変数に設定して処理する必要があります。
-
SMALLFLOAT型のデータは,表現範囲の相違によるオーバフローを回避するため,FLOAT型のデータとして渡されます。
-
抽出列型がUNPACK型の場合,DECIMAL型へデータ変換した後にDECIMALデータ形式でUOCに渡します。UNPACKデータがDECIMAL型に変換できない場合は,UNPACKデータ形式でUOCに渡します。UOCに渡されるUNPACK型のニモニックについては,「表8-9 列データ型のニモニック」又は「表8-10 データアドレスのニモニック」を参照してください。