Caché での Node.js の使用法 Version 2014.1 2014 年 06 月 24 日 InterSystems Corporation 1 Memorial Drive Cambridge MA 02142 www.intersystems.com Caché での Node.js の使用法 Caché Version 2014.1 2014 年 06 月 24 日 Copyright © 2014 InterSystems Corporation All rights reserved. このドキュメントは、 Oracle Corporation、RenderX Inc.、 アドビ システムズ および ワールドワイド・ウェブ・コンソーシアム(www.w3c.org)のツールと 情報を使用して、 Adobe Portable Document Format (PDF)で作成およびフォーマットされました。主要ドキュメント開発ツールは、InterSystemsが構 築したCacheéと Javaを使用した特別目的のXML処理アプリケーションです。 , , , , Caché WEBLINK, および Distributed Cache Protocol は InterSystems Corporation の登録商標です。 and , InterSystems TrakCare, InterSystems Jalapeño Technology, Enterprise Cache Protocol, ECP および InterSystems Zen は InterSystems Corporation の 登録商標です。 ここで使われている他の全てのブランドまたは製品名は、各社および各組織の商標または登録商標です。 このドキュメントは、インターシステムズ社(住所:One Memorial Drive, Cambridge, MA 02142)あるいはその子会社が所有する企業秘密および秘密 情報を含んでおり、インターシステムズ社の製品を稼動および維持するためにのみ提供される。この発行物のいかなる部分も他の目的のために使 用してはならない。また、インターシステムズ社の書面による事前の同意がない限り、本発行物を、いかなる形式、いかなる手段で、その全てまたは 一部を、再発行、複製、開示、送付、検索可能なシステムへの保存、あるいは人またはコンピュータ言語への翻訳はしてはならない。 かかるプログラムと関連ドキュメントについて書かれているインターシステムズ社の標準ライセンス契約に記載されている範囲を除き、ここに記載さ れた本ドキュメントとソフトウェアプログラムの複製、使用、廃棄は禁じられている。インターシステムズ社は、ソフトウェアライセンス契約に記載され ている事項以外にかかるソフトウェアプログラムに関する説明と保証をするものではない。さらに、かかるソフトウェアに関する、あるいはかかるソフ トウェアの使用から起こるいかなる損失、損害に対するインターシステムズ社の責任は、ソフトウェアライセンス契約にある事項に制限される。 前述は、そのコンピュータソフトウェアの使用およびそれによって起こるインターシステムズ社の責任の範囲、制限に関する一般的な概略である。完 全な参照情報は、インターシステムズ社の標準ライセンス契約に記され、そのコピーは要望によって入手することができる。 インターシステムズ社は、本ドキュメントにある誤りに対する責任を放棄する。また、インターシステムズ社は、独自の裁量にて事前通知なしに、本ド キュメントに記載された製品および実行に対する代替と変更を行う権利を有する。 インターシステムズ社の製品に関するサポートやご質問は、以下にお問い合わせください: Tel: Fax: Email: InterSystems Worldwide Customer Support +1 617 621-0700 +1 617 374-9391 [email protected] 目次 このドキュメントについて ................................................................................................... 1 1 はじめに ..................................................................................................................... 3 2 インストール ................................................................................................................. 5 2.1 UNIX ................................................................................................................. 5 2.2 Windows ............................................................................................................. 6 3 Node.js から Caché へのアクセス ..................................................................................... 7 3.1 JSON オブジェクトと Caché グローバル .................................................................... 7 3.2 同期 cache.node メソッドと非同期 cache.node メソッド ................................................. 8 3.3 cache.node メソッドの概要 ..................................................................................... 9 3.4 Caché データベースを開くおよび閉じる .................................................................. 10 3.5 retrieve() および update() を使用した高度なデータ・アクセス ..................................... 11 3.5.1 retrieve() の使用 ....................................................................................... 11 3.5.2 update() の使用 ......................................................................................... 15 3.6 オブジェクト指向の開発手法に向けて .................................................................... 16 4 cache.node メソッドのリファレンス ................................................................................... 17 4.1 サンプル・データ ................................................................................................ 18 4.2 close() .............................................................................................................. 18 4.3 data() ............................................................................................................... 18 4.4 function() .......................................................................................................... 19 4.5 get() ................................................................................................................. 20 4.6 global_directory() ................................................................................................ 21 4.7 increment() ........................................................................................................ 22 4.8 kill() ................................................................................................................. 22 4.9 lock() ................................................................................................................ 23 4.10 merge() ........................................................................................................... 24 4.11 next() または order() .......................................................................................... 24 4.12 next_node() ...................................................................................................... 25 4.13 open() ............................................................................................................. 27 4.14 previous() ........................................................................................................ 27 4.15 previous_node() ................................................................................................. 28 4.16 retrieve() ......................................................................................................... 30 4.17 set() ............................................................................................................... 32 4.18 unlock() ........................................................................................................... 32 4.19 update() .......................................................................................................... 33 4.20 version() と about() ............................................................................................ 34 付録A: ソースからの cache.node のビルド .......................................................................... 37 A.1 Node.js ビルド・プロシージャを使用 ....................................................................... 37 A.1.1 ビルド・スクリプト (wscript) の作成 ................................................................. 37 A.1.2 cache.node モジュールのビルド ................................................................... 38 A.2 ソースからの直接ビルド ....................................................................................... 38 Caché での Node.js の使用法 iii このドキュメントについて このドキュメントでは、Node.js アプリケーションから Caché へのアクセスを提供する cache.node モジュールのインストー ル方法および使用方法について説明します。 このドキュメントの内容は以下のとおりです。 • はじめに • インストール • Node.js から Caché へのアクセス • cache.node メソッドのリファレンス • ソースからの cache.node のビルド 詳細な目次もあります。 一般的な情報については、"InterSystems のドキュメントの使用法" を参照してください。 Caché での Node.js の使用法 1 1 はじめに このドキュメントでは、Caché に格納されているデータへの高性能なアクセスを実現する Node.js 環境用アドオン・モジュー ルである cache.node について説明します。 Node.js は、高性能で拡張性の高いネットワーク・インフラストラクチャを簡単に構築できる手段を提供します。これは、従 来のスレッドベースのネットワーク・ソフトウェア (Web ブラウザなど) とは異なり、非ブロック型イベント・ベース・アーキテク チャを提供します。 現在のほとんどの Web サーバは、1 つのスレッドが各リクエストの処理専用となるハイブリッド・マルチプロセス/マルチス レッド・サーバ・アーキテクチャを使用して実装されています。そのスレッドに関連付けられているすべてのリソースは、そ のリクエストが処理され、レスポンスがそのクライアントに送信されるまで割り当てられたままです。Node.js のアーキテク チャでは、1 つのプロセスが (ノードの) インスタンスごとに使用され、スレッドは、他の場合であればブロックされる処理 およびシステム・コールを実行のプライマリ・スレッドに対して非同期に呼び出すことができる手段としてのみ使用されま す。すべては非同期に実行されます。そして、主要な設計の特徴は、どの関数もブロックせず、Node.js で開始プログラ ムに処理が完了したことを通知するために使用されるコールバック関数を受け入れるということです。 イベント・ベース・サーバ・アーキテクチャの結果として、他の処理の完了を待機する間、システム・リソース (ヒープ・メモ リなど) が専有されることがなくなります。これにより、Node.js を使用して開発されたネットワーク・プログラムでは、システ ム・リソース、メモリ使用量、および高度な拡張性に関して専有されるフットプリントは非常に小さくなります。 cache.node モジュールによって、Caché を、高性能 Node.js 環境を完全に補完する高パフォーマンス永続ストレージ・ エンジンとして活用できます。Caché 多次元ストレージは、さまざまなデータ構造の実装に使用できる高速かつ柔軟なス トレージ・モデルを提供します。Caché cache.node モジュールによって、グローバル (多次元ストレージ・モデルの基盤) への直接アクセスが可能になります (正式な説明は、"Caché グローバルの使用法" を参照してください)。 Caché は、B-Tree ベースのストレージを提供する NoSQL データベースとみなすこともできますが、重要な違いが 1 つ あります。大部分の B-Tree データベースでは 1 次元のキー・バリュー・ストレージが実装されていますが、Caché は、多 次元の複数キー・バリュー・ストレージ・モデルを提供します。これにより、高度に構造化された NoSQL データ・リポジトリ の基盤が提供されます。Caché の用語では、各エントリを "グローバル・ノード" と呼びます。 例: 1 次元のグローバル・ストレージ : MyGlobal(“key1”)=”value1” MyGlobal(“key2”)=”value2” MyGlobal(“key3”)=”value3” 多次元のグローバル・ストレージ : Caché での Node.js の使用法 3 はじめに MyGlobal(“key1”)=”value1” MyGlobal(“key1”, “key1a”)=”value1a” MyGlobal(“key1”, “key1a, “key1b”)=”value1b” MyGlobal(“key2”)=”value2” MyGlobal(“key2”, 1)=”value21” MyGlobal(“key2”, 2)=”value22” MyGlobal(“key3”)=”value3” MyGlobal(“key3”, 1, 2, 3)=”value3123” MyGlobal(“key3”, 1, 3)=”value313” 4 Caché での Node.js の使用法 2 インストール このセクションでは、事前にビルド済みの cache.node モジュールのインストール手順について説明します。 以下のコンポーネントが必要です。 • Caché のインストール • Node.js バージョン 0.4.2 (またはそれ以降)。 Node.js は、いくつかの UNIX プラットフォームで使用できます。Windows に対するネイティブ・サポートは、バージョン 0.6 で追加されました。 cache.node ファイルは、UNIX と Windows のどちらの場合も Node.js .node 拡張子を使用した名前が付けられていま す。インターシステムズによって提供されるキットでは、Node.js バージョン 0.6 (およびそれ以降) で使用するモジュール は cache061.node という名前です。これは、既存の Node.js ソフトウェアの require 文を変更しないで済むように、配 置する前に通常の cache.node という名前に変更できます。 • Node.js バージョン 0.4.x : cache.node • Node.js バージョン 0.6.x : cache061.node 2.1 UNIX モジュール cache.node は、実際は標準 UNIX 共有オブジェクト (つまり、cache.so) ですが、特別な Node.js 固有のファ イル拡張子が付いています。 cache.node を、ノード・ファイル・システムの以下の場所にコピーします。 .../node/lib/node/ 以下はその例です。 /opt/local/node/lib/node/cache.node 認識されているライブラリ・パスにモジュールを配置すると、JavaScript ファイルにフル・パスを指定する必要がなくなりま す。例えば、JavaScript では以下のように記述できます。 var globals = require(‘cache'); これは、以下 (例) の代わりとして使用できます。 var globals = require('/opt/local/build/default/cache'); Caché での Node.js の使用法 5 インストール 2.2 Windows モジュール cache.node は、実際は標準 Windows DLL (つまり、cache.dll) ですが、特別な Node.js 固有のファイル拡 張子が付いています。 標準の Windows インストーラ (Node.js グループによって提供) では、通常、Node.js ソフトウェアは以下の場所に配置さ れます。 C:\Program Files\nodejs 通常、インストール・メカニズムによって、この場所が Windows PATH 環境変数に追加されます。追加されていない場合 は、手動で追加してください。また、NODE_PATH 環境変数も Node.js インストール・ディレクトリに設定する必要がありま す。以下はその例です。 NODE_PATH=C:\Program Files\nodejs cache.node を、NODE_PATH 環境変数で指定されている場所にコピーします。 C:\Program Files\nodejs 認識されている Node.js パスにモジュールを配置すると、JavaScript ファイルにフル・パスを指定する必要がなくなりま す。例えば、JavaScript では以下のように記述できます。 var globals = require(‘cache'); これは、以下 (例) の代わりとして使用できます。 var globals = require('/nodejs/lib/cache'); または、 var globals = require('c:/nodejs/lib/cache'); 6 Caché での Node.js の使用法 3 Node.js から Caché へのアクセス cache.node モジュールは、基本的な NoSQL スタイルのメソッドを提供すると共に、Caché データベースの高レベルな ビューを実装するために使用できる高度なメソッドも備えており、それらはオブジェクト指向の開発手法の基盤とすること ができます。この章では、使用可能なメソッドの概要とそれらの背後にある概念を説明します。 以下の項目について説明します。 • JSON オブジェクトと Caché グローバル — Caché データベースのグローバルと Node.js 環境の JSON オブジェクト との間の基本的な関係について説明します。 • 同期 cache.node メソッドと非同期 cache.node メソッド — 同期と非同期の両方での cache.node 呼び出しの使用法 について説明します。 • cache.node メソッドの概要 — 基本的な NoSQL スタイルの cache.node データベース・メソッドの概要を説明します。 • Caché データベースを開くおよび閉じる — cache.node モジュールのロード方法、cache.node オブジェクトのインス タンスの作成方法、およびターゲット Caché データベースを開くまたは閉じる方法について説明します。 • retrieve() および update() を使用した高度なデータ・アクセス — 基本的な NoSQL スタイルのメソッドより効率的に 特定の処理を実行する高度な cache.node メソッドについて説明します。 • オブジェクト指向の開発手法に向けて — cache.node メソッドおよび JSON 表記法をオブジェクト指向の開発にどの ように使用できるのかを示します。 3.1 JSON オブジェクトと Caché グローバル このセクションでは、Node.js 環境の JSON オブジェクトと Caché データベースのグローバルとの間の基本的な関係につ いて説明します。 以下のグローバル・ノードを考えてみます。 ^Customer(1)="Chris Munt" 注釈 Caché では、規約により、グローバル名の先頭には ‘^’ 文字を付けます。ただし、対応する JSON 表記法では この規約に従わないでください。 同等の JSON 構成は以下のようになります。 {global: "Customer", subscripts: [1], data: "Chris Munt"} このデータ構造にノードを追加するには、以下のようにします。 Caché での Node.js の使用法 7 Node.js から Caché へのアクセス グローバル : ^Customer(1)="Chris Munt" ^Customer(1, "Address", 1)="London" ^Customer(1, "Address", 2)="UK" ^Customer(1, "DateOfRegistration")="1 May 2010" JSON : { global: "Customer", subscripts: [1], data: "Chris Munt" } { global: "Customer", subscripts: [1, "Address", 1], data: "London" } { global: "Customer", subscripts: [1, "Address", 2], data: "UK" } { global: "Customer", subscripts: [1, "DateOfRegistration"], data: "1 May 2010" } 3.2 同期 cache.node メソッドと非同期 cache.node メソッド cache.node によって提供されるすべてのメソッドは、同期でも非同期でも実行できます。同期処理は、概念的に理解し やすく、デバッグに役立つ可能性がありますが、Node.js 環境における想定では、すべての処理は、コールバック関数に よって発生する完了イベントと非同期に実装されていることになっています。このような理由により、このガイドで示す例 の大部分は、非同期に実行されるようにコード化されています。それらを同期的に実行するには、単に引数リストからコー ルバック関数を削除します。 • 同期処理 — 処理が完了するまで、メソッドは返しません。 • 非同期処理 — メソッドは直ちに返し、プログラムには処理が完了したときに通知されます。通知を受け取るには、元 のメソッド呼び出しにコールバック関数を引数として渡す必要があります。規約により、コールバックは必ずリストの最 後の引数にします。 使用している cache.node モジュールのバージョンを判別するメソッドを考えてみます。 同期処理 : var result = mydata.version(); 非同期処理 : mydata.version( function(error, result) { if (error) { // error } else { // success } } ); Node.js におけるエラー報告の標準規約は、cache.node に実装されています。処理が成功した場合は、エラーは false になります。エラーが発生した場合はエラーが true になり、結果オブジェクトには、以下の JSON 構造に従った詳細が 含まれるようになります。 8 Caché での Node.js の使用法 cache.node メソッドの概要 { "ErrorMessage": [error message text], "ErrorCode": [error code], "ok": [true|false] } 同期処理の場合、結果オブジェクト内にこれらのプロパティが存在しているか確認して、エラーが発生したかどうかを判 別する必要があります。 3.3 cache.node メソッドの概要 個々の cache.node メソッドについては、リファレンスのセクションで詳しく説明します。ここでは、使用可能なメソッドの簡 単な概要とそれらの使用について説明し、リファレンスのセクションのそれらの項目へのリンクを示します。 データベースを開くおよび閉じる これらのメソッドの使用に関する基本的な情報については、“Caché データベースを開くおよび閉じる” を参照 してください。 • open() — 指定した Caché データベースを開きます。 • close() — 事前に開いたデータベースを閉じます。 個々のノードに対する処理 • set() — グローバル・ノードの値を設定します。 • get() — グローバル・ノードを取得します。 • kill() — グローバル・ノードを削除します。 • increment() — グローバル・ノードの整数値に 1 を加算します。 • merge() — グローバルのすべてまたは一部を別のグローバルにコピーします。 グローバル・ノードにわたる反復 • data() — グローバル・ノードの存在についてテストします。 • next() および previous() — 現在のレベルの次または前のグローバル・ノード添え字を取得します。 • next_node() および previous_node() — レベルに関係なく、照合順の次または前のグローバル・ノードを取得 します。 • lock() および unlock() — 排他的に使用するためにグローバル・ノードをロックし、プログラムによって事前に ロックされたノードをロック解除します。 高度なデータ・アクセス これらのメソッドは、バッチ読み取りおよび書き込み処理を実行し、それらは、多くの場合、基本的な NoSQL ス タイルのメソッドでアクセスするよりも効率的です。 • retrieve() — 指定したレベルより下で定義されているすべてのグローバル・ノードを再帰的に取得し、それ らを単一の JSON オブジェクトとして返します。 • update() — JSON オブジェクト内の情報を使用して、一連のグローバルをデータベースに書き込みます。 使用法の詳細な説明は、“retrieve() および update() を使用した高度なデータ・アクセス” を参照してください。 Caché での Node.js の使用法 9 Node.js から Caché へのアクセス Caché 固有のメソッド 以下のメソッドは、Caché の情報および関数へのアクセスを提供します。 • function() — Caché 関数を呼び出します。 • global_directory() — Caché データベースに格納されているグローバルのリストを返します。 • version() — 使用している cache.node モジュールおよびそれに関連する Caché データベース (開いてい る場合) に関するバージョン情報を返します。 3.4 Caché データベースを開くおよび閉じる 他のメソッドを呼び出すには、その前に cache.node モジュールをロードする必要があり、データにアクセスする前に、作 成した Caché オブジェクトのインスタンスおよびターゲット Caché データベースを開く必要があります。 cache.node モジュールのロード cache.node モジュールが Node.js インストールに対して適切な場所にインストールされている場合、以下の行によって それが既定の場所から正常にロードされます。 var globals = require('cache'); そのモジュールが別の場所にインストールされている場合、フル・パスを指定する必要があります。以下はその例です。 var globals = require('/opt/cm/node042/build/default/cache'); インスタンスの作成 次のタスクは、cache.node オブジェクトのインスタンスを作成することです。 var mydata = new globals.Cache(); データベースを開く これで、Caché データベースを開けるようになります。 mydata.open(parameters[, function(error, result){}]); 以下はその説明です。 • parameters.path — ターゲット Caché インストールの mgr ディレクトリのパス。 • parameters.username — アクセスするためのユーザ名。 • parameters.password — アクセスするためのパスワード。 • parameters.namespace — ターゲット Caché ネームスペース。 以下はその例です。 mydata.open( { path:"/cache20102/mgr", username: "_SYSTEM", password: "SYS", namespace: "USER" }, function(error, result){} ); 10 Caché での Node.js の使用法 retrieve() および update() を使用した高度なデータ・アクセス データベースを閉じる 以下のメソッドは、事前に開いたデータベースを正常に閉じます。 mydata.close([function(error, result){}]); 3.5 retrieve() および update() を使用した高度なデータ・アクセス このセクションでは、高度なメソッドについて説明します。これらのメソッドは、そのメソッドを使用しない場合は基本的な NoSQL スタイルのメソッドをいくつか組み合わせることで実行できる処理を実行します。 以下の項目について説明します。 • retrieve() の使用 — 複数のグループのグローバル・ノードを単一 JSON オブジェクトとして取得する方法について説 明します。 • update() の使用 — 単一 JSON オブジェクトを書き込み、複数のグループのグローバル・ノードを更新する方法につ いて説明します。 以下の Caché データを使用して、高レベルのメソッドについて説明します。 ^Customer(1)="Chris Munt" ^Customer(1, "Address", 1)="London" ^Customer(1, "Address", 2)="UK" ^Customer(1, "DateOfRegistration")="1 May 2010" ^Customer(2)="Rob Tweed" ^Customer(2, "Address", 1)="Reigate" ^Customer(2, "Address", 2)="UK" ^Customer(2, "DateOfRegistration")="7 May 2010" ^Customer(3)="Jane Smith" ^Customer(3, "Address", 1)="Oxford" ^Customer(3, "Address", 2)="UK" ^Customer(3, "DateOfRegistration")="9 June 2010" 3.5.1 retrieve() の使用 以下の項目について説明します。 • グローバル・ノードのリストの取得 (retrieve("list")) • グローバル・ノードのリストの再帰的取得 (retrieve("array")) • 構造化されたデータ・オブジェクトの取得 (retrieve("object")) • 取得処理によって返されるデータ量の制御 3.5.1.1 グローバル・ノードのリストの取得 (retrieve("list")) このメソッドは、グローバル内の指定したレベルの直下に定義されている添え字値のリストを返します。 例 1 : 顧客番号のリストを取得します。 mydata.retrieve( {global: "Customer"}, "list", function(error, result) { // callback code } ); 結果 : 以下の 3 つの顧客レコードです。 [1, 2, 3] Caché での Node.js の使用法 11 Node.js から Caché へのアクセス 例 2 : 特定の顧客の住所の行のリストを取得します。 mydata.retrieve( {global: "Customer", subscripts: [1, "address"]}, "list", function(error, result) { // callback code } ); 結果 : 以下の顧客番号 1 の住所の 2 つの行です。 [1, 2] 3.5.1.2 グローバル・ノードのリストの再帰的取得 (retrieve("array")) このメソッドは、グローバル内の指定したレベルの下に定義されている添え字値のリストをそれらに関連付けられたデー タ値と共に返します。このメソッドは再帰的であり、選択したレベルの下に定義されているすべてのグローバル・ノードを 取得します。 この結果は、複数のグローバル・ノードからなる 1 つの配列として表され、各グローバル・ノードは単一の JSON オブジェ クトとして表されます。 例 1 : 1 人の顧客のすべてのデータを取得します。 mydata.retrieve( {global: "Customer", subscripts: [1]}, "array", function(error, result) { // callback code } ); 結果 : [ { global: "Customer", subscripts: [1], data: "Chris Munt" } { global: "Customer", subscripts: [1, "Address", 1], data: "London" } { global: "Customer", subscripts: [1, "Address", 2], data: "UK" } { global: "Customer", subscripts: [1, "DateOfRegistration], data: "1 May 2010" } ] 3.5.1.3 構造化されたデータ・オブジェクトの取得 (retrieve("object")) このメソッドは、グローバル内の指定したレベルの下に定義されている構造化されたデータ・オブジェクトを取得します。 このメソッドは、前述のグローバル・ノードからなる配列の代わりとなる構造化データを提供します。 この結果は、単一 JSON オブジェクトとして表されます。 例 : 1 人の顧客のすべてのデータを取得します。 以下の構造化された Caché グローバルを考えてみます。 ^Customer(1, ^Customer(1, ^Customer(1, ^Customer(1, "Name")="Chris Munt" "Address", 1)="London" "Address", 2)="UK" "DateOfRegistration")="1 May 2010" 12 Caché での Node.js の使用法 retrieve() および update() を使用した高度なデータ・アクセス Node.js で以下のように記述します。 mydata.retrieve( {global: "Customer", subscripts: [1]}, "object", function(error, result) { // callback code } ); 結果 : { node: { global: "Customer", subscripts: [1] } object: { Name: "Chris Munt", Address: {"1": "London", "2": "UK"}, DateOfRegistration: "1 May 2010" } } 3.5.1.4 取得処理によって返されるデータ量の制御 取得処理は、基盤となるグローバル構造に応じて、Node.js 環境に膨大な量のデータを返すことができます。以下のプ ロパティをリクエスト側の JSON オブジェクト (つまり、ルート・グローバル・ノードを定義するオブジェクト) に追加すると、 返されるデータ量を制限できます。 • max — 返されるグローバル・ノードの最大数。 • lo — 返される最も小さいグローバル添え字。 • hi — 返される最も大きいグローバル添え字。 3 つすべてのプロパティが定義されている場合、hi に達していなくても max 数のグローバル・ノードが返されたときに取 得処理が終了します。 以下の Caché グローバルを考えてみます。 ^Customer(1, "Address", 1)="London" ^Customer(1, "Address", 2)="UK" ^Customer(1, "DateOfRegistration")="1 May 2010" ^Customer(1, "Name")="Chris Munt" ^Customer(1, "Orders", 20100501, "Reference")="Order001" ^Customer(1, "Orders", 20100503, "Reference")="Order002" ^Customer(1, "Orders", 20100507, "Reference")="Order003" ^Customer(1, "Orders", 20100509, "Reference")="Order004" ^Customer(1, "Orders", 20100510, "Reference")="Order005" ^Customer(1, "Orders", 20100520, "Reference")="Order006" ^Customer(1, "Orders", 20100527, "Reference")="Order007" ^Customer(1, "Orders", 20100906, "Reference")="Order008" ^Customer(1, "Orders", 20110104, "Reference")="Order011" ^Customer(1, "Orders", 20110203, "Reference")="Order012" ^Customer(2, "Address", 1)="Reigate" ^Customer(2, "Address", 2)="UK" ^Customer(2, "DateOfRegistration")="7 May 2010" ^Customer(2, "Name")="Rob Tweed" ^Customer(2, "Orders", 20101204, "Reference")="Order009" ^Customer(2, "Orders", 20101206, "Reference")="Order010" ^Customer(3, "Address", 1)="Oxford" ^Customer(3, "Address", 2)="UK" ^Customer(3, "DateOfRegistration")="9 June 2010" ^Customer(3, "Name")="Jane Smith" ^Customer(4, "Name")="Jim Cooper" ^Customer(5, "Name")="Eve Simpson" ^Customer(6, "Name")="John Cotton" ^Customer(7, "Name")="Alison Clarke" ^Customer(8, "Name")="Paul Francis" ^Customer(9, "Name")="Susan Reed" ^Customer(10, "Name")="Mary Dodds" 注釈 "Orders" セクションの 3 番目の添え字は YYYYMMDD 形式の日付です。 Caché での Node.js の使用法 13 Node.js から Caché へのアクセス 以下の例は、max、lo、および hi プロパティの使用法を示しています。 例 1 : 登録されている顧客番号を 2 から 7 まで (両端を含む) リストします。 mydata.retrieve( {global: "Customer", lo: 2, hi: 7}, "list", function(error, result) { // callback code } ); 結果 : 以下の 6 つの顧客レコードです。 [2, 3, 4, 5, 6, 7] 例 2 : 2010 年 5 月 7 日から 2010 年 12 月 24 日 まで (両端を含む) に顧客番号 1 から出された注文をリストします。 mydata.retrieve( { global: "Customer", subscripts [1, "Orders"], lo: 20100507, hi: 20101224 }, "list", function(error, result) { // callback code } ); 結果 : 以下の 6 つの顧客注文レコードです。 [20100507, 20100509, 20100510, 20100520, 20100527, 20100906] 例 3 : 2010 年 9 月に顧客番号 1 によって出された注文の完全な詳細をリストします。 mydata.retrieve( { global: "Customer", subscripts [1, "Orders"], lo: 20100901, hi: 20100930 }, "array", function(error, result) { // callback code } ); 結果 : 以下の 1 つの顧客注文レコードです。 [{ global: "Customer", subscripts: [1, "Orders", 20100906, "Reference"], data: "Order008" }] 例 4 : データベースに (顧客番号別に) 登録されている最初の 3 人の顧客をリストします。 mydata.retrieve( {global: "Customer", max: 3}, "list", function(error, result) { // callback code } ); 結果 : 以下の 3 つの顧客レコードです。 [1, 2, 3] 14 Caché での Node.js の使用法 retrieve() および update() を使用した高度なデータ・アクセス 3.5.2 update() の使用 update() メソッドは、アプリケーションで、単一の JSON オブジェクトに保存されている情報を渡すことで、1 つのグルー プのグローバル・ノードを保存することを可能にします。ノードは、配列とオブジェクトのいずれでも表すことができます。 • グローバル・ノードのリストの保存 (update("array")) • 構造化されたデータ・オブジェクトの保存 (update("object")) 3.5.2.1 グローバル・ノードのリストの保存 (update("array")) このメソッドは、retrieve メソッドによって実行されるタスクとは逆のタスクを実行します。つまり、update メソッドは、グロー バル・ノード (それぞれが単一 JSON オブジェクトとして表されている) からなる 1 つの配列を取り、それらを Caché デー タベースに戻して書き込みます。 例 1 : 1 人の顧客のレコードを作成または更新します。 mydata.update( [ { global: "Customer", subscripts: [1], data: "Chris Munt" } { global: "Customer", subscripts: [1, "Address", 1], data: "London" } { global: "Customer", subscripts: [1, "Address", 2], data: "UK" } { global: "Customer", subscripts: [1, "DateOfRegistration"], data: "1 May 2010" } ], "array", function(error, result) { // callback code } ); 結果 : エラーが報告されない場合、処理は成功です。 3.5.2.2 構造化されたデータ・オブジェクトの保存 (update("object")) このメソッドは、retrieve メソッドによって実行されるタスクとは逆のタスクを実行します。つまり、構造化された JSON オブ ジェクトの内容を Caché データベースに戻して書き込みます。 例 1 : 1 人の顧客のレコードを作成または更新します。 mydata.update( { node: { global: "Customer", subscripts: [1] }, Object: { Name: "Chris Munt", DateOfRegistration: "1 May 2010", Address: {"1": "London", "2": "UK"} } }, "object", function(error, result) { // callback code } ); Caché での Node.js の使用法 15 Node.js から Caché へのアクセス 結果 : エラーが報告されない場合、処理は成功です。成功した場合、この例では以下の一連のグローバル・ノードが 作成されます。 ^Customer(1, ^Customer(1, ^Customer(1, ^Customer(1, "Address", 1)="London" "Address", 2)="UK" "DateOfRegistration")="1 May 2010" "Name")="Chris Munt" 3.6 オブジェクト指向の開発手法に向けて ここまでに示した例では、Caché データベースを、単なる NoSQL エンジンとして使用する方法を示しました。以下のコー ドは、JavaScript で JSON 表記法と共に cache.node メソッドを使用して、よりオブジェクト指向な開発手法を作成する方 法を示します。 var globals = require('cache'); var user = new globals.Cache(); user.open({ path:"/cache20102/mgr", username: "_SYSTEM", password: "SYS", namespace: "USER" }); var customers = new Customers(); var customer = customers.getCustomer(1); console.log("customer number 1 is " + customer.data); customers.setCustomer(9, "Tom Smith"); user.close(); function Customers() { this.global = "Customer"; this.subscripts = new Array(); this.getCustomer = function(id) { this.subscripts[0] = id; var person = user.get(this); return person; } this.setCustomer = function(id, name) { this.subscripts[0] = id; this.data = name; var person = user.set(this); return; } } 16 Caché での Node.js の使用法 4 cache.node メソッドのリファレンス このセクションでは、Caché cache.node モジュールによってサポートされている各関数の詳細なドキュメントを提供しま す。このセクションの例の多くで使用されるデータ・セットのリストについては、“サンプル・データ” セクションを参照して ください。 以下の関数がサポートされています。 • about() — "version()" を参照してください。 • close() — 事前に開いたデータベースを閉じます。 • data() — グローバル・ノードの存在についてテストします。 • function() — Caché 関数を呼び出します。 • get() — グローバル・ノードを取得します。 • global_directory() — Caché データベースに格納されているグローバルのリストを返します。 • increment() — グローバル・ノードの整数値に 1 を加算します。 • kill() — グローバル・ノードを削除します。 • lock() — 排他的に使用するためにグローバル・ノードをロックします。 • merge() — グローバルのすべてまたは一部を別のグローバルにコピーします。 • next() — 現在のレベルの次のグローバル添え字を取得します。 • next_node() — レベルに関係なく、照合順の次のグローバル・ノードを取得します。 • open() — 指定した Caché データベースを開きます。 • order() — "next()" を参照してください。 • previous() — 現在のレベルの前のグローバル添え字を取得します。 • previous_node() — レベルに関係なく、照合順の前のグローバル・ノードを取得します。 • retrieve() — 指定したレベルより下で定義されているすべてのグローバル・ノードを再帰的に取得します。 • set() — グローバル・ノードの値を設定します。 • update() — JSON オブジェクトの内容を Caché データベースに書き込みます。 • unlock() — プログラムによって事前にロックされたグローバル・ノードをロック解除します。 • version() — 使用している cache.node モジュールおよびそれに関連する Caché データベース (開いている場合) に 関する基本的なバージョン情報を返します。 Caché での Node.js の使用法 17 cache.node メソッドのリファレンス 4.1 サンプル・データ このリファレンス・セクションの大部分のサンプルは、以下の単純な Caché データ・セットを基にしています。 ^Customer(1)="Chris Munt" ^Customer(1, "address")="Banstead" ^Customer(2)="Rob Tweed" ^Customer(3)="Jane Smith" 以下の Caché データを使用して、retrieve() および update() メソッドについて説明します。 ^Customer(1)="Chris Munt" ^Customer(1, "Address", 1)="London" ^Customer(1, "Address", 2)="UK" ^Customer(1, "DateOfRegistration")="1 May 2010" ^Customer(2)="Rob Tweed" ^Customer(2, "Address", 1)="Reigate" ^Customer(2, "Address", 2)="UK" ^Customer(2, "DateOfRegistration")="7 May 2010" ^Customer(3)="Jane Smith" ^Customer(3, "Address", 1)="Oxford" ^Customer(3, "Address", 2)="UK" ^Customer(3, "DateOfRegistration")="9 June 2010" 4.2 close() close() メソッドは、事前に開いたデータベースを正常に閉じます。データベースを開くまたは閉じる方法の詳しい説明 は、“Caché データベースを開くおよび閉じる” を参照してください。 同期 mydata.close(); 非同期 mydata.close(callback_function); パラメータ • callback_function — function(error, result){} の形式の関数。結果を非同期に返すため に使用されます (“同期 cache.node メソッドと非同期 cache.node メソッド” を参照してください)。 例 mydata.close( function(error, result) { // callback code } ); 4.3 data() data() メソッドは、グローバル・ノードの存在についてテストします。 このメソッドは、以下の数値のいずれかを返します。 • 0 — ノードは存在しません。 18 Caché での Node.js の使用法 function() • 1 — ノードにデータはありますが、サブノードはありません。 • 10 — ノードにデータはありませんが、サブノードがあります。 • 11 — ノードにデータがあり、サブノードがあります。 同期 var result = mydata.data(node); 非同期 mydata.data(node, callback_function); パラメータ • node — アクセスされるグローバル・ノード。 • callback_function — function(error, result){} の形式の関数。結果を非同期に返すため に使用されます (“同期 cache.node メソッドと非同期 cache.node メソッド” を参照してください)。 例 mydata.data( {global: "Customer", subscripts: [1]}, function(error, result) { // callback code } ); 結果 : {defined: 11} 4.4 function() function() メソッドは、Caché 関数を直接呼び出す手段を提供します。 同期 var result = mydata.function( Cache_Function_Name, Arguments ... ); 非同期 var result = mydata.function( { Cache_Function_Name, Arguments ... }, callback_function ); パラメータ • Cache_Function_Name • • callback_function — function(error, result){} の形式の関数。結果を非同期に返すため に使用されます (“同期 cache.node メソッドと非同期 cache.node メソッド” を参照してください)。 Caché での Node.js の使用法 19 cache.node メソッドのリファレンス 以下の例は、以下の Caché 関数の呼び出しを基にしています。 Math Add(X,Y) Multiply(X,Y) ; Math Functions ; ; Add two numbers Quit (X * Y) ; ; Add two numbers Quit (X * Y) ; これは、基本的な算術関数 ("Add" および "Multiply") を実行する関数を含む "Math" と呼ばれる単純な Caché 'routine' ファイルです。 例 1 (同期/非 JSON) result = mydata.function("Add^Math", 3, 4); 結果 : 7 例 2 (同期/JSON) result = mydata.function({function: "Add^Math", arguments: [3, 4]}); 結果 : { "function": "Add^Math", "arguments": [3, 4], "result": 7 } 例 3 (非同期/JSON) mydata.function( {function: "Add^Math", arguments: [3, 4]}, function(error, result) { // callback code } ); 結果 : { "ok": 1, "function": " Add^Math ", "arguments": [3, 4], "result": 7 } 4.5 get() get() メソッドは、グローバル・ノードを取得します。 同期 var result = mydata.get(node); 非同期 mydata.get(node, callback_function); 20 Caché での Node.js の使用法 global_directory() パラメータ • node — アクセスされるグローバル・ノード。 • callback_function — function(error, result){} の形式の関数。結果を非同期に返すため に使用されます (“同期 cache.node メソッドと非同期 cache.node メソッド” を参照してください)。 例 1 (同期) result = mydata.get({global: "Customer", subscripts: [9]}); 結果 : {global: "Customer", subscripts: [9], data: "", defined: 0} 例 2 (非同期) mydata.get( {global: "Customer", subscripts: [1]}, function(error, result) { // callback code } ); 結果 : {global: "Customer", subscripts: [1], data: "Chris Munt", defined: 1} 'defined' プロパティはグローバル・ノードが実際に定義されている場合は 1 に、定義されていない場合は 0 に 設定されることに注意してください。 4.6 global_directory() global_directory() メソッドは、ディレクトリに格納されているグローバルのリストを返します。返される名前の数は、範囲を 限定するプロパティ ‘lo’、‘hi’、および ‘max’ を使用して制御できます (“取得処理によって返されるデータ量の制御” を参照してください)。 同期 var result = mydata.global_directory(range); 非同期 mydata.global_directory (range, callback_function); パラメータ • range • callback_function — function(error, result){} の形式の関数。結果を非同期に返すため に使用されます (“同期 cache.node メソッドと非同期 cache.node メソッド” を参照してください)。 例 1 : ディレクトリに格納されているすべてのグローバルのリストの取得 mydata.global_directory( {}, function(error, result) { // callback code } ); 結果 : Caché での Node.js の使用法 21 cache.node メソッドのリファレンス 成功した場合は、見つかったグローバル名すべてが格納された配列が返されます。 例 2 : "Cust" で始まる名前を持つグローバルすべてのリストの取得 mydata. global_directory( {lo: "Cust", hi: "Cust~"}, function(error, result) { // callback code } ); 結果 : 成功した場合は、"Cust" で始まるグローバル名すべてが格納された配列が返されます。 4.7 increment() increment() メソッドは、グローバル・ノードの整数値に 1 を加算します。 このメソッドは、ロックを使用することなく、プロセスに (インクリメントした) 整数を一意に割り当てる効率的な手段を提供し ます。呼び出されると、グローバルに保持されている整数値がインクリメントされ、新しい値が呼び出し元プログラムに返 されます。Caché では、この関数に同時にアクセスしている可能性がある複数のプロセスに一意の番号が必ず割り当て られます。 同期 var result = mydata.increment(node); 非同期 mydata.increment (node, callback_function); パラメータ • node — インクリメントされる値を保持するグローバル・ノード。 • callback_function — function(error, result){} の形式の関数。結果を非同期に返すため に使用されます (“同期 cache.node メソッドと非同期 cache.node メソッド” を参照してください)。 例 mydata.increment( {global: "Counter"}, function(error, result) { // callback code } ); 結果 : 成功した場合は、グローバル "Counter" に保持されている整数値がインクリメントされ、結果として新しい値が 返されます。 4.8 kill() kill() メソッドは、グローバル・ノードを削除します。 同期 var result = mydata.kill(node); 22 Caché での Node.js の使用法 lock() 非同期 mydata.kill(node, callback_function); パラメータ • node — アクセスされるグローバル・ノード。 • callback_function — function(error, result){} の形式の関数。結果を非同期に返すため に使用されます (“同期 cache.node メソッドと非同期 cache.node メソッド” を参照してください)。 例 mydata.kill( {global: "Customer", subscripts: [1]}, function(error, result) { // callback code } ); 結果 : エラーが報告されない場合、処理は成功です。 4.9 lock() lock() メソッドは、プログラムが排他的に使用するためにグローバル・ノードをロックします。このメソッドは、グローバル全 体 (例えば ^Customer) をロックすることも、グローバルのサブセクション (例えば ^Customer(1)) をロックすることもできま す。 デッドロックの状況を回避するために、コードでロックしたグローバル・ノードはすべてプログラムの終了前にロック解除し てください ("unlock()" を参照してください)。 同期 var result = mydata.lock(node); 非同期 mydata.lock(node, callback_function); パラメータ • node — アクセスされるグローバル・ノード。 • callback_function — function(error, result){} の形式の関数。結果を非同期に返すため に使用されます (“同期 cache.node メソッドと非同期 cache.node メソッド” を参照してください)。 例 mydata.lock( {global: "Customer", subscripts: [1]}, function(error, result) { // callback code } ); 結果 : エラーが報告されない場合、処理は成功です。 Caché での Node.js の使用法 23 cache.node メソッドのリファレンス 4.10 merge() merge メソッドは、グローバルのすべてまたは一部を別のグローバルにコピーします。 同期 var result = mydata.merge(to: {destination_node}, from: {source_node}}; 非同期 mydata.merge({to: {destination_node}, from: {source_node}}, callback_function); パラメータ • source_node • destination_node • callback_function — function(error, result){} の形式の関数。結果を非同期に返すため に使用されます (“同期 cache.node メソッドと非同期 cache.node メソッド” を参照してください)。 例 1 : グローバル全体のコピー mydata.get( {to: {global: "CopyOfCustomer"}, from: {global: "Customer"}}, function(error, result) { // callback code } ); 結果 : 成功した場合、グローバル "Customer" 全体が "CopyOfCustomer" にコピーされます。 例 2 : グローバルのセクションのコピー mydata.get( {to: {global: "Customer", subscripts: [7, "address"]}, from: {global: "Customer", subscripts: [1, "address"]}}, function(error, result) { // callback code } ); 結果 : 成功した場合、"Customer(1,’address’)" の下に含まれるグローバルのサブセクションが "Customer(7,’address’)" にコピーされます。 4.11 next() または order() next() メソッドは、次のグローバル添え字を取得します。 特定のレベルの添え字の照合順で次の値を取得します。 同期 var result = mydata.order(node); 24 Caché での Node.js の使用法 next_node() 非同期 mydata.order(node, callback_function); パラメータ • node — アクセスされるグローバル・ノード。 • callback_function — function(error, result){} の形式の関数。結果を非同期に返すため に使用されます (“同期 cache.node メソッドと非同期 cache.node メソッド” を参照してください)。 例 1 (同期) result = mydata.order({global: "Customer", subscripts: [""]}, 結果 : {global: "Customer", subscripts: [1], result: "1"}} 例 2 (同期) result = mydata.next({global: "Customer", subscripts: [3]}, 結果 : {global: "Customer", subscripts: [""], result: ""}} 例 3 (非同期) mydata.next( {global: "Customer", subscripts: [1]}, function(error, result) { // callback code } ); 結果 : {global: "Customer", subscripts: [2], result: "2"}} 例 4 (最初のレベルでの解析) key = {global: "Customer", subscripts: [""]}; while ((key = user.next(key)).result != "") { console.log(JSON.stringify(key, null, '\t')) } 結果 : {global: "Customer", subscripts: [1], result: "1"}} {global: "Customer", subscripts: [2], result: "2"}} {global: "Customer", subscripts: [3], result: "3"}} その順序に定義されている添え字がそれ以上ない場合、結果のプロパティは空の文字列 ("") として返されま す。 4.12 next_node() next_node() メソッドは、添え字のレベルに関係なく、照合順の次のグローバル・ノードを取得します。 同期 var result = mydata.next_node(node); Caché での Node.js の使用法 25 cache.node メソッドのリファレンス 非同期 mydata.next_node(node, callback_function); パラメータ • node — アクセスされるグローバル・ノード。 • callback_function — function(error, result){} の形式の関数。結果を非同期に返すため に使用されます (“同期 cache.node メソッドと非同期 cache.node メソッド” を参照してください)。 例 1 (同期) result = mydata.next_node({global: "Customer"}, 結果 : {global: "Customer", subscripts: [1], data: "Chris Munt, defined: 1}} 例 2 (同期) result = mydata.next_node({global: "Customer", subscripts: [3]}, 結果 : {global: "Customer", defined: 0}} 例 3 (非同期) mydata.next_node( {global: "Customer", subscripts: [1]}, function(error, result) { // callback code } ); 結果 : { global: "Customer", subscripts: [1, "address"], data: "Banstead", defined: 1 } 例 4 (グローバルの解析) key = {global: "Customer"}; while ((key = user.next_node(key)).defined) { console.log(JSON.stringify(key, null, '\t')); } 結果 : { global: "Customer", subscripts: [1], data: "Chris Munt", defined: 1 } { global: "Customer", subscripts: [1, "address"], data: "Banstead", defined: 1 } { global: "Customer", subscripts: [2], data: "Rob Tweed", defined: 1 } { 26 Caché での Node.js の使用法 open() global: "Customer", subscripts: [3], data: "Jane Smith", defined: 1 } その順序に定義されているノードがそれ以上ない場合、定義されているプロパティはゼロに設定されます。 4.13 open() open() メソッドは、指定した Caché データベースを開きます。データベースを開くまたは閉じる方法の詳しい説明は、 “Caché データベースを開くおよび閉じる” を参照してください。 同期 mydata.open(parameters); 非同期 mydata.open(parameters, callback_function); パラメータ • • parameters — 次のように、開く Caché データベースを指定します。 – parameters.path — ターゲット Caché インストールの ‘mgr’ ディレクトリのパス。 – parameters.username — アクセスするためのユーザ名。 – parameters.password — アクセスするためのパスワード。 – parameters.namespace — ターゲット Caché ネームスペース。 callback_function — function(error, result){} の形式の関数。結果を非同期に返すため に使用されます (“同期 cache.node メソッドと非同期 cache.node メソッド” を参照してください)。 例 mydata.open( { path:"/cache20102/mgr", username: "_SYSTEM", password: "SYS", namespace: "USER" }, function(error, result) { // callback code } ); 結果 : エラーが報告されない場合、処理は成功です。 4.14 previous() previous() メソッドは、前のグローバル添え字を取得します。 特定のレベルの添え字の照合順で前の値を取得します。 Caché での Node.js の使用法 27 cache.node メソッドのリファレンス 同期 var result = mydata.previous(node); 非同期 mydata.previous(node, callback_function); パラメータ • node — アクセスされるグローバル・ノード。 • callback_function — function(error, result){} の形式の関数。結果を非同期に返すため に使用されます (“同期 cache.node メソッドと非同期 cache.node メソッド” を参照してください)。 例 1 (同期) result = mydata.previous({global: "Customer", subscripts: [""]}, 結果 : {global: "Customer", subscripts: [3], result: "3"}} 例 2 (同期) result = mydata.previous({global: "Customer", subscripts: [2]}, 結果 : {global: "Customer", subscripts: ["1"], result: "1"}} 例 3 (非同期) mydata.previous( {global: "Customer", subscripts: [1]}, function(error, result) { // callback code } ); 結果 : {global: "Customer", subscripts: [""], result: ""}} 例 4 (最初のレベルでの解析) key = {global: "Customer", subscripts: [""]}; while ((key = user.previous(key)).result != "") { console.log(JSON.stringify(key, null, '\t')) } 結果 : {global: "Customer", subscripts: [3], result: "3"}} {global: "Customer", subscripts: [2], result: "2"}} {global: "Customer", subscripts: [1], result: "1"}} その順序に定義されている添え字がそれ以上ない場合、結果のプロパティは空の文字列 ("") として返されま す。 4.15 previous_node() previous_node() メソッドは、前のグローバル・ノードを取得します。 28 Caché での Node.js の使用法 previous_node() 添え字のレベルに関係なく、照合順の前のグローバル・ノード全部を取得します。 同期 var result = mydata.previous(node); 非同期 mydata.previous(node, callback_function); パラメータ • node — アクセスされるグローバル・ノード。 • callback_function — function(error, result){} の形式の関数。結果を非同期に返すため に使用されます (“同期 cache.node メソッドと非同期 cache.node メソッド” を参照してください)。 例 1 (同期) result = mydata.previous_node({global: "Customer", subscripts: ["z"]}, 結果 : {global: "Customer", subscripts: [3], data: "Jane Smith", defined: 1}} 例 2 (同期) result = mydata.next_node({global: "Customer", subscripts: [2]}, 結果 : { global: "Customer", subscripts: [1, "address"], data: "Banstead", defined: 1 } 例 3 (非同期) mydata.previous_node( {global: "Customer", subscripts: [1]}, function(error, result) { // callback code } ); 結果 : {global: "Customer", defined: 0}} 例 4 (グローバルの解析) key = {global: "Customer", subscripts: ["z"]}; while ((key = user.previous_node(key)).defined) { console.log(JSON.stringify(key, null, '\t')); } 結果 : { global: "Customer", subscripts: [3], data: "Jane Smith", defined: 1 } { global: "Customer", subscripts: [2], data: "Rob Tweed", Caché での Node.js の使用法 29 cache.node メソッドのリファレンス defined: 1 } { global: "Customer", subscripts: [1, "address"], data: "Banstead", defined: 1 } { global: "Customer", subscripts: [1], data: "Chris Munt", defined: 1 } その順序に定義されているノードがそれ以上ない場合、定義されているプロパティはゼロに設定されます。 4.16 retrieve() • retrieve(node, "list") メソッドは、グローバル内の指定したレベルの直下に定義されている添え字値のリス トを返します。 • retrieve(node, "array") メソッドは、グローバル内の指定したレベルの下に定義されている添え字値のリス トをそれらに関連付けられたデータ値と共に返します。このメソッドは再帰的であり、選択したレベルの下に定義され ているすべてのグローバル・ノードを取得します。 この結果は、各グローバル・ノードが単一の JSON オブジェクトとして表された、複数のグローバル・ノードからなる 1 つの配列として表されます。 • retrieve(node, "object") メソッドは、グローバル内の指定したレベルの下に定義されている構造化された データ・オブジェクトを取得します。このメソッドは、グローバル・ノードからなる配列の代わりとなる構造化データを提 供します。 この結果は、単一 JSON オブジェクトとして表されます。 同期 var result = mydata.retrieve(node, type); 非同期 mydata.retrieve(node, type, callback_function); パラメータ • node — アクセスされるグローバル・ノード。 • type — アクセスされるデータのタイプを指定するリテラル文字列。オプションは以下のとおりです。 • – "list" – "array" – "object" callback_function — function(error, result){} の形式の関数。結果を非同期に返すため に使用されます (“同期 cache.node メソッドと非同期 cache.node メソッド” を参照してください)。 30 Caché での Node.js の使用法 retrieve() 例 1 (type = “list”) : 顧客番号のリストの取得 mydata.retrieve( {global: "Customer"}, "list", function(error, result) { // callback code } ); 結果 : 以下の 3 つの顧客レコードです。 [1, 2, 3] 例 2 (type = “list”) : 特定の顧客の住所の行のリストの取得 mydata.retrieve( {global: "Customer", subscripts: [1, "address"]}, "list", function(error, result) { // callback code } ); 結果 : 以下の顧客番号 1 の住所の 2 つの行です。 [1, 2] 例 3 (type = “array”) : 1 人の顧客のすべてのデータの取得 mydata.retrieve( {global: "Customer", subscripts: [1]}, "array", function(error, result) { // callback code } ); 結果 : [ { } { } { } { global: "Customer", subscripts: [1], data: "Chris Munt" global: "Customer", subscripts: [1, "Address", 1], data: "London" global: "Customer", subscripts: [1, "Address", 2], data: "UK" global: "Customer", subscripts: [1, "DateOfRegistration], data: "1 May 2010" } ] 例 4 (type = “object”) : 1 人の顧客のすべてのデータの取得 以下の構造化された Caché グローバルを考えてみます。 ^Customer(1, ^Customer(1, ^Customer(1, ^Customer(1, "Name")="Chris Munt" "Address", 1)="London" "Address", 2)="UK" "DateOfRegistration")="1 May 2010" Node.js で以下のように記述します。 mydata.retrieve( {global: "Customer", subscripts: [1]}, "object", function(error, result) { // callback code } ); Caché での Node.js の使用法 31 cache.node メソッドのリファレンス 結果 : { node: { global: "Customer", subscripts: [1] } object: { Name: "Chris Munt", Address: {"1": "London", "2": "UK"}, DateOfRegistration: "1 May 2010" } } 4.17 set() set() メソッドは、グローバル・ノードを保存します。 同期 var result = mydata.set(node); 非同期 mydata.set(node, callback_function); パラメータ • node — アクセスされるグローバル・ノード。 • callback_function — function(error, result){} の形式の関数。結果を非同期に返すため に使用されます (“同期 cache.node メソッドと非同期 cache.node メソッド” を参照してください)。 例 mydata.set( {global: "Customer", subscripts: [1], data: "Chris Munt"}, function(error, result) { // callback code } ); 結果 : エラーが報告されない場合、処理は成功です。 4.18 unlock() unlock() メソッドは、 プログラムによって事前にロックされたグローバル・ノードをロック解除します ("lock()" を参照してく ださい)。このメソッドは、グローバル全体 (例えば ^Customer) をロック解除することも、グローバルのサブセクション (例え ば ^Customer(1)) をロック解除することもできます。 プログラムによって保持されているすべてのロックを解放するには、node 引数を指定しないで unlock() メソッドを呼び 出します。Node.js プロセスによって保持されているすべてのロックは、プロセスが正常に終了したときに解放されます。 同期 var result = mydata.unlock(node); var result = mydata.unlock(); 32 Caché での Node.js の使用法 update() 非同期 mydata.unlock(node, callback_function); mydata.unlock(callback_function); パラメータ • node — アクセスされるグローバル・ノード。 • callback_function — function(error, result){} の形式の関数。結果を非同期に返すため に使用されます (“同期 cache.node メソッドと非同期 cache.node メソッド” を参照してください)。 例 1 : 1 つのノードのロック解除 mydata.unlock( {global: "Customer", subscripts: [1]}, function(error, result) { // callback code } ); 結果 : エラーが報告されない場合、処理は成功です。 例 2 : ロックされているすべてのノードのロック解除 mydata.unlock( function(error, result) { // callback code } ); 結果 : エラーが報告されない場合、処理は成功です。 4.19 update() update() メソッドは JSON オブジェクトの内容を Caché データベースに書き込みます。 • update("array") メソッドは、retrieve メソッドによって実行されるタスクとは逆のタスクを実行します。つまり、update メソッドは、グローバル・ノード (それぞれが単一 JSON オブジェクトとして表されている) からなる 1 つの配列を取り、 それらを Caché データベースに戻して書き込みます。 • update("object") メソッドは、retrieve メソッドによって実行されるタスクとは逆のタスクを実行します。つまり、構 造化された JSON オブジェクトの内容を Caché データベースに戻して書き込みます。 同期 var result = mydata.update(node, type); 非同期 mydata.update(node, type, callback_function); パラメータ • node — アクセスされるグローバル・ノード。 • type — アクセスされるデータのタイプを指定するリテラル文字列。オプションは以下のとおりです。 – "array" Caché での Node.js の使用法 33 cache.node メソッドのリファレンス – • "object" callback_function — function(error, result){} の形式の関数。結果を非同期に返すため に使用されます (“同期 cache.node メソッドと非同期 cache.node メソッド” を参照してください)。 例 1 (type = “array”) : 1 人の顧客のレコードの作成または更新 mydata.update( [ { global: "Customer", subscripts: [1], data: "Chris Munt" } { global: "Customer", subscripts: [1, "Address", 1], data: "London" } { global: "Customer", subscripts: [1, "Address", 2], data: "UK" } { global: "Customer", subscripts: [1, "DateOfRegistration"], data: "1 May 2010" } ], "array", function(error, result) { // callback code } ); 結果 : エラーが報告されない場合、処理は成功です。 例 2 (type = “object”) : 1 人の顧客のレコードの作成または更新 mydata.update( node: { global: "Customer", subscripts: [1] }, Object: { Name: "Chris Munt", DateOfRegistration: "1 May 2010", Address: {"1": "London", "2": "UK"} }, "object", function(error, result) { // callback code } ); 結果 : エラーが報告されない場合、処理は成功です。成功した場合、この例では以下の一連のグローバル・ノードが 作成されます。 ^Customer(1, ^Customer(1, ^Customer(1, ^Customer(1, "Address", 1)="London" "Address", 2)="UK" "DateOfRegistration")="1 May 2010" "Name")="Chris Munt" 4.20 version() と about() version() および about() メソッドは、使用している cache.node モジュールおよびそれに関連する Caché データベース (開いている場合) に関する基本的なバージョン情報を返します。 34 Caché での Node.js の使用法 version() と about() 同期 var result = mydata.version(); var result = mydata.about(); 非同期 mydata.version(callback_function); mydata.about(callback_function); パラメータ • callback_function — function(error, result){} の形式の関数。結果を非同期に返すため に使用されます (“同期 cache.node メソッドと非同期 cache.node メソッド” を参照してください)。 例 mydata.version( function(error, result) { // callback code } ); 結果 : Caché データベースが開いていない場合 : Node.js Adaptor for Cache: Version: 1.0.17 (CM) Caché データベースが開いている場合 : Node.js Adaptor for Cache: Version: 1.0.17 (CM); Caché Version: 2012 build 100 Caché での Node.js の使用法 35 A ソースからの cache.node のビルド 以下の開発ツールをインストールする必要があります。 • C および C++ のビルド環境 • Ubuntu の場合 : – sudo apt-get install gcc – sudo apt-get install g++ ソースから cache.node モジュールをビルドする方法は、以下の 2 つがあります。 • Node.js ビルド・プロシージャを使用 — Node.js コミュニティによって提供されているスクリプトを使用します。 • ソースから直接ビルド — C++ ソース (cache.cpp) から直接ビルドします。 A.1 Node.js ビルド・プロシージャを使用 cache.node モジュールは、Node.js グループによって提供されている node-waf スクリプトを使用してビルドします。 wscript という名前のファイルに含まれている命令に従って、node-waf スクリプトによって cache.node モジュールがビル ドされます。 .../build/default/ A.1.1 ビルド・スクリプト (wscript) の作成 提供されているスクリプトは、以下のとおりです。 def set_options(opt): opt.tool_options("compiler_cxx") def configure(conf): conf.check_tool("compiler_cxx") conf.check_tool("node_addon") def build(bld): obj = bld.new_task_gen("cxx", "shlib", "node_addon") obj.cxxflags = ["-g", "-D_FILE_OFFSET_BITS=64", "-D_LARGEFILE_SOURCE", "-Wall", "-I/cache20102/dev/cpp/include"] obj.linkflags = ["-Wl", "-lpthread", "-lrt", "-ldl", "-lc", "-lm"] obj.target = "cache" obj.source = "cache.cpp" Caché での Node.js の使用法 37 ソースからの cache.node のビルド このテキスト・ファイルを作成し、使用している環境に合わせてそれを変更します。ローカル環境に合わせるために変更 する必要があるパスは 1 つのみです。 • 以下のコンパイラ・オプションの行 (obj.cxxflags) です。 "-I/cache20102/dev/cpp/include" これは、Caché C ヘッダ・ファイル (例えば callin.h) が配置されているディレクトリにする必要があります。 A.1.2 cache.node モジュールのビルド 前に作成した wscript ファイルとソース・コード (cache.cpp) の両方を含むディレクトリで、node-waf コマンドを使用して モジュールをビルドします。 node-waf configure build 正常に終了した場合、出力は以下に類似したものになります。 Setting srcdir to : /opt/cm/node042 Setting blddir to : /opt/cm/node042/build Checking for program g++ or c++ : /usr/bin/g++ Checking for program cpp : /usr/bin/cpp Checking for program ar : /usr/bin/ar Checking for program ranlib : /usr/bin/ranlib Checking for g++ : ok Checking for node path : not found Checking for node prefix : ok /opt/cm/node042 'configure' finished successfully (0.974s) Waf: Entering directory `/opt/cm/node042/build' [1/2] cxx: cache.cpp -> build/default/cache_1.o [2/2] cxx_link: build/default/cache_1.o -> build/default/cache.node Waf: Leaving directory `/opt/cm/node042/build' 'build' finished successfully (2.904s) root@ubuntu:/opt/cm/node042# Caché モジュール cache.node が作成されます。 既定では、このモジュールは以下のサブディレクトリに作成されます。 .../build/default/ A.2 ソースからの直接ビルド Node.js グループによって提供されているスクリプト化したインフラストラクチャを使用する代わりに、以下のように C++ ソース・コードから Caché モジュール (cache.node) を直接ビルドできます。 Linux : g++ -c -g -fPIC -DPIC -DEV_MULTIPLICITY=0 –DLINUX \ -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wall \ -I/opt/local/node/include/node -I/cache20102/dev/cpp/include \ -o cache.o cache.cpp g++ -shared -L/opt/local/node/lib -Wl -lpthread -lrt -ldl -lc -lm \ -o cache.node cache.o ローカル環境に合わせるために変更する必要がある 3 つのパスに注意してください。 • Node.js C/C++ ヘッダ・ファイルのパス。以下はその例です。 /opt/local/node/include/node • Caché C/C++ ヘッダ・ファイルのパス。以下はその例です。 38 Caché での Node.js の使用法 ソースからの直接ビルド /cache20102/dev/cpp/include • Node.js ライブラリ・ファイルのパス。以下はその例です。 /opt/local/node/lib Caché での Node.js の使用法 39
© Copyright 2024