Upload
kiyoshi-sawada
View
84
Download
1
Embed Size (px)
Citation preview
EWD 3トレーニング・コース #28
従来のMUMPSコードをewd-xpressと統合する
M/Gateway Developments Ltd.
Rob Tweed
訳: 日本ダイナシステム株式会社 嶋 芳成
MUMPSコードを統合する
• cache.node の function() API を用います• function() は、GT.M用の NodeM モジュールでも利用
できます
• MUMPS 外部関数を呼び出します
• Node.js/JavaScript から既存のMUMPSロジックを呼び出すためには、それ用の外部関数のラッパーを作る必要があります
EWD 3 トレーニング・コース #28 22016/9/30
関数を呼び出す
var result = this.db.function({
function: ‘myFunc^theRoutine’,
arguments: [arg1, arg2]
});
これは、次のコードと等価
Set result=$$myFunc^theRoutine(arg1,arg2)
EWD 3 トレーニング・コース #28 32016/9/30
function() の結果
• function() の呼び出しによって返される値は、非常に長い文字列になる可能性があります• 値を返すには、文字列化された(stringifed)JSONを用い
るかもしれません• しかしこれには、JSON文字列を生成するために MUMPS の
JSON分析(parser)/生成(generator)プログラムが必要です
• これらは遅くなる傾向があります
• 信頼性が高いとは言えません
EWD 3 トレーニング・コース #28 42016/9/30
function() API の限界
• 引数は単純な変数に制限されます• 数値または文字列
• 引数は参照渡しでは渡すことができません• 従って、複雑なデータ構造を関数の引数経由では受け渡
しできません
EWD 3 トレーニング・コース #28 52016/9/30
従来のMUMPSを統合するのは可能か?
• できます!
• MUMPSのラッパー関数と複雑なデータを受け渡しするには、一時グローバルを使うという技があります
• cache.node (そしてNodeM)インターフェースが、Caché (またはGT.M) とインプロセスで稼働しているということを利用します
EWD 3 トレーニング・コース #28 62016/9/30
イン・プロセス連携
EWD 3 トレーニング・コース #28 7
Node.jscache.node
NodeM
Caché
GT.M
C コ
ール
イン
・イ
ンタ
ーフェー
ス
2016/9/30
イン・プロセス連携
EWD 3 トレーニング・コース #28 8
Node.jscache.node
NodeM
Caché
GT.M
C コ
ール
イン
・イ
ンタ
ーフェー
ス
process.pid $job
1対1対応しています
2016/9/30
イン・プロセス連携
EWD 3 トレーニング・コース #28 9
Node.jscache.node
NodeM
Caché
GT.M
C コ
ール
イン
・イ
ンタ
ーフェー
ス
process.pid $job
New this.documentStore.documentNode(‘temp’, [process.pid]) ^temp($job)
これらは同じものを参照しています
2016/9/30
従来のコードを統合する
• Node.js 側では、従来の MUMPS 関数を呼び出す前に、• setDocument() を用いて、複雑な入力データを
process.pid を添え字とした一時グローバルに書き込みます
例えば、
var myComplexInputData = {//複雑な入力データをここに}
Var temp = new this.documentStore.documentNode(‘temp’, [process.pid]);
Temp.setDocument(myComplexInputData);
// ここでMUMPS関数を呼び出します
Var result = this.db.function({function: ‘myFunc^theRoutine’, arguments:[]});
2016/9/30 EWD 3 トレーニング・コース #28 10
従来のコードを統合する
• MUMPSの関数の中で:• 複雑な入力データは、^temp($j) とその下位ノードとして
アクセスすることができます
• 従って、^temp($j) を input マージします
new inputs
merge inputs=^temp($j)
• これで複雑な入力データを、関数で取り出すことができました
2016/9/30 EWD 3 トレーニング・コース #28 11
従来のコードを統合する
• MUMPSの関数の中で:• この入力データを処理するMUMPSコードを呼び出します
• 複雑な出力データを、ローカル配列に入れます
• その配列を一時グローバルに逆にマージします
• 例えば、
new outputs
;出力データをこのoutputという配列に入れ、そして
kill ^temp($j) ;一時グローバルを消去
merge ^temp($j)=outputs
QUIT 1 ;関数が終了した
2016/9/30 EWD 3 トレーニング・コース #28 12
従来のコードを統合する
• Node.js側では• 一時グローバルから結果を getDocument() を用いて取
り出す
• 一時グローバルのドキュメント・ノードを削除する
• 例えば、
var outputs = temp.getDocument();
temp.delete();
2016/9/30 EWD 3 トレーニング・コース #28 13
従来のコードを統合する
• ewd-xpress は ewd-qoper8 を用いていることを思い出してください
• これによって cache.node API の同期処理を安全に利用することができます
• つまり MUMPS 関数を ewd-xpress の中で呼び出すのは同期処理です
• 従ってあなたの JavaScript のロジックは、MUMPS関数が終了するまで、続きは待たされます• MUMPSコード内で HANG したり LOCK で待たされるか
どうかには関わりません
2016/9/30 EWD 3 トレーニング・コース #28 14
従来のコードを統合する (複雑なI/O)
var myComplexInputData = {//複雑な入力データをここに}var temp = new this.documentStore.documentNode(‘temp’, [process.pid]);temp.delete(); // ここでは消去するtemp.setDocument(myComplexInputData);
// ここでMUMPS関数を呼び出しますvar result = this.db.function({function: ‘myFunc^theRoutine’, arguments:[]});
// MUMPS の関数が終了すると、その出力を処理するvar outputs = temp.getDocument();temp.delete(); // 一時グローバルを消去する
// MUMPS 関数から出力された複雑な出力データは、これで output オブジェクトに読み込まれました
2016/9/30 EWD 3 トレーニング・コース #28 15