More Related Content
Similar to EWD 3トレーニングコース#28 従来のMUMPSコードをewd-xpressと統合する (20)
More from Kiyoshi Sawada (20)
EWD 3トレーニングコース#28 従来のMUMPSコードをewd-xpressと統合する
- 2. MUMPSコードを統合する
• cache.node の function() API を用います
• function() は、GT.M用の NodeM モジュールでも利用
できます
• MUMPS 外部関数を呼び出します
• Node.js/JavaScript から既存のMUMPSロジック
を呼び出すためには、それ用の外部関数のラッパーを
作る必要があります
EWD 3 トレーニング・コース #28 22016/9/30
- 3. 関数を呼び出す
var result = this.db.function({
function: ‘myFunc^theRoutine’,
arguments: [arg1, arg2]
});
これは、次のコードと等価
Set result=$$myFunc^theRoutine(arg1,arg2)
EWD 3 トレーニング・コース #28 32016/9/30
- 4. function() の結果
• function() の呼び出しによって返される値は、非常
に長い文字列になる可能性があります
• 値を返すには、文字列化された(stringifed)JSONを用い
るかもしれません
• しかしこれには、JSON文字列を生成するために MUMPS の
JSON分析(parser)/生成(generator)プログラムが必要です
• これらは遅くなる傾向があります
• 信頼性が高いとは言えません
EWD 3 トレーニング・コース #28 42016/9/30
- 5. function() API の限界
• 引数は単純な変数に制限されます
• 数値または文字列
• 引数は参照渡しでは渡すことができません
• 従って、複雑なデータ構造を関数の引数経由では受け渡
しできません
EWD 3 トレーニング・コース #28 52016/9/30
- 9. イン・プロセス連携
EWD 3 トレーニング・コース #28 9
Node.js
cache.node
NodeM
Caché
GT.M
Cコールイン・
インターフェース
process.pid $job
New this.documentStore.documentNode(‘temp’, [process.pid]) ^temp($job)
これらは同じものを参照しています
2016/9/30
- 10. 従来のコードを統合する
• 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
- 14. 従来のコードを統合する
• ewd-xpress は ewd-qoper8 を用いていることを
思い出してください
• これによって cache.node API の同期処理を安全
に利用することができます
• つまり MUMPS 関数を ewd-xpress の中で呼び出
すのは同期処理です
• 従ってあなたの JavaScript のロジックは、MUMPS
関数が終了するまで、続きは待たされます
• MUMPSコード内で HANG したり LOCK で待たされるか
どうかには関わりません
2016/9/30 EWD 3 トレーニング・コース #28 14
- 15. 従来のコードを統合する (複雑な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
- 16. 従来のコードを統合する (複雑なI/O)
• 対応する MUMPS のラッパー関数
myFunc()
new inputs,outputs
merge inputs=^temp($j)
;従来のMUMPSルーチンや関数などを呼び出す
;inputs を処理し、出力データを outputs配列にセットする
kill ^temp($j)
merge ^temp($j)=outputs
QUIT 1
2016/9/30 EWD 3 トレーニング・コース #28 16