プロセス・プライベート・グローバル
ObjectScript のプロセス・プライベート・グローバルは、これを作成したプロセスによってのみアクセス可能な変数です。プロセスの終了時、プロセス・プライベート・グローバルはすべて削除されます。
プロセス・プライベート・グローバルは、IRISTEMP データベースに書き込まれます。グローバル変数とは対照的に、ローカル変数またはプロセス・プライベート・グローバル変数の SET または KILL は、ジャーナル化されたトランザクション・イベントとして扱われません。このようなイベントでは、トランザクションをロールバックしても、これらの処理には何の影響もありません。
概要
プロセス・プライベート・グローバルには、次のような特徴があります。
-
プロセス固有 : プロセス・プライベート・グローバルは、作成元のプロセスからのみアクセス可能で、そのプロセスが完了すると存在しなくなります。これは、ローカル変数と同様です。
-
常にパブリック : プロセス・プライベート・グローバルは常にパブリック変数です。これは、グローバル変数と同様です。
-
ネームスペース非依存 : プロセス・プライベート・グローバルは、すべてのネームスペースからアクセスできます。
-
引数なしの KILL、NEW、WRITE、または ZWRITE の影響を受けない : プロセス・プライベート・グローバルを KILL、WRITE、または ZWRITE の引数として指定できます。これは、グローバル変数と同様です。
命名規則
プロセス・プライベート・グローバル名は、次のいずれかの形式となります。
^||name
^|"^"|name
^["^"]name
^["^",""]name
これらの 4 つの接頭語は同等で、4 つはいずれも同じプロセス・プライベート・グローバルを参照します。最初の形式 (^||name) が最も一般的で、新しいコードに推奨されるものです。2 番目 ~ 4 番目の形式は、グローバルを定義する既存のコードとの互換性のために提供されています。
接頭語を除き、プロセス・プライベート・グローバルは、"識別子のルールとガイドライン" で説明するように、通常のグローバルと同じ名前付け規約を使用します。概要は以下のようになります。
-
最初の文字 (2 番目の垂直バーの後) は、文字、もしくはパーセント記号 (%) のいずれかにする必要があります。
% で始まるプロセス・プライベート変数名は、"パーセント変数" と呼ばれ、その有効範囲の規則は異なります。コードでは、これらの変数の名前は、%Z または %z で始めます。他の名前はシステムで使用するために予約されています。例えば、^||%Zmyvar のようになります。
-
ローカル変数とは異なり、グローバル名 (プロセス・プライベート・グローバルを含む) には、Unicode 文字 (ASCII 255 よりもコード値が大きい文字) を使用できません。プロセス・プライベート・グローバル名に Unicode 文字を使用すると <WIDE CHAR> エラーが発生します。
-
このプロセス・プライベート・グローバル名を含め、すべての変数名では、大文字と小文字が区別されます。
-
プロセス・プライベート・グローバル名は、プロセス内で一意である必要があります。
-
ローカル変数とは異なり、プロセス・プライベート・グローバル名は、接頭語を除き最大 31 文字です。31 文字より長い名前を指定することもできますが、最初の 31 文字のみが使用されます。このため、プロセス・プライベート・グローバル名は最初の 31 文字内で一意である必要があります。
-
その他の変数と同様に、プロセス・プライベート・グローバルには添え字を使用できます。
プロセス・プライベート・グローバルのリスト
^$GLOBAL() の ^$||GLOBAL() 構文形式を使用して、現在のプロセスに属するプロセス・プライベート・グローバルに関する情報を返すことができます。
^GETPPGINFO ルーチンを使用して、現在のすべてのプロセス・プライベート・グローバルの名前およびそれらのスペース割り当てをブロック単位で表示できます。^GETPPGINFO はプロセス・プライベート・グローバルの添え字も値もリストしません。プロセス ID (pid) を指定することで、特定プロセスのプロセス・プライベート・グローバルを表示できます。また、ワイルドカード文字列 (*) を指定することで、すべてのプロセスのプロセス・プライベート・グローバルを表示できます。^GETPPGINFO を呼び出すには %SYS ネームスペースで作業する必要があります。
以下の例では、^GETPPGINFO を使用して、現在のすべてのプロセスのプロセス・プライベート・グローバルをリストします。
SET ^||flintstones(1)="Fred"
SET ^||flintstones(2)="Wilma"
NEW $NAMESPACE
SET $NAMESPACE="%SYS"
DO ^GETPPGINFO("*")
^GETPPGINFO ルーチンは、以下のように引数を取ります。
do ^GETPPGINFO("pdf","options","outfile")
これらの引数は以下のとおりです。
-
pdf はプロセス ID または * ワイルドカードにすることができます。
-
options は次の文字列のあらゆる組み合わせにすることができます。
-
b (バイト数で値を返す)
-
Mnn (nn 個以上のブロックを使用するプロセス・プライベート・グローバルがあるプロセスのみをリストする)
プロセス・プライベート・グローバルがないプロセスをリストに含めるには M0 を使用します。
プロセス・プライベート・グローバルがないプロセスはリストから除外し、グローバル・ディレクトリ・ブロックのみがあるプロセスを含めるには M1 を使用します。(これが既定です。)
プロセス・プライベート・グローバルがないプロセスをリストから除外し、グローバル・ディレクトリ・ブロックのみがあるプロセスも除外するには M2 を使用します。
-
S (outfile と共に使用して画面表示を抑制)
-
T (プロセスの合計数のみを表示)
-
-
outfile は、^GETPPGINFO 出力を受け取る CSV (コンマ区切り値) 形式ファイルのファイル・パスです。
次の例では、プロセス・プライベート・グローバルを ppgout という名前の出力ファイルに書き込みます。S オプションで画面表示を抑制し、出力を 500 ブロック以上使用するプロセス・プライベート・グローバルがあるプロセスのみを M500 オプションで表示します。
NEW $NAMESPACE
SET $NAMESPACE="%SYS"
DO ^GETPPGINFO("*","SM500","/home/myspace/ppgout")
%SYS.ProcessQueryOpens in a new tab テーブルに、プロセス・プライベート・グローバルに関する情報を照会することもできます。以下に例を示します。
SELECT PID, Routine, PrivateGlobalBlockCount
FROM %SYS.ProcessQuery
WHERE PrivateGlobalBlockCount>0
ORDER BY PrivateGlobalBlockCount DESC