付録E.2 UOCを作成する場合の注意事項
UOCを利用する場合,ユーザが作成したプログラムがHiRDBに組み込まれて処理をすることになります。つまり,データベースマネジメントシステムの一部のプログラムという位置づけであるため,UOCの不具合がそのままHiRDBの不具合に発展するおそれがあります。そのため,UOCを作成する場合は,十分な注意とテストが必要となります。また,UOC作成時にはHiRDBのプログラム規則に従う必要があります。
(1) pdload及びpdrorgの共通規則
-
作成言語はC言語だけです。
-
UOCは,ダイナミックリンクライブラリの形式で作成してください。
-
作成したダイナミックリンクライブラリには,読み込み,実行の権限を与えてください。書き込み権限は与えないでください。誤って書き込み権限を与えた場合,UOCの実行時間が長くなり処理性能が悪くなります。
-
データベースにアクセスした関数は,グローバルバッファを占有します。また,バッファの占有データベースにアクセスした関数もグローバルバッファを占有します。バッファの占有時間が長いと,HiRDBはシステムの不具合と認識するため,UOC側での処理は必要最小限にして,早めにpdload側又はpdrorg側に制御を戻すようにしてください。
-
UOC内で異常終了した場合,pdload又はpdrorgも異常終了します。異常終了時のデータベースの状態とその回復方法については,「エラー時のデータベースの状態とその回復方法」又は「エラー時のデータベースの状態とその回復方法」を参照してください。
-
UOCインタフェース領域や記号定数を宣言した,UOC作成用のヘッダファイル(pdutluoc.h)は%PDDIR%\include下にあります。インタフェース領域を参照又は更新する場合は,UOCのコンパイル時に引き込んで使用することをお勧めします。なお,変数名称の設定などで,UOC作成用のヘッダファイルを使用できないで独自に定義する場合,テーブルの構造に違いがあるので注意してください。
-
グローバル変数及び関数名には,次の文字で始まる名称を使用しないでください。
-
大文字の「SQL」,「Y」,又は「Z」
-
小文字の「p_」,「pd」,「yy」,又は「z」
プラグイン及びJavaTMストアドルーチンを使用する場合は,更に次の文字で始まる名称も使用しないでください。
- プラグインを使用する場合:
-
小文字の「_p」
- Javaストアドルーチンを使用する場合:
-
小文字の「da」
小文字の「dbr」
小文字の「dp」
-
-
UOCのリターン値は,void型にしてください。
-
UOCで環境変数の設定,変更処理はしないでください。
-
UOC内では,SQLは発行できません。
-
シグナル操作はしないでください。
-
main関数はUOCとして使用できません。
-
リカーシブルな関数としないでください。
-
スタック不足の場合は,UOC内で異常終了することがあります。
-
スレッドは生成しないでください。
-
次の関数以外は使用しないでください。
-
ファイル操作関数
-
文字処理関数
-
メモリ取得・解放関数
-
-
次の関数は使用しないでください。
-
fork(),exit(),abort(),exec()などのプロセス操作関数
-
sleep(),select(),wait()
-
スタック操作関数(setjmp(),longjmp()など)
-
共用メモリ操作関数
-
セマフォ操作関数
-
ソケット操作関数
-
システム資源操作関数(setrlimitなど)
-
mmap(),munmap()
-
gethostent(),sethostent(),endhostent(),gethostbyname(),gethostbyaddr(),herror()
-
tempnam(),tmpnam()
-
pstat()
-
system()
-
-
UOCが動作しているプロセスのプロセスIDは,UOC内では使用しないでください。
-
ファイルの操作について,次の点に注意してください。
-
HiRDBインストールディレクトリ,及びHiRDB運用ディレクトリ下のファイルは操作しないでください。
-
OSのファイルは操作しないでください。
-
ファイルを作成する場合は,絶対パス名で指定してください。絶対パス名で指定しないと,カレントディレクトリ下にファイルが作成されます。HiRDBのプロセスのカレントディレクトリは,%PDDIR%\tmp\home下のディレクトリとなっているため,ここにはファイルを作成しないでください。
-
UOC内でファイルを作成する場合は,ファイルのパーミッションを明示的に設定してください。
-
UOCが一時的に作成したファイルは,必ず削除(unlink)してください。
-
PIPEなどのスペシャルファイルを使用しないでください。
-
標準入力,標準出力,及び標準エラー出力を使用しないでください。
-
ユティリティを複数実行すると,UOCも同時に複数実行されます。このため,UOCがファイル資源に対して排他を掛ける場合は,同時に実行されるほかのUOCが排他待ちにならないように注意してください。
-
UOCが出力したファイルは,ユーザが管理してください。
-
(2) pdload固有の規則
-
HiRDB/パラレルサーバの場合,UOCを格納したダイナミックリンクライブラリはsource文に指定したサーバがあるホストに用意してください。
-
pdloadがバイナリ形式の入力デ−タファイルを入力して,UOCへ1行分のデータを渡す場合に,可変長文字列の長さが不正なために1行に編集できないときは,処理を打ち切ります。
-
pdloadの応答がなくなった場合,pdloadとUOCのどちらに制御があるかを調べるには,pdls -d rpcコマンドを実行します。この結果のUSR_EVENTが0x00052601の場合は,UOCに制御があることになります。
-
pdrorg用アンロードファイルの場合,UOCを利用したデータロードはできません。
-
エンディアンが異なるpdrorg出力バイナリ形式ファイルを入力データファイルとする場合,次の点に注意してください。
-
UOCでデータを入力するとき
データを入力後,エンディアン変換はしないため,入力データはpdloadを実行するプラットフォームのエンディアンで渡してください。
-
UOCにデータを渡すとき
option文のsrcendianオペランドを指定して,エンディアン変換後のデータをUOCに渡します。
-
(3) pdrorg固有の規則
-
UOCを格納したダイナミックリンクライブラリはUOCを呼び出すサーバがあるホストに用意してください。UOCを呼び出すサーバとホストについては,「オプションと制御文の関係」を参照してください。
-
UOCで操作できるファイルは,UOCデータファイルだけです。
-
UOC内で,mallocなどのOS関数でメモリ領域を取得した場合,次の呼び出し方法で必ず解放してください。
-
開始処理でリターンコードに0以外を返す
-
終了処理
-
中止処理
-
-
pdrorgの応答がなくなった場合,pdrorgとUOCのどちらに制御があるかを調べるには,pdls -d rpcコマンドを実行します。この結果のUSR_EVENTが0x00051601の場合は,UOCに制御があることになります。