Node.js からのクラス・メソッドの呼び出し
ここでは、ObjectScript クラス・メソッドを Node.js アプリケーションから直接呼び出すことを可能にするクラス Iris のメソッドを説明します。詳細および例は、以下のセクションを参照してください。
-
Node.js からのクラス・メソッドの呼び出し — ObjectScript クラス・メソッドを呼び出す方法を示します。
-
引数の参照渡し — IRISReference クラスを使用してメソッドの引数を渡す方法を示します。
この章の例では、irisjs という名前の Iris オブジェクトが既に存在し、サーバに接続されていると想定します。これは、以下のコードを使用して作成し、接続されています。
const IRISNative = require('intersystems-iris')
// Open a connection to the server and create an Iris object
let connectionInfo = {
host: '127.0.0.1',
port: 51773,
ns: 'USER',
user: 'username',
pwd: 'password'
};
const conn = IRISNative.createConnection(connectionInfo);
const irisjs = conn.createIris();
詳細は、createConnection() および createIris() のクイック・リファレンスのエントリを参照してください。
Node.js からのクラス・メソッドの呼び出し
classMethodValue() メソッドと classMethodVoid() メソッドは、ほとんどの目的に使用できますが、特定の返りタイプが必要な場合は、classMethodBoolean()、classMethodBytes()、classMethodDecimal()、classMethodNumber()、classMethodIRISList()、classMethodBigInt()、classMethodObject()、および classMethodString() の Iris.classMethodValue() 型キャスト・メソッドも使用できます。
これらのメソッドはすべて、class_name および method_name の文字列引数に加え、0 個以上のメソッド引数を取ります。
以下の例のコードでは、User.NativeTest という名前の ObjectScript テスト・クラスからいくつかのデータ型のクラス・メソッドを呼び出します(このセクションの最後に示す “ObjectScript クラス User.NativeTest” を参照)。
この例のコードでは、サポートされている各データ型のクラス・メソッドを ObjectScript テスト・クラス User.NativeTest から呼び出します (この例の直後に表示されています)。変数 irisjs はクラス Iris の以前に定義されたインスタンスで、現在サーバに接続されていると想定します (“Node.js での接続の作成” を参照)。
const className = 'User.NativeTest';
let cmValue = "";
let comment = "";
comment = ".cmBoolean() tests whether arguments 2 and 3 are equal: "
cmValue = irisjs.classMethodBoolean(className,'cmBoolean',2,3);
console.log(className + comment + cmValue);
comment = ".cmBytes() returns integer arguments 72,105,33 as a byte array (string value 'Hi!'): "
cmValue = irisjs.classMethodBytes(className,'cmBytes',72,105,33); //ASCII 'Hi!'
console.log(className + comment + cmValue);
comment = ".cmString() concatenates 'Hello' with argument string 'World': "
cmValue = irisjs.classMethodString(className,'cmString','World');
console.log(className + comment + cmValue);
comment = ".cmLong() returns the sum of arguments 7+8: "
cmValue = irisjs.classMethodBigInt(className,'cmLong',7,8);
console.log(className + comment + cmValue);
comment = ".cmDouble() multiplies argument 4.5 by 1.5: "
cmValue = irisjs.classMethodNumber(className,'cmDouble',4.5);
console.log(className + comment + cmValue);
comment = ".cmList() returns a $LIST containing arguments 'The answer is ' and 42: "
cmValue = irisjs.classMethodIRISList(className,"cmList","The answer is ",42);
console.log(className + comment+cmValue.get(1)+cmValue.get(2) )
comment = ".cmVoid() assigns argument value 75 to global node ^cmGlobal: "
try {
irisjs.kill('cmGlobal') // delete old ^cmGlobal if it exists
irisjs.classMethodVoid(className,'cmVoid',75);
cmValue = irisjs.get("cmGlobal"); //get current value of ^cmGlobal
}
catch {cmValue = 'method failed.'}
console.log(className + comment + cmValue);
この例では、サポートされている各型に対する classMethodValue() 型キャスト・メソッドについて説明します。classMethodValue() (型指定のない値を返す) および classMethodObject() ("“Node.js からのデータベース・オブジェクトの制御”" で説明) については省略しています。
前の例を実行するには、この ObjectScript クラスがコンパイルされ、サーバで使用可能である必要があります。
Class User.NativeTest Extends %Persistent
{
ClassMethod cmBoolean(cm1 As %Integer, cm2 As %Integer) As %Boolean
{
Quit (cm1=cm2)
}
ClassMethod cmBytes(cm1 As %Integer, cm2 As %Integer, cm3 As %Integer) As %Binary
{
Quit $CHAR(cm1,cm2,cm3)
}
ClassMethod cmString(cm1 As %String) As %String
{
Quit "Hello "_cm1
}
ClassMethod cmLong(cm1 As %Integer, cm2 As %Integer) As %Integer
{
Quit cm1+cm2
}
ClassMethod cmDouble(cm1 As %Double) As %Double
{
Quit cm1 * 1.5
}
ClassMethod cmVoid(cm1 As %Integer)
{
Set ^cmGlobal=cm1
Quit
}
ClassMethod cmList(cm1 As %String, cm2 As %Integer)
{
Set list = $LISTBUILD(cm1,cm2)
Quit list
}
}
ターミナルからこれらのメソッドを呼び出すことで、それらをテストできます。例を以下に示します。
USER>write ##class(User.NativeTest).cmString("World")
Hello World
以前のバージョンの Native SDK では、ObjectScript の関数やプロシージャに直接アクセスするメソッドが提供されていました。これらのメソッドはセキュリティ上の懸念により削除されました。呼び出した場合、サーバ・エラーを返します。関数やプロシージャは、ObjectScript ラッパー・クラスでメソッドとして利用可能にすることで、引き続き間接的に呼び出すことができます。
引数の参照渡し
InterSystems クラス・ライブラリのほとんどのクラスでは、メソッドが %StatusOpens in a new tab 値のみを返す呼び出し規則を使用します。実際の結果は、参照によって渡される引数で返されます。Native SDK では、メソッドで参照渡しがサポートされます。これには、以下のように引数の値をクラス IRISReference のインスタンスに割り当て、そのインスタンスを引数として渡します。
const IRISNative = require('intersystems-iris')
var ref_object = new IRISNative.IRISReference(null) // set initial value to 0
var status = irisjs.classMethodObject("%SomeClass","SomeMethod", arglist, ref_object);
var returned_value = ref_object.getValue(); // get the method result
以下の例では、標準のクラス・ライブラリ・メソッドが呼び出されます。
この例は、%SYS.DatabaseQuery.GetDatabaseFreeSpace()Opens in a new tab を呼び出して、iristemp データベースで利用可能な空き容量の量 (MB 単位) を取得します。
const IRISNative = require('intersystems-iris')
var freeMB = new IRISNative.IRISReference(null) // set initial value to 0
const dir = "C:/InterSystems/IRIS/mgr/iristemp" // directory to be tested
var value = "error"
var status = 0
console.log("Type of freeMB = "+ (typeof freeMB) + ", value = " + freeMB.getValue())
try{
console.log("Calling %SYS.DatabaseQuery.GetDatabaseFreeSpace()... ")
status = irisjs.classMethodObject("%SYS.DatabaseQuery","GetDatabaseFreeSpace",dir,freeMB)
value = freeMB.getValue()
} catch {
console.log("Call to class method GetDatabaseFreeSpace() returned error:")
}
console.log("(status=" + status + ") Free space in " + dir + " = " + value + "MB\n")
}
出力 :
Type of freeMB=str(type(freeMB)), value=null
Calling %SYS.DatabaseQuery.GetDatabaseFreeSpace()...
(status=1) Free space in C:/InterSystems/IRIS/mgr/iristemp = 10MB