16
EWD 3 トレーニング・コース #28 従来のMUMPSコードをewd-xpressと 統合する M/Gateway Developments Ltd. Rob Tweed 訳: 日本ダイナシステム株式会社 芳成

EWD 3トレーニングコース#28 従来のMUMPSコードをewd-xpressと統合する

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

従来のコードを統合する (複雑な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