13.07.2015 Views

Caché での C++ の使用法

Caché での C++ の使用法

Caché での C++ の使用法

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法Version 2013.12013 年 07 月 02 日InterSystems Corporation 1 Memorial Drive Cambridge MA 02142 www.intersystems.com


<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法<strong>Caché</strong> Version 2013.1 2013 年 07 月 02 日Copyright © 2012 InterSystems CorporationAll rights reserved.このドキュメントは、 Sun Microsystems、RenderX Inc.、 アドビ システムズ および ワールドワイド・ウェブ・コンソーシアム(www.w3c.org)のツールと情 報 を 使 用 して、 Adobe Portable Document Format (PDF)で 作 成 およびフォーマットされました。 主 要 ドキュメント 開 発 ツールは、InterSystemsが 構築 したCacheéと Javaを 使 用 した 特 別 目 的 のXML 処 理 アプリケーションです。, ,<strong>Caché</strong> WEBLINK, Distributed Cache Protocol, M/SQL, M/NET および M/PACT は 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-9391support@InterSystems.com


目 次このドキュメントについて ................................................................................................... 11 <strong>Caché</strong> <strong>C++</strong> バインディング .............................................................................................. 31.1 <strong>C++</strong> バインディング・アーキテクチャ ........................................................................ 41.1.1 <strong>Caché</strong> <strong>C++</strong> ライブラリ .................................................................................... 51.2 インストールと 構 成 ............................................................................................... 61.2.1 ソースからの <strong>Caché</strong> <strong>C++</strong> バインディングの 構 築 ................................................. 61.2.2 Microsoft Visual Studio 2008 の 設 定 .............................................................. 61.2.3 ACE ライブラリを 使 用 した <strong>C++</strong> バインディングの 使 用 法 ..................................... 91.3 Light <strong>C++</strong> バインディングのインストール ................................................................... 91.3.1 LCB の 追 加 要 件 ......................................................................................... 91.3.2 Windows 64 ビット・プラットフォームへのインストール ........................................ 101.3.3 UNIX® <strong>での</strong> 高 信 頼 アプリケーションの 実 行 .................................................... 101.4 サンプル・プログラム ........................................................................................... 112 プロキシ・クラスの 生 成 ................................................................................................. 132.1 概 要 ................................................................................................................. 132.2 標 準 のプロキシ・クラス・メソッド .............................................................................. 132.3 プロキシ・メソッドの 実 装 ....................................................................................... 142.4 プロキシ・プロパティの 実 装 .................................................................................. 152.5 名 前 付 け 規 約 .................................................................................................... 152.6 <strong>C++</strong> ジェネレータの 使 用 法 .................................................................................. 163 <strong>C++</strong> バインディングの 使 用 法 ........................................................................................ 193.1 <strong>C++</strong> バインディングの 基 礎 ................................................................................... 193.1.1 <strong>Caché</strong> データベースへの 接 続 ...................................................................... 203.1.2 <strong>C++</strong> バインディング・アプリケーションのサンプル ............................................. 213.2 プロキシ・オブジェクトの 使 用 法 ............................................................................. 223.2.1 プロキシ・オブジェクトのキャスト .................................................................... 223.2.2 リソースの 管 理 .......................................................................................... 223.3 コレクションの 使 用 法 ........................................................................................... 233.3.1 インタフェース ........................................................................................... 233.3.2 例 ........................................................................................................... 233.3.3 メソッド<strong>での</strong>コレクション 要 素 の 使 用 法 ............................................................ 243.3.4 コレクション・プロキシのデータ ...................................................................... 253.4 ストリームの 使 用 法 ............................................................................................. 253.5 リレーションシップの 使 用 法 .................................................................................. 253.6 クエリの 使 用 法 ................................................................................................... 263.7 トランザクションの 使 用 法 ...................................................................................... 283.7.1 データベース・クラス・メソッドの 使 用 法 ........................................................... 283.7.2 トランザクション・クラス・メソッドの 使 用 法 ......................................................... 294 ダイナミック・バインディング ........................................................................................... 314.1 Dyn_obj プロキシの 構 築 ...................................................................................... 314.2 Dyn_obj メソッドの 呼 び 出 しからの 値 の 構 築 ............................................................. 314.3 プロパティとメソッド ............................................................................................. 325 Light <strong>C++</strong> バインディング ............................................................................................. 355.1 Light <strong>C++</strong> バインディング・アーキテクチャ ............................................................... 365.2 <strong>Caché</strong> <strong>C++</strong> ライブラリの LCB クラス ....................................................................... 37<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法iii


テーブル 一 覧テーブル 2–1: <strong>C++</strong> ジェネレータのパラメータ ..................................................................... 17<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法vii


1<strong>Caché</strong> <strong>C++</strong> バインディング<strong>Caché</strong> <strong>C++</strong> バインディングは、<strong>C++</strong> アプリケーション 内 で <strong>Caché</strong> オブジェクトを 直 接 使 用 する 簡 単 な 方 法 を 提 供 します。以 下 の 方 法 で、<strong>Caché</strong> データベースと 連 動 する <strong>C++</strong> アプリケーションを 生 成 できます。• <strong>Caché</strong> <strong>C++</strong> バインディング<strong>Caché</strong> <strong>C++</strong> バインディングでは、<strong>C++</strong> アプリケーションから <strong>Caché</strong> サーバ 上 のオブジェクトを 操 作 できます。<strong>Caché</strong>クラス・ジェネレータによって、あらゆる <strong>Caché</strong> クラスに 対 する <strong>C++</strong> プロキシ・クラスを 作 成 できます。プロキシ・クラスには、<strong>C++</strong> アプリケーション 内 でコンパイルおよび 使 用 が 可 能 な 標 準 的 な <strong>C++</strong> コードが 含 まれ、 対 応 する <strong>Caché</strong> クラスが 持 つプロパティおよびメソッドへのアクセスを 可 能 にします。<strong>C++</strong> バインディングは、 並 行 処 理 やトランザクション 制 御 に 加 えて、オブジェクト・データベースの 永 続 性 を 完 全 にサポートします。また、 高 度 なデータ・キャッシング・スキーマも 装 備 されており、<strong>Caché</strong> サーバと <strong>C++</strong> アプリケーションが 別 マシンにある 場 合 のネットワーク・トラフィックを 最 小 限 に 抑 えることができます。• ダイナミック・バインディングコンパイル 済 みの <strong>C++</strong> プロキシ・クラスを 使 用 する 代 わりに、 実 行 時 に <strong>Caché</strong> クラスを 動 的 に 操 作 できます。したがって、 汎 用 クラスを 扱 い、 特 定 の <strong>Caché</strong> クラスに 依 存 しないアプリケーションやツールを 記 述 する 際 に 役 立 ちます。• Light <strong>C++</strong> バインディングLight <strong>C++</strong> バインディング (LCB) は、 単 純 なデータを 非 常 に 高 速 にロードすることを 主 な 目 的 とした、<strong>Caché</strong> <strong>C++</strong> ライブラリの 限 定 されたサブセットです。データ 交 換 に TCP/IP ではなくプロセス 間 通 信 を 使 用 し、<strong>C++</strong> アプリケーションのプロセスと <strong>Caché</strong> オブジェクト・サーバのプロセスを 1 つに 結 合 します。オブジェクトの 基 本 的 な 操 作 (オブジェクトの 作 成 、ID によるオブジェクトのオープン、 更 新 、および 削 除 ) については、 標 準 的 な <strong>C++</strong> バインディングと 比較 すると、 処 理 が 10 ~ 20 倍 も 高 速 になります。• <strong>Caché</strong> ODBC ドライバ<strong>Caché</strong> には、データベースに 対 して SQL クエリを 実 行 する 機 能 など、<strong>Caché</strong> への 高 性 能 なリレーショナル・アクセスを 提 供 する 標 準 の ODBC ドライバが 組 み 込 まれています。<strong>C++</strong> バインディングには、ODBC の 複 雑 さをカプセル 化する 特 別 なクラスも 用 意 されています。 柔 軟 性 を 最 大 限 に 活 かすために、アプリケーションで ODBC と <strong>Caché</strong> <strong>C++</strong>バインディングを 同 時 に 使 用 できます。それぞれの 機 能 については、この 後 の 章 で 説 明 します。このドキュメントは、<strong>C++</strong> および <strong>C++</strong> 標 準 ライブラリの 基 礎 を 理 解 しているユーザのために 作 成 されたものです。<strong>Caché</strong>ではいくつかの <strong>C++</strong> コンパイラがサポートされていますが、<strong>C++</strong> コンパイラや 開 発 環 境 は 含 まれていません。<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 3


<strong>C++</strong> バインディング・アーキテクチャ• 実 行 時 、<strong>C++</strong> アプリケーションは <strong>Caché</strong> サーバに 接 続 します。その 後 、<strong>Caché</strong> オブジェクト・サーバによって 保 持 されている <strong>Caché</strong> オブジェクトに 対 応 する <strong>C++</strong> オブジェクトを 生 成 できます。これらのオブジェクトを、 他 の <strong>C++</strong> オブジェクトとして 使 用 することができます。• <strong>Caché</strong> は、すべての 通 信 とクライアント 側 のデータ・キャッシングを 自 動 的 に 管 理 します。 実 際 の 配 置 構 成 は、アプリケーション 開 発 者 が 決 定 します。<strong>C++</strong> クライアント・アプリケーションと <strong>Caché</strong> サーバは、 同 じ 物 理 マシン、あるいは異 なるマシンのいずれに 置 いてもかまいません。<strong>C++</strong> アプリケーションと <strong>Caché</strong> サーバ 間 のすべての 通 信 は、 標 準TCP/IP プロトコルを 使 用 します。実 行 時 のアーキテクチャは 以 下 のとおりです。• <strong>Caché</strong> データベース・サーバ ( 複 数 可 )。<strong>Caché</strong> サーバは、データベース 処 理 と <strong>Caché</strong> オブジェクト・メソッドの 実 行を 管 理 します。• 生 成 およびコンパイルされた <strong>C++</strong> プロキシ・クラスがリンク 付 けされた、 <strong>C++</strong> "クライアント"・アプリケーション ( 通 常 、<strong>C++</strong> は 専 門 的 なツールやミドル・ウェアの 開 発 に 使 用 しますが、このドキュメントでは、これらのコードをサーバ・コードと 区 別 する 目 的 でクライアントと 呼 びます)。• <strong>Caché</strong> <strong>C++</strong> ライブラリに 含 まれる、 接 続 クラスによって 提 供 されるアプリケーションおよびサーバ 間 の 接 続 。注 釈Light <strong>C++</strong> バインディングのアーキテクチャはまったく 異 なります。このアーキテクチャでは、<strong>C++</strong> アプリケーションと <strong>Caché</strong> オブジェクト・サーバ 間 のデータ 交 換 を 行 うために TCP/IP の 代 わりにプロセス 間 通 信 を 使 用 し、 同じマシン 上 でクライアントとサーバ 操 作 をすべて 実 行 して、 柔 軟 性 の 代 わりに 速 度 を 得 ます。1.1.1 <strong>Caché</strong> <strong>C++</strong> ライブラリ<strong>Caché</strong> <strong>C++</strong> バインディングが 提 供 する <strong>C++</strong> クラスのダイナミック・ライブラリは、<strong>Caché</strong> サーバとの 通 信 に 必 要 な、 基 本 的な 接 続 やキャッシング 機 能 を 実 装 します。<strong>Caché</strong> への 接 続 に 必 要 な <strong>C++</strong> コンポーネントは、\dev\cpp\lib ディレクトリにある <strong>C++</strong> ライブラリ・ファイルに 含 まれています (ご 使 用 のシステムの の 場 所 については、"<strong>Caché</strong> インストール・ガイド" の "<strong>Caché</strong> の 既定 のインストール・ディレクトリ" を 参 照 してください)。このディレクトリには、さまざまなプラットフォーム 用 のさまざまなビルド 構 成 に 対 応 するライブラリの 各 バージョンが 含 まれます。 対 応 するインクルード・ファイルのセットは、\dev\cpp\include サブディレクトリにあります。このライブラリには、<strong>Caché</strong> クラス・ライブラリにある 多 数 のクラスの <strong>C++</strong> バージョンがあります。その 中 には、%Persistent、%RegisteredObject、%SerialObject や、さまざまな <strong>Caché</strong> コレクション・クラス、および 各 種 データ 型 クラスの <strong>C++</strong> バージョンが 含 まれます。さらに、このライブラリには <strong>C++</strong> アプリケーション 内 で <strong>Caché</strong> サーバとの 通 信 を 管理 するために 使 用 する、さまざまなクラスが 含 まれます。<strong>C++</strong> バインディング・アプリケーションで 使 用 可 能 なクラスは、 以 下 の 各 章 にリストして 説 明 しています。• 単 純 なデータ 型 クラスのリファレンス — 文 字 列 や 数 字 などの 単 純 なデータを 含 むリテラル・データ 型 について 説 明しています。• オブジェクトのデータ 型 クラスのリファレンス — リスト、 配 列 、ストリームなど、 標 準 の <strong>Caché</strong> オブジェクトのデータ 型 クラスに 対 応 する、 事 前 定 義 されたプロキシ・クラスについて 説 明 しています。• 接 続 および 継 承 されるプロキシ・クラスのリファレンス — プロキシ・クラスを 生 成 して、それらをサーバに 接 続 するために 必 要 な 機 能 を 提 供 するクラスをリストしています。• ユーティリティ・クラスのリファレンス — トランザクション、バッチ 処 理 、および SQL クエリ 用 の 特 殊 なクラスをいくつかリストしています。<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 5


<strong>Caché</strong> <strong>C++</strong> バインディング1.2 インストールと 構 成<strong>Caché</strong> <strong>C++</strong> バインディング・ソフトウェアは、 標 準 の <strong>Caché</strong> インストールの 一 部 ではなく、カスタム・インストールでオプションとして 提 供 されます。<strong>C++</strong> バインディングをサポートするプラットフォームの 一 覧 については、"はじめに" の "サポート対 象 クライアント・プラットフォーム" を 参 照 してください。<strong>Caché</strong> <strong>C++</strong> バインディング・アプリケーションには、<strong>C++</strong> 標 準 ライブラリをサポートする <strong>C++</strong> コンパイラが 必 要 です。コンパイルするときは、 各 自 のパスに 以 下 のディレクトリが 含 まれている 必 要 があります (ご 使 用 のシステムの の場 所 については、"<strong>Caché</strong> インストール・ガイド" の "<strong>Caché</strong> の 既 定 のインストール・ディレクトリ" を 参 照 してください)。\bin\dev\cpp\libコンパイルされた <strong>C++</strong> バインディング・アプリケーションは、 追 加 の 設 定 作 業 を 一 切 行 うことなく 既 存 の <strong>Caché</strong> クラスにアクセスでき、<strong>Caché</strong> のインストールされていないクライアント・マシンで 実 行 できます。レベル 3 ("ロック・ダウン") セキュリティで <strong>Caché</strong> がインストールされている 場 合 、<strong>Caché</strong> <strong>C++</strong> ジェネレータを 実 行 するには、%Service_Bindings を 有 効 にする 必 要 があります。Light <strong>C++</strong> バインディングには、 他 にも 要 件 があります ("Light <strong>C++</strong> バインディングのインストール" を 参 照 )。1.2.1 ソースからの <strong>Caché</strong> <strong>C++</strong> バインディングの 構 築特 殊 な 状 況 によっては、ソース・コードから <strong>Caché</strong> <strong>C++</strong> バインディングを 構 築 することが 便 利 な 場 合 があります。<strong>Caché</strong>のカスタム・インストール 時 、"<strong>C++</strong> SDK" オプションを 選 択 するとソース・コードがインストールされます。Windows MSVCプロジェクトや UNIX® Makefile は、さまざまなバージョンのコンパイラや 標 準 ライブラリを 使 用 するようにカスタマイズできます。UNIX® では gmake が 必 要 です。 出 荷 時 のソース、プロジェクト、および Makefile は、 製 品 バージョンの <strong>C++</strong> バインディングの 構 築 に 使 用 されたものと 同 じですが、Linux で 異 なる gcc バージョンを 使 用 して 再 構 築 を 行 う 際 は、これらを 変 更 せずに 使 用 できます。 通 常 、 異 なる gcc バージョンで 構 築 された <strong>C++</strong> コードはバイナリ 互 換 ではないので、これが 必 要 になる 場 合 があります。1.2.2 Microsoft Visual Studio 2008 の 設 定ここでは、Windows XP 上 の Microsoft Visual Studio 2008 で、<strong>Caché</strong> <strong>C++</strong> バインディング・プロジェクトを 構 成 する 手 順について 説 明 します。 他 の 環 境 では、 一 部 の 手 順 が 異 なる 場 合 があります。Windows 環 境 変 数 の 設 定プロジェクトを 構 成 する 前 に、 一 部 の Windows 環 境 変 数 を 設 定 する 必 要 があります。 手 順 は、 以 下 のとおりです。• Windows の [スタート] メニューで、[ 設 定 ]→[コントロール パネル]→[システム] を 選 択 します。[システムのプロパティ] ダイアログ・ボックスが 開 きます。• [システムのプロパティ] ダイアログ・ボックスで、[ 詳 細 設 定 ] タブを 選 択 し、[ 環 境 変 数 ] ボタンをクリックします。[ 環 境変 数 ] ダイアログ・ボックスが 開 きます。• [ 環 境 変 数 ] ダイアログ・ボックスの [システム 環 境 変 数 ] セクションに 以 下 の 変 数 を 追 加 します (ご 使 用 のシステムの の 場 所 については、"<strong>Caché</strong> インストール・ガイド" の "<strong>Caché</strong> の 既 定 のインストール・ディレクトリ" を 参照 してください)。変 数 名CACHEBINCACHECPPLIB変 数 の 値\bin\dev\cpp\lib6 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


インストールと 構 成• PATH システム 環 境 変 数 に 以 下 を 追 加 します。;%CACHEBIN%;%CACHECPPLIB%プロジェクトの 構 成以 下 の 手 順 に 従 って、Visual Studio 2008 のプロジェクト 参 照 ウィンドウを 開 きます。• Visual <strong>C++</strong> で 構 成 するプロジェクトを 開 きます。 以 下 の 手 順 では、\Dev\cpp\samples\msvc90\ にあるサンプル・プロジェクトを 開 いていることを 前 提 としています。• メイン・メニューで、[プロジェクト]→[サンプルのプロパティ] を 選 択 します。[サンプル・プロパティ・ページ] ダイアログ・ボックスが 開 きます。• ダイアログ・ボックスの 左 側 に 表 示 されるツリーで、 最 上 位 の 項 目 をクリックします。これを 実 行 できない 場 合 は、 右 側の 一 部 のタブが 非 表 示 になっている 可 能 性 あります。• [サンプル・プロジェクト・ページ] ダイアログ・ボックスで、 以 下 の 手 順 の 変 更 を 実 行 します。wchar_t および ランタイム 型 情 報 (RTTI) サポートを 有 効 にします。• 左 上 隅 にある [ 構 成 ] ドロップダウン・ボックスで、[すべての 構 成 ] を 選 択 します。• 左 側 のメニュー・ツリーで、[ 構 成 プロパティ]→[C/<strong>C++</strong>]→[ 言 語 ] を 選 択 します。• [wchar_t をビルトイン 型 として 扱 う] の 値 が [ ] に 設 定 されていることを 確 認 します。• [ランタイム 型 情 報 を 有 効 にする] の 値 が [ ] に 設 定 されていることを 確 認 します。• [ 適 用 ] ボタンをクリックします。<strong>C++</strong> バインディング・ヘッダ・ファイルの 場 所 を 指 定 します。• 左 側 のメニュー・ツリーで、[ 構 成 プロパティ]→[C/<strong>C++</strong>]→[ 全 般 ] を 選 択 します。• [ 追 加 のインクルード ディレクトリ] テキスト・フィールドに、 以 下 を 追 加 します。"\dev\cpp\include\"ここで は、<strong>Caché</strong> のインストール・ディレクトリです。 前 のエントリと 区 切 るには、セミコロンを 使 用 します。• [ 適 用 ] ボタンをクリックします。<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 7


<strong>Caché</strong> <strong>C++</strong> バインディング<strong>C++</strong> バインディング・ライブラリ・ディレクトリの 場 所 を 指 定 します。• 左 上 隅 にある [ 構 成 ] ドロップダウン・ボックスで、[すべての 構 成 ] を 選 択 します。• 左 側 のメニュー・ツリーで、[ 構 成 プロパティ]→[リンカ]→[ 全 般 ] を 選 択 します。• [ 追 加 のライブラリ ディレクトリ] テキスト・フィールドに、 以 下 を 追 加 します。"$(CACHECPPLIB)\"前 のエントリと 区 切 るには、セミコロンを 使 用 します。• [ 適 用 ] ボタンをクリックします。<strong>C++</strong> バインディング・リリース・ライブラリの 場 所 を 指 定 します。• 左 上 隅 にある [ 構 成 ] ドロップダウン・ボックスで、[リリース] を 選 択 します。• 左 側 のメニュー・ツリーで、[ 構 成 プロパティ]→[リンカ]→[ 入 力 ] を 選 択 します。• [ 追 加 の 依 存 ファイル] テキスト・フィールドに、 以 下 を 追 加 します。cppbind_msvc90.lib前 のエントリと 区 切 るには、スペースを 使 用 します。• Light <strong>C++</strong> バインディングを 使 用 するときは、 以 下 のファイルを 追 加 します。lcbind_msvc90.liblcbclient.lib• [ 適 用 ] ボタンをクリックします。<strong>C++</strong> バインディング・デバッグ・ライブラリの 場 所 を 指 定 します。• 左 上 隅 にある [ 構 成 ] ドロップダウン・ボックスで、[デバッグ] を 選 択 します。• 左 側 のメニュー・ツリーで、[ 構 成 プロパティ]→[リンカ]→[ 入 力 ] を 選 択 します。• [ 追 加 の 依 存 ファイル] テキスト・フィールドに、 以 下 を 追 加 します。cppbind_msvc90d.lib前 のエントリと 区 切 るには、スペースを 使 用 します。• Light <strong>C++</strong> バインディングを 使 用 するときは、 以 下 のファイルを 追 加 します。lcbind_msvc90d.lib• [ 適 用 ] ボタンをクリックします。リリース・コードの 生 成 には、 以 下 のようにランタイム・ライブラリを 指 定 します。• 左 上 隅 にある [ 構 成 ] ドロップダウン・ボックスで、[リリース] を 選 択 します。• 左 側 のメニュー・ツリーで、[ 構 成 プロパティ]→[C/<strong>C++</strong>]→[コード 生 成 ] を 選 択 します。• [ランタイム ライブラリ] ドロップダウン・ボックスから、[マルチスレッド DLL (/MD)] を 選 択 します。• [ 適 用 ] ボタンをクリックします。デバッグ・コードの 生 成 には、 以 下 のようにランタイム・ライブラリを 指 定 します。• 左 上 隅 にある [ 構 成 ] ドロップダウン・ボックスで、[デバッグ] を 選 択 します。• 左 側 のメニュー・ツリーで、[ 構 成 プロパティ]→[C/<strong>C++</strong>]→[コード 生 成 ] を 選 択 します。8 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


Light <strong>C++</strong> バインディングのインストール• [ランタイム・ライブラリ] ドロップダウン・ボックスから、[マルチスレッド デバッグ DLL (/MDd)] を 選 択 します。• [OK] ボタンをクリックし、[サンプル・プロパティ・ページ] ダイアログを 閉 じます。1.2.3 ACE ライブラリを 使 用 した <strong>C++</strong> バインディングの 使 用 法Windows 上 で <strong>C++</strong> バインディング ( 通 常 または Light) を ACE ライブラリと 共 に 使 用 するには、ACE ヘッダ・ファイルの後 に <strong>Caché</strong> ヘッダ・ファイルを 記 述 する 必 要 があります。これは、ACE ヘッダには Microsoft winsock2.h が、<strong>Caché</strong> <strong>C++</strong>バインディング・クラス・ヘッダには Microsoft windows.h が 含 まれているためです。 両 方 のファイルを 含 める 場 合 、windows.hの 前 に winsock2.h がないと、 定 義 の 競 合 のために MSVC コンパイラは 失 敗 します。ACE ヘッダを 含 む 例 を 以 下 に 示 します。Sample_Person.h および Sample_Address.h は <strong>Caché</strong> <strong>C++</strong> バインディングのクラス・ヘッダであるため、すべての ACE ヘッダの 後 に 記 述 する 必 要 があります。#include "ace/OS_main.h"#include "ace/streams.h"#include "ace/Log_Msg.h"#include "ace/SOCK_Acceptor.h"#include "ace/INET_Addr.h"#include "ace/Service_Config.h"#include "CPP-acceptor.h"ACE_RCSID (non_blocking,test_sock_acceptor,"test_sock_acceptor.cpp,v 4.11 2004/10/27 21:06:58 shuston Exp")typedef Svc_Handler SVC_HANDLER;typedef IPC_Server IPC_SERVER;#include "Sample_Person.h" // <strong>C++</strong> binding projected class header#include "Sample_Address.h" // <strong>C++</strong> binding projected class header1.3 Light <strong>C++</strong> バインディングのインストールLight <strong>C++</strong> バインディング (LCB) は、<strong>Caché</strong> <strong>C++</strong> バインディングの 特 別 な 目 的 を 持 ったサブセットで、いくつかの 追 加 要件 があります。Light <strong>C++</strong> バインディングをサポートするプラットフォームの 一 覧 については、"はじめに" の "サポート 対象 クライアント・プラットフォーム" を 参 照 してください。1.3.1 LCB の 追 加 要 件LCB では、 設 計 上 、 以 下 の 追 加 要 件 があります。• GLOBALS_HOME という 環 境 変 数 を <strong>Caché</strong> インストール 環 境 の ディレクトリの 完 全 パスに 設 定 する必 要 があります (システムの の 場 所 については “ 既 定 の <strong>Caché</strong> インストール・ディレクトリ” を 参 照 )。この 環 境 変 数 が 設 定 されていないと、すべての 接 続 の 試 行 に 失 敗 します。注 釈CACHEMGRDIR の 非 推 奨以 前 のリリースでは、 必 須 環 境 変 数 は CACHEMGRDIR であり、 ではなく /mgrディレクトリに 設 定 していました。この 変 数 を 使 用 することもまだ 可 能 ですが、 非 推 奨 となっています。 両 変 数 が設 定 されている 場 合 は、CACHEMGRDIR ではなく GLOBALS_HOME が 使 用 されます。• 標 準 の <strong>C++</strong> バインディングとは 異 なり、LCB アーキテクチャでは、<strong>Caché</strong> および LCB アプリケーションが 同 じマシン 上 にインストールされている 必 要 があります。これは、それらを 同 じプロセスで 実 行 する 必 要 があるためです ( 詳 細は、"Light <strong>C++</strong> バインディング・アーキテクチャ" を 参 照 してください)。• LCB は 低 レベルのコールイン・インタフェースに 依 存 するため、 任 意 の LCB アプリケーションを 含 むディレクトリのフル・パスは、232 文 字 未 満 にする 必 要 があります。<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 9


<strong>Caché</strong> <strong>C++</strong> バインディング• LCB では、 別 々に 用 意 されている DLL または 共 有 ライブラリのセットを 使 用 します。Windows では、lcbind_msvc90.dll、lcbind_msvc90.lib、lcbclient.dll、lcbclient.lib、lcbind_msvc90d.dll、lcbind_msvc90d.lib ファイルを 使 用 します。UNIX® では、liblcbind.so および liblcbclient.so を 使 用 します。• Linux 上 で LCB アプリケーションを 構 築 する 場 合 は、LINUX を 定 義 (#defined) する 必 要 があります。コンパイル・フラグには -DLINUX を 含 めます。この 例 については、Linux の LCB サンプル・アプリケーションの Makefile を 参 照してください。• LCB では、レベル 1 (" 最 小 ") とレベル 2 (" 通 常 ") の 両 セキュリティ・レベルのインストールをサポートしています。レベル 2 のセキュリティで <strong>Caché</strong> をインストールしている 場 合 は、LCB の 接 続 を 許 可 するために %Service_callinを 有 効 にする 必 要 があります。1.3.2 Windows 64 ビット・プラットフォームへのインストールLight <strong>C++</strong> バインディングは、Windows の 64 ビット・プラットフォームで 使 用 できます。64 ビットの Windows 用 の <strong>Caché</strong>インストールでは、<strong>Caché</strong> スタジオに 必 要 な、32 ビット・バージョンの 標 準 の <strong>Caché</strong> <strong>C++</strong> バインディングもインストールされます。64 ビット・バージョンの LCB サンプル・アプリケーションを 構 築 するには、これらのアプリケーション 用 の MSVCプロジェクト・ファイルで、"win64 Release" または "win64 Debug" 構 成 を 使 用 します。LCB アプリケーションのデバッグ・バージョンを 実 行 するには、64 ビット・デバッグ・バージョンのライブラリである msvcrtd.dllおよび msvcp60d.dll を 含 む、Microsoft Platform SDK をダウンロードする 必 要 があります。64 ビットのシステムでは、Microsoft Visual Studio をインストールしても、これらのファイルの 32 ビット・バージョンしかインストールされません (これは <strong>Caché</strong> または Light <strong>C++</strong> バインディングに 固 有 の 問 題 ではなく、64 ビット・システムで <strong>C++</strong> 開 発 を 実 行 するうえ<strong>での</strong>一 般 的 な 問 題 です)。1.3.3 UNIX® <strong>での</strong> 高 信 頼 アプリケーションの 実 行UNIX® で Light <strong>C++</strong> バインディング・アプリケーションを 実 行 するには、それが " 高 信 頼 アプリケーション" でない 限 り、root で 実 行 するか、cacheusr グループに 属 するユーザとして 実 行 する 必 要 があります。 配 置 済 みのアプリケーションについては、 高 信 頼 アプリケーションにすることをお 勧 めします。これにより、アプリケーションは、 実 質 的 なグループとして cacheusr で 実 行 されますが、このアプリケーションの 実 行 可 能 ファイルに 対 して 実 行 アクセス 権 を 持 つユーザであれば 誰 でもこのアプリケーションを 実 行 できます (この 実 行 アクセス 権 は、UNIX® の 一 般 的 な 手 法 である chmod を 使 用して 制 御 します)。高 信 頼 アプリケーションにするには、 以 下 を 実 行 します。• アプリケーションの makefile で、アプリケーションをリンクするフラグのうち、libcachet.so、liblcbind.so、およびliblcbclient.so の 各 ライブラリについて、ランタイム・パス 名 に -rpath を 指 定 します。g++ では、 以下 を 使 用 します。-Xlinker -rpath -Xlinker ランタイム・パス 名 とは、アプリケーションを 実 行 する 環 境 内 のライブラリへのパス 名 で、アプリケーションを 構 築 した環 境 <strong>での</strong>パス 名 とは 完 全 に 異 なる 場 合 があります。• または、 各 ライブラリの /usr/lib にソフト・リンクを 作 成 することもできます。cd /usr/libln -s /libcachet.so libcachet.soln -s /liblcbind.so liblcbind.soln -s /liblcbclient.so liblcbclient.so高 信 頼 アプリケーションで 共 有 ライブラリを 使 用 する 場 合 は、アプリケーションの 構 築 時 、 共 有 ライブラリの 実 行 時 の場 所 をわかっている 必 要 があります。これは、ユーザが LD_LIBRARY_PATH を 使 用 して、 共 有 ライブラリの 信 頼 されていないバージョンをポイントしないようにするためです。アプリケーションの 構 築 時 、 特 定 の 共 有 ライブラリの 実行 時 のパスを 指 定 しなかった 場 合 は、 既 定 で /usr/lib/ が 使 用 されます。10 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


サンプル・プログラム• LCB アプリケーションの 所 有 者 、グループ、SUID ビットを 設 定 します。 以 下 はその 例 です。chown lcbdemochgrp cacheusr lcbdemochmod g+s lcbdemo1.4 サンプル・プログラム標 準 の <strong>Caché</strong> インストールには、<strong>C++</strong> のサンプル・ディレクトリである \dev\cpp\samples\ に、いくつかの簡 単 なサンプル・プログラムが 含 まれています (ご 使 用 のシステムの の 場 所 については、"<strong>Caché</strong> インストール・ガイド" の "<strong>Caché</strong> の 既 定 のインストール・ディレクトリ" を 参 照 してください)。 用 意 されているサンプル・プログラムは以 下 のとおりです。• samples.cpp — 標 準 の <strong>Caché</strong> <strong>C++</strong> バインディングの 使 用 法 を 示 す 簡 単 なプログラムです。• lcbdemo.cpp — Light <strong>C++</strong> バインディングの 使 用 法 を 示 します。• mttest.cpp — スレッドの 安 全 性 を 検 証 するためのマルチスレッドの LCB テストです。• qtest.cpp — 標 準 のバインディングおよびマルチスレッド LCB の 両 方 を 使 用 するクエリ・プログラムです。これらのプログラムの MS Visual Studio プロジェクト・ファイルは、..\samples\msvc90 にあります。UNIX® プラットフォームの 場 合 は、<strong>Caché</strong> 2008.1 以 降 で run_samples.sh を 使 用 できます。必 要 なプロキシ・クラスsamples.cpp プログラムは、 同 様 に 標 準 の <strong>Caché</strong> インストールに 付 属 する、SAMPLES ネームスペースの Sample パッケージにあるクラスを 使 用 します。 以 下 のファイルが <strong>C++</strong> のメインのサンプル・ディレクトリにない 場 合 は、Sample.Personおよび Sample.Address について、 以 下 の <strong>C++</strong> プロキシ・クラス・ファイルを 生 成 する 必 要 があります ("プロキシ・クラスの 生 成 " を 参 照 してください)。• Sample_Person.h、Sample_Person.cpp• Sample_Address.h、Sample_Address.cpplcbdemo.cpp プログラムは、SAMPLES ネームスペースの User パッケージにあるクラスを 使 用 します。 以 下 の <strong>C++</strong> プロキシ・クラス・ファイルが <strong>C++</strong> のメインのサンプル・ディレクトリにない 場 合 は、User.Person および User.testidkey2 について、これらのファイルを 生 成 する 必 要 があります。• LC_User_Person.h、LC_User_Person.cpp• LC_User_testidkey2.h、LC_User_testidkey2.cpp<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 11


2プロキシ・クラスの 生 成プロキシ・クラスは、<strong>Caché</strong> クラスの 定 義 を 読 み 取 り、その 情 報 を 使 用 して 対 応 する <strong>C++</strong> クラスを 生 成 する、<strong>Caché</strong> <strong>C++</strong>クラス・ジェネレータによって 生 成 されます ("<strong>C++</strong> ジェネレータの 使 用 法 " を 参 照 してください)。 生 成 されたクラスは、<strong>C++</strong>アプリケーションから <strong>Caché</strong> オブジェクトのインスタンスへのリモート・アクセスを 提 供 します。2.1 概 要<strong>C++</strong> ジェネレータは、 対 応 する <strong>Caché</strong> クラスと 同 じ 継 承 階 層 を 持 つ <strong>C++</strong> プロキシ・クラスを 生 成 します。クラスのタイプ( 永 続 、シリアルなど) によって、それに 対 応 する <strong>C++</strong> スーパークラスが 決 まります。 例 えば、 永 続 クラスは、<strong>Caché</strong> <strong>C++</strong>ライブラリに 含 まれる <strong>C++</strong> Persistent_t クラスから 派 生 した、 対 応 する <strong>C++</strong> クラスを 持 ちます。 多 重 継 承 の 場 合 、クラスは<strong>Caché</strong> の 最 初 のスーパークラスのサブクラスになり、 他 の 直 接 スーパークラスからのすべてのメソッドとプロパティは、そのプロキシ・クラスのメンバとして 生 成 されます。<strong>Caché</strong> <strong>C++</strong> クラス・ライブラリには、%Persistent、%RegisteredObject、%SerialObject、 各 種 <strong>Caché</strong> コレクション・クラス、およびさまざまなデータ 型 クラスの <strong>C++</strong> バージョンなど、<strong>Caché</strong> クラス・ライブラリ 内 の <strong>C++</strong> バージョンの 多 数 のクラスが 含まれています。さらに、このライブラリには <strong>C++</strong> アプリケーション 内 で <strong>Caché</strong> サーバとの 通 信 を 管 理 するために 使 用 する、さまざまなクラスが 含 まれます。注 釈<strong>C++</strong> バインディングでは、 実 行 時 、メタデータがコードの 生 成 時 以 降 に 変 更 されたかどうかをチェックしません。具 体 的 には、コード 生 成 時 と 同 じネームスペースにアプリケーションが 接 続 されているかどうか、クラスが 実 行 時のネームスペースに 定 義 されているかどうかといったチェックがあります。これらが 変 更 されていても、 処 理 は 継続 され、データは 挿 入 されますが、このデータには SQL やオブジェクト・インタフェースからはアクセスできません。2.2 標 準 のプロキシ・クラス・メソッド<strong>Caché</strong> クラスによって 定 義 されるメソッドに 加 えて、すべての <strong>C++</strong> プロキシ・クラスは、 標 準 の <strong>Caché</strong> <strong>C++</strong> ライブラリ・クラスである Persistent_t ( 永 続 クラスの 場 合 ) または Registered_t (シリアル・クラスの 場 合 ) から 一 連 のメソッドを 継 承 します。<strong>C++</strong> ジェネレータも、 生 成 されたクラスに 対 して、 一 連 の 静 的 な Create および Open メソッドを 追 加 します。<strong>C++</strong> クラスの 不 正 な 使 用 を 回 避 するため、プロキシ・クラスのコンストラクタはプライベートになっています。 生 成 されたクラス T をインスタンス 化 する 唯 一 の 方 法 は、それぞれに d_ref オブジェクトを 返 す、T::create_new()、T::open()、または T::openid()のいずれかのスタティック・メソッドを 呼 び 出 すことです ( 詳 細 は、"プロキシ・オブジェクトの 使 用 法 " を 参 照 してください)。これらのメソッドは、 指 定 されたクラスに 対 応 する <strong>Caché</strong> メソッドが 存 在 する 場 合 のみ 生 成 されます。<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 13


プロキシ・クラスの 生 成スタティック・メソッドは 以 下 のように 定 義 されます (ここで、My_Class はプロキシ・クラスの 名 前 です)。• create_new() — %New メソッドを 呼 び 出 して、サーバ 上 にオブジェクトを 生 成 します。static d_ref create_new(Database* db,const_str_t init_val = 0, // const_str_t is a typedef of const wchar_t*Db_err* err = 0)• open() — 永 続 クラスに 対 してのみ 生 成 されます。サーバ 上 で %Open を 呼 び 出 し、その 完 全 なオブジェクト ID を 使用 してオブジェクトを 開 きます。static d_ref open(Database* db,const d_binary& ident,int concurrency = -1,int timeout = -1,Db_err* err = 0)• openid() — サーバ 上 で %Openid を 呼 び 出 し、そのエクステント 固 有 の ID を 使 用 してオブジェクトを 開 きます。static d_ref openid(Database* db,const const_str_t ident,int concurrency = -1,int timeout = -1,Db_err* err = 0)// const_str_t is a typedef of const wchar_t*2.3 プロキシ・メソッドの 実 装<strong>Caché</strong> インスタンス・メソッドに 対 しては <strong>C++</strong> インスタンス・メソッドが 生 成 され、<strong>Caché</strong> クラス・メソッドに 対 しては <strong>C++</strong> スタティック・メソッドが 生 成 されます。<strong>C++</strong> メソッドがクライアントで 呼 び 出 されると、<strong>Caché</strong> サーバ 上 にある 実 際 のメソッドの 実装 が 呼 び 出 されます。メソッド・シグニチャに 既 定 値 の 引 数 が 含 まれる 場 合 、<strong>Caché</strong> は 生 成 された <strong>C++</strong> メソッド 内 でその既 定 値 を 使 用 します。 例 えば、1 つのメソッドを 持 つ 単 純 な <strong>Caché</strong> クラスを 定 義 するとします。Class MyApp.Simple Extends %RegisteredObject {Method LookupName(id As %String) As %String {// lookup a name using embedded SQLSet name = ""&sql(SELECT Name INTO :name FROM Person WHERE ID = :id)Quit name}}得 られる <strong>C++</strong> クラス・ヘッダは 以 下 のようになります。class MyApp_Simple : public Persistent_t {friend d_ref;public:// codevirtual d_string LookupName(d_string id);}メソッドが <strong>C++</strong> から 呼 び 出 されると、<strong>C++</strong> クライアントはまずサーバ・オブジェクト・キャッシュを 同 期 化 し、<strong>Caché</strong> サーバのメソッドを 呼 び 出 し、 結 果 の 値 が 存 在 する 場 合 は 最 後 にそれを 返 します。メソッドの 引 数 が 参 照 渡 しで 指 定 されている場 合 は、その 値 も 更 新 されます。14 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


プロキシ・プロパティの 実 装2.4 プロキシ・プロパティの 実 装<strong>C++</strong> プロキシ・クラスのプロパティは、1 組 みのアクセサ・メソッドを 介 してアクセスされます。 各 プロパティには、 値 の 取 得に 使 用 する get() メソッドと、 値 の 設 定 に 使 用 する set() メソッドがそれぞれ 対 応 付 けられます。( 文 字 列 や 整 数 などの) リテラル・プロパティの 値 は、<strong>Caché</strong> <strong>C++</strong> クラス・ライブラリによって 提 供 される 適 切 な <strong>C++</strong> データ型 クラス (d_string や d_int など) を 使 用 して 表 されます。オブジェクト 値 のプロパティの 値 は、d_ref テンプレート・クラスを 使 用 して 表 されます ("プロキシ・オブジェクトの 使 用 法 "を 参 照 してください)。例 えば、リテラルとオブジェクト 値 の 2 つのプロパティを 持 つ <strong>Caché</strong> に、 永 続 クラスを 定 義 したと 仮 定 します。Class MyApp.Student Extends %Persistent {// Student's nameProperty Name As %String;// Reference to a school objectProperty School As School;}MyApp.Student の <strong>C++</strong> コードには、Name プロパティと School プロパティの 両 方 に get と set の アクセサ・メソッドが 含まれます。さらに、 参 照 されている School オブジェクトのオブジェクト ID に 対 するアクセサも 提 供 されます。例 えば、<strong>Caché</strong> のサンプル・クラスの Sample.Person では、DOB プロパティが 以 下 のように 定 義 されています。Property DOB As %Date(POPSPEC = "Date()");POPSPEC のコンテンツは、サンプル・データでクラスを 生 成 するためのものであり、 実 際 のアプリケーションには 表 されません。Sample.Person の <strong>C++</strong> アクセサ・メソッドは 以 下 のようになります。virtual d_date getDOB() const;virtual void setDOB(const d_date&);<strong>C++</strong> オブジェクトが <strong>C++</strong> 内 でインスタンス 化 されると、<strong>Caché</strong> サーバからそのプロパティ 値 のコピーをフェッチし、ローカル・クライアント 側 のキャッシュにそれらをコピーします。それ 以 降 は、オブジェクトのプロパティ 値 へのアクセスはこのキャッシュに 対 して 行 い、サーバとの 間 で 送 信 および 受 信 するメッセージ 数 を 減 らします。<strong>Caché</strong> は 自 動 的 にこのローカル・キャッシュを 管 理 し、<strong>Caché</strong> サーバで 対 応 するオブジェクトの 状 態 と 確 実 に 同 期 をとるようにします。( 他 のプロパティに 値 を 依 存 するプロパティを 作 成 するなどの 目 的 で) <strong>Caché</strong> クラス 定 義 内 で Get メソッドまたは Set メソッドが 定 義 されたプロパティ 値 は、ローカル・キャッシュには 格 納 されません。 代 わりに、そのようなプロパティにアクセスすると、 対 応 するアクセサ・メソッドが <strong>Caché</strong> サーバで 呼 び 出 されます。これには、 多 量 のネットワーク・トラフィックが 必 要 となるため、クライアント/サーバ 環 境 でこのようなプロパティを 使 用 する 場 合 、 注 意 する 必 要 があります。2.5 名 前 付 け 規 約通 常 、クラス、メソッド、または 変 数 の 名 前 など、 生 成 された <strong>C++</strong> 識 別 子 は、 対 応 する <strong>Caché</strong> 識 別 子 の 名 前 と 同 じです。このセクションでは、そのルールの 例 外 について 説 明 します。注 釈 重 要 な 点 は、<strong>C++</strong> 識 別 子 に 使 用 できる 文 字 は、<strong>Caché</strong> ObjectScript とは 異 なり、A Z、a z、1 9、および "_" (アンダースコア) のみであることです。<strong>C++</strong> では 許 可 されていない 文 字 を <strong>Caché</strong> 識 別 子 で 使 用 していると、これらの 文 字 はアンダースコアに 置 き 換 えられます。<strong>Caché</strong> 識 別 子 を 高 位 Unicode 文 字 で 作 成 すると、アンダースコアのみで 構 成 した <strong>C++</strong> 識 別 子 が 発 生 する 場 合 があります。 以 下 で 説 明 するように、 代 わりのクラス 名 とパッケージ 名 を <strong>Caché</strong> で 定 義 できます。• クラス 名 とパッケージ 名<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 15


プロキシ・クラスの 生 成<strong>C++</strong> はパッケージをサポートしていないため、クラスの <strong>Caché</strong> パッケージ 名 は、<strong>C++</strong> クラス 名 の 最 初 に "." 文 字 の代 わりに "_" 文 字 を 付 けて 表 されます。クラス 名 自 体 は 変 わりません。<strong>Caché</strong> コードでパッケージ・クライアント 名 とクラスの ClientName パラメータの 両 方 を 定 義 している 場 合 、<strong>Caché</strong> <strong>C++</strong>ジェネレータでは、そのクラス 名 とパッケージ 名 ではなく、これらのパラメータを 使 用 します。パッケージ 名 を 設 定 するには、<strong>Caché</strong> スタジオでパッケージ 名 を 右 クリックし、コンテキスト・メニューで [ ] を 選 択 して [] フィールドに 値 を 入 力 します。クラスの ClientName パラメータは、クラス・インスペクタを 使 用 して 定 義 できます。• メソッド 名通 常 、メソッド 名 は 変 更 されずに 直 接 <strong>C++</strong> メソッドにマップされます。ただし、 以 下 の 例 外 があります。– メソッド 名 が "%" で 始 まる 場 合 、"sys_" に 置 換 されます。– メソッド 名 が <strong>C++</strong> の 予 約 語 の 場 合 、その 名 前 の 前 に "_" が 付 きます。• プロパティ 名サーバ 上 では、 直 接 <strong>Caché</strong> オブジェクトのプロパティを 参 照 できます。<strong>C++</strong> のプロパティの 振 る 舞 いをカプセル 化するために、<strong>Caché</strong> の 各 プロパティに 対 して、2 つの <strong>C++</strong> アクセサ・メソッドが 生 成 されます。 指 定 された Prop プロパティについては、getProp() と setProp() というアクセサ・メソッドが 生 成 されます。プロパティ 名 が "%" で 始 まる 場合 は、"sys_" に 置 き 換 わります。したがって、Color プロパティのアクセサ・メソッドは getColor() と setColor() になり、%Concurrency プロパティのアクセサ・メソッドは get_sys_Concurrency() と set_sys_Concurrency() になります。• 仮 変 数 名メソッドの 仮 リスト 内 の 変 数 が "%" で 始 まる 場 合 、"_" に 変 換 されます。その 名 前 が 予 約 語 の 場 合 、 名 前 の 前 に"_" が 付 きます。<strong>Caché</strong> Basic および ObjectScript の 名 前 付 け 規 約 の 詳 細 は、"<strong>Caché</strong> ObjectScript の 使 用 法 " の " 変 数 "、"<strong>Caché</strong> オブジェクトの 使 用 法 " の " 名 前 付 け 規 約 "、"<strong>Caché</strong> Basic の 使 用 法 " の " 識 別 子 と 変 数 "、および "<strong>Caché</strong> プログラミング 入門 ガイド" の " 識 別 子 のルールとガイドライン" を 参 照 してください。2.6 <strong>C++</strong> ジェネレータの 使 用 法<strong>Caché</strong> <strong>C++</strong> ジェネレータは、<strong>Caché</strong> クラス 定 義 から <strong>C++</strong> クラスとヘッダ・ファイルを 生 成 するプログラムです。コマンド 行プログラム、または <strong>Caché</strong> スタジオのオプションとして 使 用 できます。レベル 3 ("ロック・ダウン") セキュリティで <strong>Caché</strong> がインストールされている 場 合 、ジェネレータを 実 行 するには、%Service_Bindings を 有 効 にする 必 要 があります。スタジオからジェネレータにアクセスするには、メイン・メニューから [ ] [<strong>C++</strong> ] を 選 択 します。このオプションでは、-lc パラメータと 共 にコマンド 行 プログラムを 使 用 する 必 要 がある、Light <strong>C++</strong> バインディングのプロジェクションの 生 成 は 許 可 されません。コマンド 行 プログラム cpp_generator.exe は \dev\cpp\lib ディレクトリにインストールされますが、このディレクトリが 各 自 の Path で 指 定 されている 必 要 があります (ご 使 用 のシステムの の 場 所 については、"<strong>Caché</strong> インストール・ガイド" の "<strong>Caché</strong> の 既 定 のインストール・ディレクトリ" を 参 照 してください)。プログラムの 構 文 は、 以 下 のとおりです。cpp_generator-conn -user -pswd -path [-class ] | [-class-list ][-lc][-help]16 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


<strong>C++</strong> ジェネレータの 使 用 法以 下 はその 例 です。cpp_generator-conn "localhost[1972]:SAMPLES"-user "MyUserName"-pswd "MyPassword"-path "./cppfiles"-class "Sample.Person"-lcテーブル 2–1: <strong>C++</strong> ジェネレータのパラメータ-conn[]: 形 式 の 接 続 文 字 列 。以 下 はその 例 です。-conn "localhost[1972]:SAMPLES"-user-pswd-classまたは-class-listユーザ 名 を 指 定 する 文 字 列 。パスワードを 指 定 する 文 字 列 。クラス 名 か、クラス 名 のリストを 含 むファイルのどちらか。-class オプションは、<strong>Caché</strong> サーバ・クラスの 名 前 を 指 定 します。 以 下 はその 例です。-class "Sample.Person"-class-list オプションは、<strong>Caché</strong> サーバ・クラスの 名 前 を 表 す 文 字 列 のみが 1 行 に 1 つずつ 記 述 されたファイルの 名 前 を 指 定 します。 以 下 はその 例 です。-class-list "\Mydir\classlist.txt"この classlist.txt には、 以 下 の 行 が 記 述 されています。Sample.PersonSample.Company-path-lc-help生 成 される <strong>C++</strong> クラスを 配 置 するディレクトリを 指 定 する 文 字 列 。オプション。-lc スイッチを 使 用 すると、ジェネレータは Light <strong>C++</strong> バインディング・クラスを 生成 します。オプション。<strong>C++</strong> ジェネレータのパラメータ・リストを 表 示 します。<strong>C++</strong> ジェネレータは、 指 定 されたクラスの 実 装 に 必 要 な 他 のすべてのクラスのコードを 自 動 的 に 生 成 します。 例 えば、-class "Sample.Employee" を 指 定 すると、Sample.Person クラスと Sample.Address クラスのコードも 生 成 されます。これは、Sample.Employee が Sample.Person から 派 生 し、Sample.Person が Sample.Address 型 のプロパティを 持 つためです。<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 17


3<strong>C++</strong> バインディングの 使 用 法この 章 では、<strong>Caché</strong> Perl バインディングを 使 用 する <strong>C++</strong> コードの 具 体 例 を 紹 介 します。ここで 説 明 する 内 容 は 以 下 のとおりです。• <strong>C++</strong> バインディングの 基 礎 — <strong>Caché</strong> データベース・オブジェクトへのアクセスと 操 作 に 関 する 基 本 事 項 です。• プロキシ・オブジェクトの 使 用 法 — プロキシ・オブジェクトへの 参 照 であるオブジェクトを 操 作 します。• コレクションの 使 用 法 — <strong>Caché</strong> のリストと 配 列 を 反 復 処 理 します。• リレーションシップの 使 用 法 — 埋 め 込 みオブジェクトを 操 作 します。• ストリームの 使 用 法 — 長 い 文 字 列 またはバイナリ・データを 保 持 するプロパティを 使 用 します。• クエリの 使 用 法 — <strong>Caché</strong> クエリとダイナミック SQL クエリを 実 行 します。• トランザクションの 使 用 法 — トランザクションをコミットまたはロールバック・メソッドで 制 御 します。ここで 紹 介 する 例 の 多 くは、サンプル・プログラムを 変 更 したものです。コードを 簡 略 化 するため、 引 数 処 理 とエラー・トラップ 文 (try/catch) は 除 外 されています。 完 全 なサンプル・プログラムをロードして 実 行 する 方 法 の 詳 細 は、"サンプル・プログラム" を 参 照 してください。3.1 <strong>C++</strong> バインディングの 基 礎<strong>Caché</strong> <strong>C++</strong> バインディング・アプリケーションは 非 常 にシンプルです。 以 下 は、 完 全 なサンプル・プログラムです。#include "Sample_Person.h"#include "Sample_Address.h"int main(){// Connect to the Cache' databased_connection conn = tcp_conn::connect("localhost[1972]:Samples","_system", "SYS");Database db(conn);}// Create and use a Cache' objectd_ref person = Sample_Person::create_new(&db);person->setName("Doe, Joe A");person->setSSN("123-45-6789");person->save();// Print the resultstd::cout


<strong>C++</strong> バインディングの 使 用 法• <strong>Caché</strong> データベースの Samples ネームスペースに 接 続 します。– <strong>Caché</strong> データベースへの 接 続 に 必 要 な 情 報 を 定 義 します。– d_connection オブジェクト (conn) を 作 成 します。– d_connection オブジェクトを 使 用 して、Database オブジェクト (db) を 作 成 します。• <strong>Caché</strong> オブジェクトを 作 成 し、 使 用 します。– Database オブジェクトを 使 用 して、<strong>Caché</strong> Sample.Person クラスのインスタンスを 作 成 します。– Sample.Person オブジェクトの Name プロパティを 設 定 します。– Name プロパティを 取 得 し、 出 力 します。以 下 のセクションでは、これらの 基 本 処 理 について 詳 しく 説 明 します。3.1.1 <strong>Caché</strong> データベースへの 接 続<strong>Caché</strong> データベースへの 物 理 的 な 接 続 を 確 立 するには、d_connection クラスのインスタンスを 生 成 します。d_connectionはプロキシ・クラスであり、Conn_t ( 接 続 ) クラス・インスタンスへのスマート・ポインタとして 動 作 します。これは、 参 照 するConn_t オブジェクトの 最 後 の 参 照 が 範 囲 外 となったときに、 自 動 的 に Conn_t::disconnect() を 呼 び 出 します。つまり、ユーザは Conn_t::disconnect() を 直 接 呼 び 出 す 必 要 はなく、Database オブジェクトは、 誤 って 切 断 されることのない 有効 な 接 続 を 必 ず 保 持 していることを 意 味 します。Conn_t は、これらのすべての 接 続 に 対 し、 共 通 のインタフェースを 提 供します。d_connection オブジェクトで Database オブジェクトを 初 期 化 するには、d_connection オブジェクトが 参 照 する Conn_tオブジェクトが 接 続 されていて、 他 の Database インスタンスによって 使 用 されていない 必 要 があります。d_connectionオブジェクトがこれらの 要 件 を 満 たしているかどうかをテストするには、is_connected() 関 数 および is_busy() 関 数 を 使 用 します。 例 えば、conn という 名 前 の d_connection オブジェクトをテストする 場 合 は、 以 下 を 実 行 します。if (!conn->is_connected())// code that makes conn point to an active connectionアクティブな 接 続 を 指 していない d_connection オブジェクトは 役 に 立 たないため、そのコンストラクタはプライベートに 設定 されます。d_connection オブジェクトを 生 成 するには、アクティブな 接 続 を 指 す d_connection オブジェクトを 返 すConn_t::connect() を 呼 び 出 す 以 外 に 方 法 はありません。 接 続 が 確 立 できない 場 合 、d_connection オブジェクトはアクティブでない 接 続 を 参 照 します。TCP/IP 接 続 クラスは、tcp_conn です。そのスタティック connect() メソッドは、 以 下 の 引 数 を 取 ります。• “host[port]:namespace” 形 式 の 接 続 文 字 列• ユーザ 名• パスワード• タイムアウト 値• エラー 値 — 接 続 に 失 敗 した 場 合 にエラー 情 報 が 含 まれる、Db_err のオプションのアドレスです。例 えば 以 下 のように 記 述 します。20 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


<strong>C++</strong> バインディングの 基 礎Db_err conn_err;d_connection conn = tcp_conn::connect("localhost[1972]:Samples","_SYSTEM", "SYS", 0, &conn_err);if (conn_err) {// error handlingstd::cerr


<strong>C++</strong> バインディングの 使 用 法3.2 プロキシ・オブジェクトの 使 用 法オブジェクト 値 のプロキシ・タイプは、d_ref< > テンプレート・クラス (または Light <strong>C++</strong> バインディング・クラスの lc_d_ref クラス) を 使 用 して 表 されます。このテンプレートは、そのパラメータに、 対 応 する <strong>C++</strong> クラス 名 を 取 ります。 例 えば、Company オブジェクトへの 参 照 は、d_ref として 表 されます。d_ref のインスタンスは、 参 照 タイプ T のプロキシ・オブジェクトへのスマート・ポインタです。つまり、 以 下 を 実 行 できます。• "->" (ポインタ) 演 算 子 を 使 用 して、プロキシ・オブジェクトのメソッドを 呼 び 出 します。• 1 つの d_ref< > をコピーします。この 2 つの d_ref< > インスタンスは、 同 じプロキシ・オブジェクトを 指 します。• プロキシ・メソッドに、 引 数 として d_ref< > を 渡 すと、d_ref< > は 別 のプロキシ・オブジェクトを 指 します。注 釈同 じサーバ・オブジェクトを 表 す 2 つの 変 数 が、2 つの 異 なるプロキシ・オブジェクトを 指 す 場 合 もあります。このライブラリは、 開 いているサーバ・オブジェクトごとにプロキシ・オブジェクトを 1 つのみ 使 用 しようとしますが、ユーザが 異 なるプロキシ・クラスを 使 用 してサーバ・オブジェクトを 開 いている 場 合 は、 同 じサーバ・オブジェクトに 異 なるプロキシ・オブジェクトを 使 用 する 必 要 があります。"==" ( 等 式 テスト) および "!=" ( 非 等 式 テスト) を 使 用 して、d_ref とd_ref が 同 じサーバ・オブジェクトを 指 しているかどうかをテストできます。d_ref は T へのポインタのように 振 る 舞 いますが、 実 際 のポインタではありません。したがって、Null をテストしたり、d_ref が Null を 指 すようにするには、メソッド 呼 び 出 し is_null() と make_null() を 介 して 実 行 する 必 要 があります。 以下 はその 例 です。d_ref p1 = Sample_Person::openid(&db, L"1");if (p1.is_null())std::cerr を 取 得 し、 変 換 が 不 可 能 な 場 合 は、これを NULL に 設 定 します。 以 下 はその 例 です。d_ref e1 = Sample_Employee::openid(&db, L"1");d_ref p2 = e1;d_ref e2; p2.conv_to(e2);3.2.2 リソースの 管 理d_ref< > は、 自 身 が 指 すプロキシ・オブジェクトに 関 連 するすべてのシステム・リソースを、 自 動 的 に 管 理 します。 以 下 はその 例 です。22 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


コレクションの 使 用 法d_ref p1 = Sample_Person::openid(&db, L"1");p1->setDOB(1970,2,1);d_ref p2 = p1->getSpouse();change_to_spouse(p2); // p2 points to the same server object as p11 行 目 の openid() は、Sample_Person のスタティック・メソッドで、d_ref のインスタンスを 生 成 します。2行 目 では、インスタンスを 使 用 して Person オブジェクトの 誕 生 日 を 変 更 します。3 行 目 では、p2 がその 人 の 配 偶 者 を 指すように 設 定 し、4 行 目 では p2 が p1 と 同 じ 人 を 指 すように 変 更 します。p1 および p2 によって 取 得 されたすべてのリソースは、p1 および p2 が 範 囲 外 となったときに、 自 動 的 に 開 放 されます。3.3 コレクションの 使 用 法コレクションのプロキシは、<strong>C++</strong> 標 準 ライブラリのフレームワークに 適 合 するように 設 計 されています。%ListOfObjects および %ListOfDataTypes のプロキシは、std::vector のインタフェースとほぼ 同 じインタフェースを 提 供 します。 同 様に、%ArrayOfObjects および %ArrayOfDataTypes のプロキシは、std::map のインタフェースとほぼ 同 じインタフェースを提 供 します。オブジェクトのコレクションタイプ T のオブジェクトのコレクションに 対 するプロキシは、タイプ d_obj_coln_type のオブジェクトを 含 みます。これらは、d_ref として 操 作 することもできますが、それらが 指 すオブジェクトの 変 更 がサーバ 上 のコレクションに 対 してもすべて 確 実 に 反 映 される 点 で d_ref とは 異 なります。 特 定 のコレクションと 指 定 されたキーに 対 するオブジェクトの 値 を変 更 するには、 異 なる d_ref をオブジェクトに 割 り 当 てるだけで 十 分 です。これらのオブジェクトは、コレクションでオブジェクトを 開 くことに 伴 う 負 荷 を 軽 減 するために、クライアント 側 で 必 要 となるまでサーバ 上 のオブジェクトを 開 きません。基 本 データ 型 のコレクションデータ 型 T のコレクションのプロキシは、タイプ d_prim_coln_type のオブジェクトを 含 みますが、これは T として 操 作できます。これらは、オブジェクトのコレクションに 含 まれるオブジェクトに 類 似 していますが、オーバーヘッドはわずかなので 直 ちに 初 期 化 されます。3.3.1 インタフェースタイプ T の 要 素 を 持 つ %ListOfObjects は、タイプ d_obj_coln_type の 要 素 を 持 つ d_obj_vector として 生 成 され、d_ref として 操 作 できます。タイプ T の 要 素 を 持 つ %ArrayOfObjects は、タイプ d_obj_coln_type の 要 素 も 持 つd_obj_map として 生 成 されます。タイプ T の 要 素 を 持 つ %ListOfDataTypes は、タイプ d_prim_coln_type の 要 素 を 持 つ d_prim_vector として 生 成され、T として 操 作 できます。タイプ T の 要 素 を 持 つ %ArrayOfDataTypes は、タイプ d_prim_coln_type の 要 素 も 持つ d_prim_map として 生 成 されます。他 のオブジェクトと 同 様 に、コレクションは d_ref 経 由 で 操 作 する 必 要 があります。つまり、スタティック・メソッドcreate_new() と openref() を 呼 び 出 すことにより、インスタンスを 生 成 することができます。これらのメソッドは、シリアル・オブジェクトに 対 するプロキシの 初 期 化 に 使 用 します。d_obj_coln_type と d_prim_coln_type は、T から 構 築 できます。つまり、d_obj_coln_type または d_prim_coln_typeをとるすべての 関 数 は、その 引 数 が 定 数 であれば、T によって 呼 び 出 すこともできます。3.3.2 例以 下 は、 単 純 なコレクションの 使 用 例 です。コンストラクタCPP.Coln クラスがプロパティ Lst を 持 つと、 以 下 により <strong>C++</strong> バインディング 内 でそのプロパティにアクセスすることができます。Lst は %ListOfObjects で、1 つ 以 上 の Sample.Person のインスタンスを 保 持 します。<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 23


<strong>C++</strong> バインディングの 使 用 法d_ref< d_obj_vector > list = obj->getLst();obj は、タイプ d_ref のオブジェクトです。要 素 アクセスコレクション 内 で list が 指 す 3 番 目 のSample.Person には、 以 下 によりアクセスできます。または(*list)[2]*(list->begin()+2)person の 名 前 には、 以 下 によりアクセスできます。または(*list)[2]->getName()(*(list->begin()+2))->getName()list が d_ref なので、"." の 代 わりに "->" を 使 用 します。これは、 実 際 のオブジェクトへのポインタのように 動 作 します。メソッド(d_ref 型 の) p は、 list が 指 すコレクションに 以 下 のように 挿 入 できます。list->push_back(p);コレクション 内 で list が 指 す 2 番 目 の Sample.Person は、 以 下 により 消 去 できます。list->erase(list->begin()+1);アルゴリズムコレクション 内 で list が 指 すすべての person は、 以 下 により 印 刷 できます。class Print_person : public std::unary_function {private:std::ostream& out;public:explicit Print_person(std::ostream& o): out(o){};result_type operator()(const argument_type& p) const;{ out getName() list = obj->getLst();std::for_each(list->begin(), list->end(), Print_person(std::cout));};3.3.3 メソッド<strong>での</strong>コレクション 要 素 の 使 用 法通 常 、コレクション・プロキシの 実 際 のタイプが (T または d_ref ではなく) d_prim_coln_type または d_obj_coln_typeであることに 注 意 を 払 う 必 要 はありません。しかし、これらのタイプ (T または d_ref) は、 非 定 数 引 数 として 関 数 に 使用 することができません ( 定 数 引 数 としては 使 用 できます)。この 間 違 った 使 用 法 に 起 因 するコンパイル・エラーに 対 処 することができた 場 合 でも、 表 面 上 は 値 が 変 更 されていてもコレクション 内 の 値 は 変 更 されません。コレクションの 要 素 の 値を 適 切 に 変 更 するには、テンポラリを 使 用 し、その 後 プロキシ・オブジェクトの 要 素 に 変 更 された 値 を 割 り 当 てます。 以 下はその 例 です。d_ref p = (*list)[2];change_to_someone_else(p);(*list)[2] = p;24 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


ストリームの 使 用 法しかし、calc_some_value() がその 引 数 を 変 更 しなければ、 以 下 も 適 切 に 動 作 します。int val = calc_some_value((*list)[2]);3.3.4 コレクション・プロキシのデータ<strong>C++</strong> 標 準 ライブラリ・フレームワークに 適 合 するためには、コレクションのプロキシはデータを 持 つ 必 要 があります。つまり、 同 じコレクションの 2 種 類 のプロキシはサーバ 上 のデータ、およびコレクションの 表 記 を 変 更 しますが、お 互 いについて 関 知 しないため、 同 期 がとれない 可 能 性 があります。 同 じタイプのプロキシ・オブジェクト 経 由 でコレクションにアクセスしている 場 合 は、この 問 題 は 発 生 しません ( 通 常 はこの 用 法 )。しかし、そのタイプが 異 なる 場 合 は、 発 生 する 恐 れがあります。3.4 ストリームの 使 用 法<strong>Caché</strong> を 使 用 すると、 文 字 形 式 かバイナリ 形 式 のいずれかの 文 字 列 を 持 つストリームというプロパティを 生 成 できます。文 字 ストリームは 長 いテキスト 文 字 列 です。 例 えば、データ 入 力 画 面 の 自 由 形 式 テキスト・フィールドに 入 力 された 内 容などがこれにあたります。バイナリ・ストリームはイメージ・ファイルやサウンド・ファイルを 指 しており、 他 のデータベース・システムの BLOB (binary large object) に 類 似 しています。ストリームにデータを 書 き 込 んだり、ストリームからデータを 読み 取 ったりする 場 合 、<strong>Caché</strong> によってストリーム 内 <strong>での</strong> 位 置 が 監 視 されるので、 前 方 や 後 方 へ 移 動 することができます。以 下 に、<strong>Caché</strong> ストリーム・オブジェクトを 作 成 および 操 作 する 簡 単 なプログラムを 示 します。#include #include int main(){// establish the physical connection to Cache'Db_err conn_err;d_connection conn = tcp_conn::connect("localhost[1972]:Samples","_SYSTEM", "SYS", 0, &conn_err);// establish the logical connection to Cache'// database and create a low level stream object.db(conn);d_ref stream = d_char_stream::create_new(&db);// create an IOStreams extension stream object, put// "Hello, World!" in the stream, and rewind the streamd_iostream io(stream);io > s;std::cout


<strong>C++</strong> バインディングの 使 用 法class Sample_Employee : public Sample_Person {// codevirtual d_ref getCompany() const;virtual void setCompany(const d_ref&);// code};class Sample_Company : public Persistent_t {// codevirtual d_ref< d_relationship > getEmployees() const;virtual void setEmployees(const d_ref< d_relationship >&);// code};d_relationship クラス・テンプレートは、 反 復 子 begin() および end() と、 逆 反 復 子 rbegin() および rend() をサポートする 標 準 コンテナです。 以 下 に、このリレーションシップを 使 用 して 従 業 員 リストにアクセスする 簡 単 なプログラムを 示 します。#include "Sample_Company.h"#include "Sample_Employee.h"#include class Print_person : public std::unary_function {private:std::ostream& out;public:explicit Print_person(std::ostream& o): out(o){}result_type operator()(argument_type p) const{ out getName()


クエリの 使 用 法• パラメータの 設 定パラメータに 値 を 割 り 当 てます。template void set_par(int index, const D_TYPE& val);この 関 数 は、パラメータ index を val に 設 定 します。この 関 数 は、<strong>C++</strong> バインディングのあらゆるデータ 型 に 対 応 します。 同 じパラメータに 対 して、 数 回 呼 び 出 すこともできます。そのパラメータの 前 の 値 は、 消 去 されます。 新 しい 値 は同 じタイプである 必 要 はありません。• 実 行以 下 の 関 数 は、クエリを 実 行 します。すべてのパラメータが 結 合 されるまでは、これを 呼 び 出 さないでください。• フェッチvoid execute();取 得 可 能 なデータがあるかどうかを 調 べます。bool fetch();この 関 数 は、 結 果 セットから 次 の 行 を 取 得 しようとします。これが 成 功 した 場 合 に True を、 失 敗 した 場 合 に False を返 します。この 関 数 は、データをフェッチしません。これ 以 上 フェッチするデータがあるかどうかを 確 認 するだけです。• データの 検 索クエリの 実 行 が 成 功 すると、 各 レコードに 対 し 1 行 ずつ 結 果 セットを 返 します。 各 行 のデータは、 以 下 を 呼 び 出 して行 を 左 から 右 に 繰 り 返 すことにより、アクセスできます。void get_data(T* val);T は、<strong>C++</strong> バインディングのいずれのデータ 型 でもかまいません。d_string には、データの 変 換 方 法 を 指 定 できます。void get_data(d_string* val, str_conv_t conv = NO_CONV);既 定 では、データを 変 換 しません (“NO_CONV” 値 )。"CONV_TO_MB" はデータをマルチバイトに、"CONV_TO_UNI"はデータを Unicode に 変 換 します。各 呼 び 出 しの 後 、 暗 黙 の 反 復 子 は 次 の 列 に 移 動 します (したがって、get_data() を 2 回 呼 び 出 して、 同 じ 列 のデータに 2 回 アクセスすることはできません)。これにより、 実 装 はすべてのデータをクライアントに 格 納 する 必 要 がなくなります。そうでない 場 合 は、クエリの 使 用 が、 大 量 のメモリによるオーバーヘッドを 引 き 起 こすことになります。データに 対 し、ランダム・アクセスが 必 要 なアプリケーションは、 行 のすべてのデータを 最 初 に 読 み 取 る 必 要 があります。以 下 を 呼 び 出 すと、1 列 または 複 数 の 列 をスキップできます。void skip(int num_cols = 1)以 下 を 呼 び 出 すと、 次 に 処 理 される 列 のインデックスを 取 得 できます。int get_cur_idx();以 下 は、Sample.Person にクエリを 発 行 する 簡 単 な 関 数 です。void example(Database& db){d_query query(&db);d_string name;d_int id;d_date dob;const wchar_t* sql_query = L"select ID, Name, DOB from Sample.Personwhere ID > ? and FavoriteColors = ? ";int size = wcslen(sql_query);<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 27


<strong>C++</strong> バインディングの 使 用 法query.prepare(sql_query, size);query.set_par(1, 1);query.set_par(2, "Blue", 4);query.execute();}std::wcout


トランザクションの 使 用 法3.7.2 トランザクション・クラス・メソッドの 使 用 法Transaction クラスでは、 例 外 発 生 時 の 自 動 的 なロールバック 動 作 が 保 証 されます。commit() または rollback() のいずれも 呼 び 出 されていないときに、Transaction オブジェクトが 範 囲 外 になると、そのトランザクションはロールバックされます。このクラスでは、 入 れ 子 になったトランザクションは 許 可 されません。Transaction メソッドの 動 作 は 以 下 のとおりです。• Transaction() — コンストラクタがトランザクションを 開 始 します (tstart() の 呼 び 出 しを 必 要 とする Database オブジェクトとは 異 なります)。• Transaction::commit() — トランザクションをコミットします。 同 じ Transaction オブジェクトに 対 して commit() を 複 数回 呼 び 出 しても 何 も 実 行 されません ( 入 れ 子 になったトランザクションの 複 数 レベルでコミットを 実 行 するために 繰 り返 し 呼 び 出 すことのできる Database::tcommit() とは 異 なります)。• Transaction::rollback() — トランザクションをロールバックします。トランザクションがコミットまたはロールバックされる前 に Transaction オブジェクトが 範 囲 外 になると、 自 動 的 に 呼 び 出 されます。以 下 はその 例 です。for (i = 0; i < numPersons; i++) {Transaction tran(db);// perform the transaction{...}// transaction will rolled back if an exception// occurs before this pointif (goodtransaction)tran->commit();elsetran->rollback();}上 記 のように、Transaction オブジェクトは 以 下 でインスタンス 化 する 必 要 があります。Transaction tran(db);以 下 の 方 法 は 使 用 しません。Transaction tran = new Transaction(db);オブジェクトが new を 使 用 してヒープから 割 り 当 てられている 場 合 、そのオブジェクトは 範 囲 外 になっても 自 動 的 には 破棄 されないため、トランザクションはロールバックされません。Light <strong>C++</strong> バインディング<strong>での</strong>トランザクションの 使 用 法Light <strong>C++</strong> バインディング・アプリケーションでは、プロジェクション・クラスのメンバ 関 数 save()、delete_object()、insert()、または update() 内 で 例 外 がスローされると、 自 動 的 にロールバックが 発 生 します。Transaction クラスのインスタンスが 例外 のスローされた 範 囲 内 に 自 動 変 数 として 宣 言 されており、その 範 囲 内 で 例 外 がキャッチされない 限 り、 他 のコンテキストでスローされた 例 外 によってトランザクションが 自 動 的 にロールバックされることはありません。<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 29


4ダイナミック・バインディング<strong>C++</strong> クラスを 生 成 する 代 わりに、Dyn_obj クラスを 使 用 すると、 動 的 に <strong>Caché</strong> クラスを 操 作 できます。したがって、 汎 用 クラスを 扱 い、 特 定 の <strong>Caché</strong> クラスに 依 存 しないアプリケーションやツールを 記 述 する 際 に 役 立 ちます。しかし、この 一 般的 な 方 法 は、<strong>C++</strong> コンパイラがコードを 静 的 に 分 析 しないため、パフォーマンスの 低 下 を 招 きます。プログラムの 記 述 時にどのクラスが 必 要 であるかがわかっている 場 合 は、 生 成 されたクラスを 使 用 することをお 勧 めします。4.1 Dyn_obj プロキシの 構 築他 のプロキシと 同 様 に、プロキシ・オブジェクトを 生 成 するために、Dyn_obj は 以 下 のメソッドを 持 ちます。static d_ref openref(Database* db,int ref,const_name_t type); // const_name_t is a typedef for const wchar_t*static d_ref create_new(Database* db,const_name_t type,const_str_t init_val = 0, // const_str_t is a typedef of const wchar_t*Db_err* err = 0);static d_ref open(Database* db,const d_binary& oid,int concurrency = -1,int timeout = -1,Db_err* err = 0);static d_ref openid(Database* db,const_name_t type,const_str_t id,int concurrency = -1,int timeout = -1,Db_err* err = 0);生 成 されたクラスの 同 じメソッドとこれらとの 違 いは、クラスの 名 前 に 対 する 追 加 のパラメータのみです。さらに、Dyn_obj は init() というメソッドを 持 ちます。これにより、Dyn_obj の get_property()、run_obj_method()、およびrun_class_method() の 各 メソッドの 結 果 から、Dyn_obj インスタンスを 構 築 できます。static d_ref init(t_istream& in, Database* db);4.2 Dyn_obj メソッドの 呼 び 出 しからの 値 の 構 築Dyn_obj メソッドの 呼 び 出 しから 返 されるすべての 値 は、t_istream (トランスポート 入 力 ストリーム) 内 部 に 返 されます。 値がデータ 型 のインスタンスである 場 合 、 以 下 のように t_istream のみから 構 築 することができます。<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 31


ダイナミック・バインディングd_int val(in);ここで、in は t_istream のタイプです。値 がオブジェクトである 場 合 、t_istream はその OREF とクラス 名 を 含 みます。つまり、Database オブジェクトも 必 要 であることを 意 味 します。コンパイル 時 に 返 されるオブジェクトのタイプがわかっている 場 合 は、そのタイプの openref() メソッドを 使 用 することもできます。 例 えば、Sample.Person タイプのオブジェクトが 返 される 場 合 、そのオブジェクトは 以 下 のように 構 築 できます。d_ref p = Sample_Person::openref(db, d_int(in));d_int(in) は、OREF を 含 む 一 時 的 な d_int 値 を 生 成 し、d_int 値 を int に 変 換 します。それ 以 外 の 場 合 は、 以 下 のように構 築 できます。d_ref p = Dyn_obj::openref(in, db);オブジェクトのタイプは、 入 力 ストリームから 読 み 取 ります。init() メソッドのシグニチャは、 他 の D_type インスタンスからのコンストラクタと 一 致 しますが、Database ポインタが 0 でない 場 合 は 一 致 しません。4.3 プロパティとメソッド一 度 Dyn_obj プロキシを 構 築 すると、これを 使 用 してプロパティ 値 を 取 得 して 設 定 し、クエリを 実 行 し、メソッドを 実 行 することができます。t_istream& get_property(const_name_t prop_name);void set_property(const_name_t prop_name, D_type* val);void get_query(const_name_t query_name, d_query& query) const;// const_name_t is a typedef for const wchar_t*メソッドを 実 行 するには、 引 数 へのポインタ (D_type*) の 配 列 と 引 数 の 数 をそのメソッドに 渡 す 必 要 があります。 以 下 のように、Database オブジェクトにより 割 り 当 てられたバッファを 使 用 できます。D_type* args[2];args[0] = &arg1;args[1] = &arg2;// codeこれは、max_num_obj_args ポインタ ( 引 数 の 最 大 許 容 数 ) を 格 納 できます。run_obj_method() のシグニチャは、 以 下 のとおりです。t_istream& run_obj_method(const_name_t mtd_name,D_type** args,int num_args);// const_name_t is a typedef for const wchar_t*クラス・メソッドを 実 行 するには、 以 下 の run_class_method() を 使 用 できます。static t_istream& run_class_method(Database* db,const_name_t cl_name, // const_name_t is a typedef for const wchar_t*const_name_t mtd_name,D_type** args,int num_args);参 照 により 渡 される 引 数 の 値 は、これらのメソッド 内 部 で 変 更 されます。 以 下 はその 例 です。const_name_t cl_name = __NAME_V(Sample.Person);D_type* args[2];32 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


プロパティとメソッドd_ref p = Dyn_obj::openid(db, cl_name, __STRING_V(1));// create a proxyd_string dob(p->get_property(__NAME_V(DOB)));// get date of birthd_int arg1(2);d_int arg2(3);args[0] = &arg1;args[1] = &arg2;d_int res = p->run_obj_method(__NAME_V(Addition), args, 2);args[0] = &dob;d_int age =Dyn_obj::run_class_method(db, cl_name, __NAME_V(CurrAge), args, 1);d_query by_name(db);p->get_query(__NAME_V(ByName), by_name);注 釈引 数 の 配 列 にあるポインタは、 一 時 的 な 変 数 を 指 すことはできません。 以 下 のようなコードは、クラッシュを 引 き起 こす 可 能 性 があります。args[ii] = &d_int(1); // DO NOT USE!<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 33


5Light <strong>C++</strong> バインディングLight <strong>C++</strong> バインディング (LCB) は、 高 いパフォーマンスを 主 な 目 標 としたアプリケーションの 中 でも 最 も 有 用 なアプリケーションであり、そのクラス 設 計 は 比 較 的 単 純 です。 特 別 な 目 的 を 持 つ <strong>C++</strong> バインディングの 限 定 されたサブセットであり、 主 に、 永 続 データベースに 高 速 にデータをロードする 必 要 のあるアプリケーション<strong>での</strong> 使 用 を 意 図 しています。 例えば、 未 処 理 のリアルタイム・データを 高 速 に 取 得 する 一 部 のアプリケーションでは、 一 般 に、データをメモリ 内 のデータベースに 格 納 してから、 処 理 および 永 続 ストレージへの 転 送 を 実 行 する 必 要 があります。LCB を 使 用 すれば、 同 レベルのパフォーマンスを 確 保 しながら、フェイルオーバー 機 能 を 利 用 することも 可 能 です。これをメモリ 内 のデータベースで行 うことはできません。オブジェクトの 基 本 的 な 操 作 (オブジェクトの 作 成 、ID によるオブジェクトのオープン、 更 新 、および 削 除 ) について、LCBを 標 準 的 な <strong>C++</strong> バインディングと 比 較 すると、 処 理 が 10 ~ 20 倍 も 高 速 になります。LCB アプリケーションの 制 約追 加 された 高 速 性 との 最 も 重 要 なトレードオフは、 格 納 対 象 オブジェクトの 複 雑 さに 制 限 が 設 けられていることです。LCBアプリケーションに 対 する 主 な 制 約 は 以 下 のとおりです。• <strong>Caché</strong> は “ 最 小 ” または “ 通 常 ” のセキュリティ・オプションでインストールする 必 要 があります。• ダイナミック・バインディングは 実 行 されません (コード 生 成 時 にクラスがわかっている 必 要 があります)。• 投 影 された LCB オブジェクトに 対 応 する <strong>Caché</strong> オブジェクトがサーバ 上 のメモリにはないため、<strong>Caché</strong> のメソッド 呼び 出 しを 使 用 することはできません。• 既 定 のストレージ 構 造 を 使 用 する 必 要 があります。• 挿 入 時 の ID キーの 重 複 のチェック ("エラーのチェック" を 参 照 ) や 一 意 のインデックスの 重 複 のチェックを 除 いて、整 合 性 制 約 はなく、データ 検 証 も 行 われません。• 登 録 クラス ( 一 時 的 なクラス) はありません。• Transient プロパティまたは Calculated プロパティはありません。• データ 型 のリストまたは 配 列 以 外 のコレクションはありません。• ストリーム、リレーションシップ、または 保 存 された OID はありません。• プロパティおよびインデックスには、%Integer、%Float、%Decimal、%Double、%String、%Date、%Time、%TimeStamp、および %Currency の <strong>Caché</strong> データ 型 クラスのみがサポートされます。• ID キー・プロパティの 型 は %String、%Integer、または %Date である 必 要 があります。• 標 準 のインデックスおよびビットマップ・インデックスのみを 使 用 します (ビットスライス・インデックスは 使 用 しません)。• トリガは 実 行 されません (SQL を 使 用 した 場 合 を 除 く)。• 標 準 以 外 の LogicalToStorage 変 換 または StorageToLogical 変 換 は 行 われません。<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 35


Light <strong>C++</strong> バインディング• サポートされる 照 合 タイプは、SQL 文 字 列 、SQL UPPER および EXACT のみです。LCB のインストール 要 件 の 詳 細 は、"Light <strong>C++</strong> バインディングのインストール" を 参 照 してください。5.1 Light <strong>C++</strong> バインディング・アーキテクチャLCB によってパフォーマンスが 向 上 する 主 な 理 由 は、<strong>C++</strong> アプリケーションが <strong>Caché</strong> オブジェクト・サーバとより 高 速 に通 信 することにあります。LCB では、<strong>Caché</strong> を 個 別 のサーバ・プロセスとして 実 行 する、 標 準 バインディングのクライアント/サーバ・アーキテクチャは 使 用 しません。 代 わりに、<strong>Caché</strong> を DLL または 共 有 オブジェクトとしてロードし、アプリケーション・プロセスの 一 部 として 実 行 します。 以 下 の 図 は、この 構 造 を 示 しています。図 5–1: Light <strong>C++</strong> バインディング・アーキテクチャLCB と 標 準 <strong>C++</strong> バインディングは 共 に <strong>Caché</strong> <strong>C++</strong> ジェネレータおよび <strong>Caché</strong> <strong>C++</strong> バインディング・ライブラリを 使 用 しますが、 実 行 時 に 大 きな 違 いがあります。• LCB では、<strong>Caché</strong> と 通 信 する 際 、<strong>Caché</strong> カーネルやオブジェクト・サーバのプロセス 間 呼 び 出 しに、TCP/IP ではなくコールイン・インタフェースを 使 用 します。サーバと <strong>C++</strong> アプリケーションは 同 じマシン 上 にある 必 要 がありますが、アプリケーションで <strong>Caché</strong> ECP を 使 用 して、リモート・マシンのデータにアクセスすることも 可 能 です。• 単 純 なクラスについて、LCB では、サーバ・ルーチンを 完 全 にバイパスし、コールイン 関 数 を 使 用 してオブジェクトのロードおよびファイリングを 直 接 実 行 します。コールイン・インタフェースは、<strong>Caché</strong> データベースへのアクセスにおいて、 非 常 に 効 率 的 な 低 レベルの 関 数 を 提 供 します。• オブジェクトは、 対 応 する <strong>C++</strong> オブジェクトに <strong>Caché</strong> データベースから 直 接 ロードされます。<strong>Caché</strong> サーバでは、これらのオブジェクトのコピーはメモリに 保 持 されません。つまり <strong>C++</strong> オブジェクトは、サーバ 上 のオブジェクトのプロキシとして 機 能 するだけでなく、 実 際 のデータを 含 みます。• <strong>C++</strong> オブジェクトには、データのメモリ 内 にのみ 存 在 するコピーが 含 まれているため、<strong>Caché</strong> オブジェクト・サーバと永 続 データベースが 接 続 されていなくても、<strong>C++</strong> アプリケーションはそれらのオブジェクトを 使 用 して 処 理 を 継 続 できます。これは、2 つ 以 上 のスレッドで 接 続 を 共 有 するマルチスレッド・アプリケーションにおいて 特 に 重 要 です。• ほとんどの LCB プロパティは 標 準 バインディングと 同 様 に 動 作 しますが、 非 数 値 型 の getter は 参 照 を 最 適 化 として 返 します。 例 えば、string プロパティの getter では、シグニチャが 以 下 のようになります。virtual const d_string& getname() const;36 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


<strong>Caché</strong> <strong>C++</strong> ライブラリの LCB クラス5.2 <strong>Caché</strong> <strong>C++</strong> ライブラリの LCB クラス<strong>Caché</strong> <strong>C++</strong> ライブラリは、 特 別 な 一 連 のクラスを 使 用 して Light <strong>C++</strong> バインディングを 実 装 します。これらのほとんどは、標 準 のバインディングで 使 用 されるクラスの LCB バージョンです。 以 下 のクラスは、LCB アプリケーションに 必 要 な 機 能を 提 供 します。• LC_Persistent_t — LCB 永 続 プロジェクション・クラスの 生 成 に 使 用 されるベース・クラスです。これは Persistent_t のLCB バージョンです ("プロキシ・クラスの 生 成 " を 参 照 してください)。• LC_Serial_t — LCB シリアル・プロジェクション・クラスの 生 成 に 使 用 されるベース・クラスです。• LC_Database — Database の LCB バージョンです。• lc_conn — tcp_conn の LCB バージョンです。• lc_d_ref — LCB オブジェクトの 参 照 クラス・テンプレートです ("プロキシ・オブジェクトの 使 用 法 " を 参 照 してください)。d_ref の LCB バージョンです。• LC_Batch — 高 速 挿 入 を 実 現 するための 代 替 インタフェースとなる 特 別 なバッチ 挿 入 クラスです。5.3 接 続 およびマルチスレッドLCB 接 続 では 以 下 のクラスを 使 用 します。• d_connection — 物 理 接 続 のハンドルです。このクラスは LCB と 標 準 バインディングの 両 方 で 使 用 されます。• LC_Database — 標 準 の Database クラスのサブクラスです。Database 同 様 、 開 いている d_connection から 初 期 化されます。• lc_conn — 標 準 の tcp_conn クラスの 代 わりに 使 用 される LCB 接 続 クラスです。 接 続 メソッド lc_conn::connect() の 構文 は、tcp_conn::connect() と 同 じです。以 下 のコード 例 は、これらのクラスがどのように 使 用 されるかを 示 しています。このコード 内 の 呼 び 出 しを "<strong>Caché</strong> データベースへの 接 続 " の 例 と 比 較 してください。クラス 名 のみが 変 更 されています。# include "lc_connection.h"# include "lc_database.h"Db_err conn_err;d_connection conn = lc_conn::connect(conn_str, user, pwd, timeout, &conn_err);LC_Database db(conn);重 要すべての LCB アプリケーションでは、GLOBALS_HOME 環 境 変 数 は <strong>Caché</strong> インスタンスのルート・ディレクトリに 設 定 する 必 要 があります (“LCB 追 加 条 件 ” 参 照 )。この 環 境 変 数 が 設 定 されていないと、すべての 接 続 の 試 行 に 失 敗 します。5.3.1 マルチスレッドLCB はスレッドセーフであり、コールイン・インタフェースを 使 用 して、マルチプロセッサ・マシン<strong>での</strong>マルチスレッドを 利用 した 並 列 処 理 を 実 現 します。パフォーマンスはマルチスレッド・コールイン・アプリケーションに 類 似 しています。コールイン・アプリケーションとは 異 なり、LCB アプリケーションではクラス 定 義 が 変 更 されるたびに <strong>C++</strong> コードを 再 生 成 できるため、クラスの 実 装 に 関 する 詳 しい 知 識 は 必 要 ありません。<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 37


Light <strong>C++</strong> バインディング各 スレッドでは、 独 立 したデータベース 接 続 (d_connection オブジェクトおよび LC_Database オブジェクトの 両 方 を 含 む)を 使 用 する 必 要 があります。LC_Database のメンバ 関 数 または LC_Database インスタンスに 接 続 したプロジェクション・オブジェクトのメンバ 関 数 を、LC_Database オブジェクトを 作 成 したスレッドとは 異 なるスレッドで 呼 び 出 すと、"Databaseconnection may not be shared by multiple threads" という 例 外 がスローされます。マルチスレッド 化 された LCB コードの 例 は、\Dev\cpp\samples にある mttest.cpp および qtest.cpp のサンプル・プログラムを 参 照 してください (ご 使 用 のシステムの の 場 所 については、"<strong>Caché</strong> インストール・ガイド" の "<strong>Caché</strong> の 既 定 のインストール・ディレクトリ" を 参 照 してください)。5.3.2 接 続 および 複 数 のスレッドプロジェクション・オブジェクトは 一 度 に 1 つのデータベース 接 続 にしか 接 続 できず、そのデータベース 接 続 が 作 成 されたスレッド 内 <strong>での</strong>み 使 用 可 能 です。1 つのプロジェクション・オブジェクトを 複 数 のスレッドで 使 用 するには、プロジェクション・オブジェクト・メソッドの disconnect() および connect() を 使 用 します。 接 続 の 状 態 を 判 断 するには、is_connected() メソッドを 使 用 します。• プロジェクション・オブジェクトは、create_new() または openid() によって 返 された 場 合 のみ 接 続 されます。• プロジェクション・オブジェクトの 接 続 を 切 断 するには、その 前 にプロジェクション・オブジェクトのアタッチを 解 除 する必 要 があります ("LCB オブジェクトのアタッチと 解 除 " を 参 照 してください)。 接 続 を 切 断 しないと、 別 のデータベース 接 続 に ( 再 ) 接 続 することはできません。• connect() および disconnect() を 使 用 すると、1 つのスレッドをプロジェクション・オブジェクトのファクトリにでき、このオブジェクトが 異 なるスレッドでデータベースに 挿 入 されます。• データベースにアクセスするプロジェクション・オブジェクトのメンバ 関 数 ではスレッドの 親 和 性 が 指 定 されますが、get() および set() 関 数 では 指 定 されないため、スレッドセーフにはなりません。• 独 立 したデータベース 接 続 は、 異 なるスレッドで 並 行 して 使 用 できます。5.3.3 LCB オブジェクトのアタッチと 解 除<strong>C++</strong> オブジェクトには、データのメモリ 内 にのみ 存 在 するコピーが 含 まれているため、<strong>Caché</strong> オブジェクト・サーバと 永 続データベースが 接 続 されていなくても、<strong>C++</strong> アプリケーションはそれらのオブジェクトを 使 用 して 処 理 を 継 続 できます。これは、2 つ 以 上 のスレッドでオブジェクトを 共 有 するマルチスレッド・アプリケーションにおいて 特 に 重 要 です。オブジェクトは 以 下 の 場 合 にアタッチされます。• openid() から 返 されたか、オブジェクトが 作 成 されて save() または insert() が 呼 び 出 された 場 合オブジェクトは 以 下 の 場 合 にアタッチを 解 除 されます。• create_new() から 返 された 場 合• delete_object() の 呼 び 出 しによって 削 除 された 場 合• detach() が 呼 び 出 された 場 合5.3.4 トランザクションおよびマルチスレッド各 スレッド/データベース 接 続 には、 独 自 のトランザクション・コンテキストがあります。• <strong>Caché</strong> には、 各 スレッドが 独 立 したプロセスのように 見 えます。2 つのスレッドで 同 じ 接 続 オブジェクトを 使 用 することはできません。• あるスレッドによって 取 得 されたロックがあり、 別 のスレッドで 同 じロックを 取 得 しようとすると、そのロックによって 試 行がブロックされます。38 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


LCB <strong>での</strong>オブジェクトの 使 用 法• Database トランザクション・メソッドの tstart()、tcommit()、および trollback() ("トランザクションの 使 用 法 " を 参 照 ) は、呼 び 出 し 元 のスレッドにのみ 影 響 します。5.4 LCB <strong>での</strong>オブジェクトの 使 用 法LCB の 投 影 されたオブジェクトは、 標 準 の <strong>C++</strong> バインディング・オブジェクトといくつかの 点 で 異 なります。 以 下 の 場 合 、これらの 違 いについて 理 解 していることが 重 要 です。• 永 続 オブジェクト 参 照 をプロパティとして 使 用 する 場 合• 他 の 永 続 クラスから 継 承 するクラスを 使 用 する 場 合• 埋 め 込 みシリアル・オブジェクト・プロパティを 使 用 する 場 合• リストおよび 配 列 プロパティを 使 用 する 場 合5.4.1 永 続 オブジェクト 参 照 をプロパティとして 使 用 する<strong>Caché</strong> クラスが 永 続 クラスをプロパティとして 使 用 する 場 合 、LCB は、そのプロパティを 永 続 オブジェクトへの 参 照 として投 影 します。 各 永 続 参 照 プロパティは、 参 照 オブジェクトをポイントする lc_d_ref と、オブジェクトの ID を 表 す 文 字 列で 構 成 されます。プロパティ・アクセサは lc_d_ref& を 取 得 して 設 定 します。ここで LC_xxx は、プロパティのクライアント・タイプを 示 します ( 例 えば LC_User_Person は、<strong>Caché</strong> クラス User.Person のクライアント・タイプです)。 論 理 的 に、アクセサは 以 下 のように 動 作 します。• getter — オブジェクト・ポインタが Null で ID 文 字 列 が Null でない 場 合 、openid() を 呼 び 出 して ID 文 字 列 を 返された ID に 設 定 し、オブジェクト・ポインタを 返 します。オブジェクト・ポインタと ID 文 字 列 の 両 方 が Null の 場 合 は、Null オブジェクト・ポインタを 返 します。• setter — オブジェクト・ポインタを 参 照 オブジェクトに 設 定 します。オブジェクトに ID がある 場 合 は ID 文 字 列 にそのID を 設 定 し、ID がない 場 合 は ID 文 字 列 を Null または 空 に 設 定 します。例 えば、 永 続 クラス Sample.Office のプロパティ Office を 含 む、<strong>Caché</strong> クラスの Sample.Employee を 考 えます。各 クラスには、ユーザが 割 り 当 てた ID キー (オフィスのある 市 区 町 村 の Office および 従 業 員 名 の Employee) があります。 以 下 の 例 は、ニューヨーク・オフィスの Office オブジェクトと John Kent の Employee オブジェクトを 開 いています。Kent が 現 在 ボストン・オフィスに 割 り 当 てられている 場 合 は、ニューヨーク・オフィスへの 再 割 り 当 てを 行 います。lc_d_ref o = LC_Sample_Office::openid(db, "New York");lc_d_ref e = LC_Sample_Employee::openid(db, "Kent, John");if (e->getOffice()->getCity() = "Boston") {e->setOffice(o);e->save();}永 続 参 照 プロパティを 含 むクラスについて 生 成 されたコードでは、save() 関 数 、および 永 続 参 照 プロパティの getter関 数 と setter 関 数 は、 通 常 どおりに .h ファイルにインラインで 生 成 されるのではなく、.cpp ファイルに 生 成 されます。これにより、 投 影 されたクラスの .h ファイルが、 循 環 参 照 によって 自 身 を 間 接 的 に 含 めないようにします。他 の getter 関 数 とは 異 なり、 永 続 参 照 プロパティの getter 関 数 は const として 宣 言 されません。これは、 参 照 オブジェクトをスウィズルさせる 際 に、その 参 照 オブジェクトを 変 更 する 必 要 があるためです。<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 39


Light <strong>C++</strong> バインディング5.4.2 他 の 永 続 クラスから 継 承 するクラスを 使 用 するLight <strong>C++</strong> バインディングでは、そのクラスを 他 の 永 続 クラスから 継 承 する 永 続 オブジェクトの 取 得 および 更 新 をサポートしています。 継 承 するクラスに 対 するバッチ 挿 入 はサポートされません。<strong>Caché</strong> クラスの LCB プロジェクション・クラスは、その <strong>Caché</strong> クラスのスーパークラスからプロジェクション・クラスを 継 承 します。 多 重 継 承 の 場 合 、これはスーパークラスのリストの 最 初 のクラスにのみ 適 用 されます。 他 のスーパークラスは LCBに 対 して 透 過 的 であり、それらのプロパティは、そのサブクラスに 直 接 属 するものとして 認 識 されます。スーパークラスからサブクラスのオブジェクトを 開 く他 のクラスから 継 承 するクラスのオブジェクトは、そのサブクラスの <strong>C++</strong> コードが 生 成 されアプリケーションにリンクされている 場 合 、 継 承 したスーパークラスの openid メソッドで 開 くことができます。例 えば、クラス LC_Sample_Person から 継 承 するクラス LC_Sample_Employee を 考 えます。 変 数 sub_id にLC_Sample_Employee オブジェクトの ID が 含 まれる 場 合 、 以 下 の 文 を 使 用 してオブジェクトを 開 くことができます。lc_d_ref newemployee = LC_Sample_Person::openid(db, sub_id);LCB は 対 象 オブジェクトの 実 際 のクラスを 検 出 し、サブクラス LC_Sample_Employee のオブジェクトとして newemployeeを 透 過 的 に 開 きます。LCB では、そのストレージ・オペレーションをクライアント 側 のコードで 実 行 するため、オブジェクトの 実 際 のクラスを 認 識している 必 要 があります。サブクラスについて 生 成 されたコードがアプリケーションにリンクされていないと、LCB ではオブジェクトをそのクラスとして 開 くことができません。 代 わりに、そのオブジェクトを、リンクされたコードが 使 用 可 能 なサブクラスの 最 も 近 い 祖 先 として 開 きます。この 場 合 、アプリケーションが 該 当 オブジェクトを 更 新 または 削 除 しようとすると 例外 がスローされます。これは、LCB ではすべてのインデックス・エントリが 正 しく 更 新 または 削 除 されることを 保 証 できないためです。LCB では、オブジェクトを 最 も 具 体 的 な 可 能 性 のあるサブクラスとして 透 過 的 に 開 きます。そのため、 同 じオブジェクトが一 度 はスーパークラスから、もう 一 度 はサブクラスから 開 かれると、 両 方 の lc_d_ref はメモリ 内 の 同 じサブクラス・オブジェクトを 参 照 します。注 釈LCB とは 異 なり、 標 準 の <strong>C++</strong> バインディングでは、オブジェクトを、openid メソッドが 呼 び 出 されたクラスであるという 以 上 に、より 具 体 的 なサブクラスとして 透 過 的 に 開 くことはできません。ただし、 標 準 のバインディングでは、(オブジェクトの 実 際 のクラスを 認 識 している) <strong>Caché</strong> サーバ 上 で 実 際 のストレージ・オペレーションがすべて 行 われるため、 実 際 にはサブクラスのオブジェクトである、スーパークラスから 開 いたオブジェクトを 更 新 したり 削 除 したりすることができます。5.4.3 埋 め 込 みシリアル・オブジェクト・プロパティを 使 用 するLCB オブジェクトでは、 埋 め 込 みシリアル・オブジェクトをプロパティとして 持 つことができます。LCB シリアル・プロパティには、そのプロパティのタイプへのポインタを 返 す getter 関 数 があります。 例 えば、<strong>Caché</strong> クラスの Sample.Personに、シリアル・クラス Sample.Address のプロパティ Home が 含 まれている 場 合 を 考 えます。 投 影 されたシリアル・プロパティの getter 関 数 は LC_Sample_Address *getHome() のようになります。 以 下 の 例 は、ある 人 物 の 自 宅 の 住 所から 古 い 番 地 を 取 得 し、 新 しい 番 地 の 値 を 割 り 当 てています。lc_d_ref p = LC_Sample_Person::openid(db, 1);d_string oldStreet;d_string newStreet("Broadway");oldStreet = p->getHome()->getStreet();p->getHome()->setStreet(newStreet);p->save();(%SerialObject に 基 づいて <strong>Caché</strong> クラスから 投 影 された) LCB シリアル・クラスは、LC_Serial_t を 継 承 します。LCB シリアル・クラスについて 生 成 されたコードは、(.h ファイルと .cpp ファイルの 両 方 にコードを 持 つ 永 続 LCB クラスとは 異 な40 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


標 準 の LCB プロジェクション・クラス・メソッドり) ヘッダ・ファイルのみで 構 成 されます。 例 えば、LC_Sample_Address.h という 名 前 のヘッダ・ファイルには、<strong>Caché</strong>クラス Sample.Address について 生 成 されたプロジェクション・コードのみが 含 まれます。5.4.4 リストおよび 配 列 プロパティを 使 用 するLCB で 使 用 できるコレクション・タイプは、データ 型 のリストまたは 配 列 のみです。%Integer、%Float、%Decimal、%Double、%String、%Date、%Time、%TimeStamp、および%Currency の <strong>Caché</strong> データ 型 クラスがサポートされています (これらのデータ 型 の 詳 細 は、" 単 純 なデータ 型 クラスのリファレンス" を 参 照 してください)。32K を 超 えるリストおよび 配 列 を 保 存 するには、 長 い 文 字 列 の 使 用 を 有 効 にする 必 要 があります。システム 全 体 で 長 い文 字 列 のサポートを 有 効 にするには、 管 理 ポータルを 開 き、[システム] > [ 構 成 ] > [メモリと 開 始 設 定 ] を 選 択 して、[LongString 有 効 ] チェック・ボックスにチェックを 付 けます。$ZUTIL(69,69) を 使 用 すると、 長 い 文 字 列 の 設 定 を 一 時 的 にオーバーライドできます。データ 型 のリストLCB はリスト・プロパティを std::vector として 投 影 します。ここで d_xxx は 有 効 な LCB データ 型 のクラスです。 例 えば、%String のリストは std::vector として 投 影 されます。データ 型 の 配 列LCB は 配 列 プロパティを std::map として 投 影 します。ここで d_xxx はプロパティの 配 列 要 素のデータ 型 です。 例 えば、%String の 配 列 は std::map として 投 影 されます。重 要<strong>Caché</strong> クラスで 配 列 プロパティを 定 義 する 際 、プロパティ・パラメータ STORAGEDEFAULT は list に 設定 する 必 要 があります。 例 えば、<strong>Caché</strong> クラスでは %String 配 列 を 以 下 のように 定 義 します。Property MyArray As array Of %String(STORAGEDEFAULT = "list");既 定 のパラメータ 値 array は LCB ではサポートされません。5.5 標 準 の LCB プロジェクション・クラス・メソッド<strong>C++</strong> ジェネレータは、 一 連 のメソッドと 共 に LCB プロジェクション・クラスを 提 供 します。これらのメソッドは、 標 準 のプロキシ・クラスに 対 して 生 成 されたメソッドに 類 似 しています (" 標 準 のプロキシ・クラス・メソッド" を 参 照 してください)。このセクションで 説 明 するメソッドは、すべてのプロジェクション・クラスに 追 加 されます。BuildIndices()connect()<strong>Caché</strong> %BuildIndices クラス・メソッドを 起 動 して (%Library.Persistent を 参 照 )、クラスのインデックスを 完 全 に 再構 築 します。(defer_indices を true に 設 定 して 呼 び 出 された) save() または delete_object() の 後 に 使 用すると、パフォーマンスが 向 上 する 場 合 があります。static InterSystems::d_status BuildIndices(InterSystems::LC_Database * db)プロジェクション・オブジェクトをデータベース 接 続 に 接 続 (または 再 接 続 ) します。オブジェクトが 切 断 されていない 場 合 は 例 外 がスローされます。void connect(InterSystems::LC_Database * db)<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 41


Light <strong>C++</strong> バインディングcreate_new()delete_object()detach()direct_save()新 規 プロジェクション・オブジェクトを 作 成 します。このプロジェクション・オブジェクトは、save() または insert() を呼 び 出 すまでデータベースに 保 存 されません。save() を 呼 び 出 すとオブジェクトがアタッチされ、 再 度 save() を呼 び 出 すとオブジェクトが 更 新 されます。save() を 使 用 して 別 の 新 規 オブジェクトを 作 成 するには、 最 初 にもう 一度 create_new() を 呼 び 出 すか、detach() を 呼 び 出 す 必 要 があります。static lc_d_ref create_new(LC_Database* db,const_str_t init_val = 0, // const_str_t is a typedef of const wchar_t*Db_err* err = 0)LC_Persistent_t から 継 承 された create_new() メソッドは、 特 定 のクラス (lc_d_ref。ここで LCBclassはプロジェクション・クラスの 名 前 ) への 参 照 を 返 すバージョンによってオーバーライドされます。開 いているオブジェクトをデータベースから 削 除 します。このメソッドを 使 用 すると、プロジェクション・オブジェクトを 破 棄 することなく、 開 いているオブジェクトをデータベースから 削 除 できます。d_status delete_object(bool defer_indices = false,int timeout = -1,Db_err* err = 0)delete_object() を 呼 び 出 した 後 も、プロジェクション・オブジェクトにはプロパティのデータ 値 が 含 まれていますが、アタッチは 解 除 されています。オブジェクトがロックされている 場 合 、ロックは 解 除 されます。delete_object() の 直 後 に save() を 呼 び 出 すと、 明 示 的 に 異 なる 値 に 設 定 されたプロパティを 除 き、 同 じ 値 を 持つデータベース・オブジェクトが 新 規 に 作 成 されます。データベース 内 のオブジェクトから、プロジェクション・オブジェクトのアタッチを 解 除 します (オブジェクトがアタッチされていない 場 合 は 使 用 できません)。 保 持 されたロックがオブジェクトで 維 持 されている 場 合 、ロックは 解 除されます。void detach()プロパティ 値 はプロジェクション・オブジェクトに 保 持 されます。これにより、プロジェクション・オブジェクトを 再 利用 した、 複 数 の 新 しいデータベース・オブジェクトの 作 成 が 可 能 になります。また、create_new() を 呼 び 出 して 同じ 値 を 持 つプロパティを 複 数 のオブジェクトにコピーするオーバーヘッドが、 回 避 されます。新 しいオブジェクトを 作 成 するための、パフォーマンスの 非 常 に 高 い 代 替 インタフェースです。これにより、プロジェクション・オブジェクトのインスタンス 化 およびデータ 変 換 のオーバーヘッドが 回 避 されます。 新 しいオブジェクトの 挿 入 にのみ 使 用 でき、 既 存 オブジェクトの 更 新 には 使 用 できません。direct_save() は、Unicode データベースで 使 用 できますが、 文 字 列 には ASCII 文 字 のみを 使 用 できます。static d_status direct_save(LC_Database* db,const char *,...,const char *)パラメータ ... はクラスのプロパティを 示 します。このメソッドではインデックス・エントリは 作 成 されません ( 保 存 を 実 行 した 後 は、BuildIndices() を 使 用 できます)。42 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


標 準 の LCB プロジェクション・クラス・メソッドdisconnect()id()insert()is_attached()is_connected()openid()プロジェクション・オブジェクトをデータベース 接 続 から 切 断 します。オブジェクトのアタッチを 解 除 していなかったり、オブジェクトの 現 在 のデータベース 接 続 が 異 なるスレッドで 作 成 されていたりした 場 合 は、 例 外 がスローされます。void disconnect()アタッチされたオブジェクトから ID を 取 得 します。*buf パラメータには、マルチバイト 文 字 列 または Unicode文 字 列 のいずれかを 指 定 できます。int id(wchar_t *buf,size_t bufsiz)int id(char *buf,size_t bufsiz)データベースに 新 しいオブジェクトを 挿 入 します。d_status insert(bool defer_indices = false,int timeout = -1,Db_err* err = 0)insert() をアタッチされているオブジェクトに 対 して 呼 び 出 すと、オブジェクトのアタッチが 解 除 され、 同 じプロパティ 値 を 持 つ 新 しいオブジェクトの 挿 入 が 試 行 されます。ユーザが 割 り 当 てた ID キーでは、これによって IDキーの 重 複 例 外 が 発 生 します。プロジェクション・オブジェクトがアタッチされている 場 合 は、true を 返 します。bool is_attached()プロジェクション・オブジェクトが 現 在 データベースに 接 続 されている 場 合 は、true を 返 します。bool is_connected()ID で 指 定 された 既 存 のオブジェクトを 開 きます。プロジェクション・オブジェクトのデータ・メンバがデータベース・オブジェクトの 現 在 の 値 に 設 定 され、プロジェクション・オブジェクトがデータベース・オブジェクトにアタッチされます。static lc_d_ref openid(LC_Database* db,const_str_t ident,// const_str_t is a typedef of const wchar_t*int concurrency = -1,int timeout = -1,Db_err* err = 0)static lc_d_ref openid(LC_Database* db,const char * ident,int concurrency = -1,int timeout = -1,Db_err* err = 0)<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 43


Light <strong>C++</strong> バインディングident パラメータには、マルチバイト 文 字 列 または Unicode 文 字 列 のいずれかを 指 定 できます。LC_Persistent_tから 継 承 された openid() メソッドは、 特 定 のクラス (lc_d_ref。ここで LCBclass はプロジェクション・クラスの 名 前 ) への 参 照 を 返 すバージョンによってオーバーライドされます。release_shared_lock()save()プロジェクション・オブジェクトが 並 行 処 理 モード LC_CONCURRENCY_SHARED_RETAINED で 開 かれている 場合 に、 共 有 ロックを 明 示 的 に 解 除 します ("LCB および 並 行 処 理 " を 参 照 してください)。void release_shared_lock()プロジェクション・オブジェクトをデータベースに 保 存 します。 新 規 作 成 したオブジェクトや 変 更 内 容 をデータベースに 保 存 するには、このメソッドを 明 示 的 に 呼 び 出 す 必 要 があります。d_status save(bool defer_indices = false,int timeout = -1,Db_err* err = 0)プロジェクション・オブジェクトがアタッチされている 場 合 、save() はオブジェクトを 更 新 します。オブジェクトのアタッチが 解 除 されている 場 合 、save() は 新 規 オブジェクトを 作 成 します。トランザクションでは、tstart() およびtcommit() の 暗 黙 的 な 呼 び 出 しと 共 に、save() が 更 新 内 容 を 一 括 します ("トランザクションの 使 用 法 " を 参 照 してください)。set_from_err_list()update()プロジェクション・オブジェクトのプロパティ 値 を、バッチ 挿 入 によって 返 されたエラー・リストのエントリで 設 定 します ("LCB バッチ 挿 入 の 使 用 法 " を 参 照 してください)。void set_from_err_list(const std::pair & list_entry)既 存 のデータベース・オブジェクトを 更 新 します。d_status update(bool defer_indices = false,int timeout = -1,Db_err* err = 0)オブジェクトは 既 にアタッチされている 必 要 があります。アタッチされていない 場 合 は、"Object must beopened or inserted before being updated" 例 外 がスローされます。5.6 LCB アプリケーション<strong>での</strong>クエリの 使 用 法LCB アプリケーションのクエリは、 通 常 のバインディングと 同 じ API 呼 び 出 しを 使 用 して ("クエリの 使 用 法 " を 参 照 )、 同様 のパフォーマンスを 実 現 します。LCB アプリケーションでクエリを 実 行 するには、LC_Database のインスタンスをデータベース 引 数 として d_query コンストラクタに 渡 します。 以 下 はその 例 です。LC_Database *db;d_query q(db);標 準 のバインディングに 比 べ、LCB クエリにはいくつかの 制 限 があります。• クエリでストリーム・タイプのプロパティを 参 照 したり、 返 したりすることはできません。44 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


LCB バッチ 挿 入 の 使 用 法• 現 在 はアドホック・クエリのみサポートされており、 事 前 定 義 された 名 前 付 きクエリやストアド・プロシージャはサポートされていません。• UNIX® <strong>での</strong> 認 証 およびセキュリティでは、LCB アプリケーションを 実 行 するユーザが cacheusr グループに 属 しているか、 高 信 頼 アプリケーションを 実 行 している 必 要 があります ("UNIX® <strong>での</strong> 高 信 頼 アプリケーションの 実 行 " を 参照 してください)。5.7 LCB バッチ 挿 入 の 使 用 法LC_Batch クラスは、Light <strong>C++</strong> バインディングを 使 用 したバッチ 挿 入 メソッドを 提 供 します。


Light <strong>C++</strong> バインディング• 新 しい LC_Batch オブジェクトを 作 成 する 場 合 は、reserve_size パラメータを 適 切 に 設 定 します。バッチのシリアル 化 バッファに 必 要 な 実 際 のバイト 数 を 確 保 することで、パフォーマンスは 向 上 します。これにより、バッチにオブジェクトを 追 加 するに 従 って、バッファを 拡 大 したり、データをコピーしたりする 負 担 が 回 避 されます。reserve_size は、 少 なくとも、 挿 入 対 象 オブジェクト 数 を 平 均 的 なオブジェクト・サイズに 掛 けたものと 同 じになるように 指 定 します。• do_tx パラメータを false に 設 定 します。do_tx を false ( 既 定 ) に 設 定 すると、パフォーマンスが 大 幅 に 高 速 化 されます。true に 設 定 すると、バッチ 内 の挿 入 ごとに tstart() および tcommit() または trollback() ("トランザクションの 使 用 法 " を 参 照 ) が 実 行 されます。5.8 LCB および 並 行 処 理LCB では、 標 準 の <strong>Caché</strong> 並 行 処 理 モデルをサポートしています ("<strong>Caché</strong> オブジェクトの 使 用 法 " の "オブジェクト 同 時処 理 " を 参 照 してください)。 並 行 処 理 レベルを 指 定 するには、 以 下 の 定 数 を 使 用 します。• 一 切 ロックしない :#define LC_CONCURRENCY_NO_LOCKING 0• 作 成 時 にはロックせず、 更 新 時 に 排 他 ロックを 利 用 する :#define LC_CONCURRENCY_ATOMIC 1• 作 成 時 には 共 有 ロックを 利 用 し、 更 新 時 には 排 他 ロックを 利 用 する :#define LC_CONCURRENCY_SHARED 2• openid() の 後 に 共 有 ロックを 保 持 する :#define LC_CONCURRENCY_SHARED_RETAINED 3• openid() の 後 に 排 他 ロックを 保 持 する :#define LC_CONCURRENCY_EXCLUSIVE 4#define LC_CONCURRENCY_DEFAULT LC_CONCURRENCY_ATOMIC並 行 処 理 レベルはオブジェクトを 開 く 際 に 指 定 します。 以 下 はその 例 です。d_ref person =User_Person::openid(db, id, LC_CONCURRENCY_EXCLUSIVE);注 釈新 規 オブジェクトの 作 成 時 、 既 定 以 外 の 並 行 処 理 レベルは 指 定 できません (その 後 openid() を 呼 び 出 して、目 的 の 並 行 処 理 レベルを 設 定 できます)。LCB の 並 行 処 理 の 既 定 は、 常 に LC_CONCURRENCY_ATOMIC です。5.8.1 意 味 の 更 新save() または update() を 呼 び 出 すと、<strong>C++</strong> アプリケーションによってプロパティが 変 更 されている 場 合 でも、データベース・オブジェクトのすべてのプロパティはプロジェクション・オブジェクトから 設 定 されます。オブジェクトが 並 行 処 理 レベル SHARED_RETAINED または EXCLUSIVE で 開 かれている 場 合 、そのオブジェクトは 他のアプリケーションによる 変 更 から 保 護 されています。46 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


最 適 化 およびトラブルシューティングより 低 い 並 行 処 理 レベルでオブジェクトが 開 かれていると、 他 のユーザの 更 新 によって 設 定 されたプロパティが save()によって 上 書 きされたり、 削 除 後 にオブジェクトが 再 作 成 されたりする 場 合 があります。 適 切 なロックが 行 われるので、これでオブジェクトまたはインデックスが 破 壊 されることはありません。それまでロックされていなかったオブジェクトをロックするには、より 高 い 並 行 処 理 レベルで openid() を 再 度 明 示 的 に 呼 び 出 します。これにより、データベースから 現 在 のプロパティ 値 が 常 に 再 ロードされます。SHARED-RETAINED より 低 い 並 行 処 理 レベルで 開 かれたオブジェクトを 更 新 する 場 合 、インデックスの 更 新 が 有 効 になっていて、オブジェクトのインデックス 付 きプロパティが 変 更 されていると、オブジェクトはロックされ、 古 いプロパティ 値がデータベースから 再 ロードされます。これは、 古 いインデックス・エントリを 削 除 できるようにするために 必 要 です。5.9 最 適 化 およびトラブルシューティングパフォーマンスを 最 適 化 するには 以 下 を 実 行 します。• 必 要 のない 限 り wchar_t 文 字 列 は 使 用 しない。• 不 要 なインデックスは 使 用 しない。• 初 回 ロード 時 は defer_indices = true で 保 存 し、インデックスは 最 後 に 構 築 する。• 可 能 な 限 り、%Float ではなく %Double でプロパティを 定 義 する。5.9.1 “object not found” エラーの 検 出オプションの Db_err* パラメータを 指 定 して openid() を 呼 び 出 した 場 合 に、 指 定 した ID を 持 つオブジェクトが 存 在 しないと、Db_err コードが -3 に 設 定 され、msg に "object not found" が 設 定 されます。openid() の 結 果 が 割 り 当てられる d_ref に null が 設 定 されます。これは、is_null() メンバ 関 数 を 呼 び 出 すことで 検 出 できます。d_ref を 逆 参 照 する 前 に、Db_err コードが 0 でないことや d_ref が Null かどうかをテストするのは、 呼 び 出 す 側 の 責 任です。Null である d_ref を 逆 参 照 すると、コード -2 および msg "cannot dereference a null d_ref value"と 共 に 例 外 がスローされます。 例 えば、 以 下 のコード 例 が ID "2" で 実 行 され、ID 値 2 のオブジェクトが 存 在 しないとします。Db_err openerr;person = User_Person::openid(db, id, concurrency, timeout, &openerr);if (openerr)std::cerr


Light <strong>C++</strong> バインディングd_connection または LC_Database インスタンスがローカル 変 数 として 宣 言 されている 場 合 、 変 数 が 範 囲 外 になると、それらのデストラクタが 自 動 的 に 呼 び 出 されます。しかし、それらが new を 介 して 割 り 当 てられ、ポインタに 割 り 当 てられている 場 合 は、<strong>C++</strong> の "delete" を 使 用 して 明 示 的 に 破 棄 する 必 要 があります。5.9.3 lc_conn::connect の 使 用 法• lc_conn::connect を 使 用 すると、 呼 び 出 し 元 のアプリケーションの 作 業 ディレクトリが 変 更 されます。lc_conn::connect では、ZN を 使 用 して、ネームスペースを 接 続 文 字 列 で 指 定 したネームスペースに 変 更 するので、 呼 び 出 し 元 のアプリケーションの 現 在 の 作 業 ディレクトリが 変 更 されるという 副 次 的 作 用 が 発 生 します ( 既 定 )。この 動 作 は、 管 理 ポータルのシステム 構 成 オプション ([ 構 成 ]→[ 詳 細 、ObjectScript: SwitchOSDirectory]) で 無 効にできます。これを "true" に 設 定 すると、<strong>Caché</strong> では、ネームスペースの 変 更 時 、OS の 現 在 の 作 業 ディレクトリが変 更 されません (“SwitchOSDirectory” という 名 前 は 直 感 的 ではありません)。これは lc_conn::connect を 介 する 場 合 だけでなく、ZN のすべての 使 用 に 影 響 します。• lc_conn::connect を 使 用 する 場 合 は、シグナル 処 理 を 実 行 しないでください。lc_conn::connect では、さまざまなシグナルにハンドラを 設 定 する、コールイン CacheStart() 関 数 を 使 用 しています。これらのハンドラは、 呼 び 出 し 元 のアプリケーションが 設 定 したシグナル・ハンドラと 競 合 する 可 能 性 があります。• lc_conn::connect() では、SIGINT ハンドラは 設 定 されません。lc_conn::connect() で CacheStart() を 起 動 する 際 、SIGINT にはハンドラは 設 定 されていません。そのため、ユーザ・アプリケーションに 独 自 のハンドラを 設 定 できます。ただし、( 明 示 的 または 暗 黙 的 に 接 続 のd_connection オブジェクトを 破 棄 したり、CacheEnd() を 直 接 呼 び 出 したりすることによって) アクティブな LCB接 続 を 持 つすべてのスレッドでそれらを 終 了 しない 限 り、ユーザ・ハンドラの 実 行 は 終 了 しないようにする 必 要 があります。48 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


6単 純 なデータ 型 クラスのリファレンス<strong>Caché</strong> では、リテラル・データ 型 に ( 文 字 列 や 数 字 などの 単 純 なデータを 含 む) 一 連 の 特 殊 なクラスを 使 用 します。 標 準のオブジェクト・クラスとデータ 型 クラスの 違 いについては、"<strong>Caché</strong> オブジェクトの 使 用 法 " の "データ 型 " を 参 照 してください。<strong>Caché</strong> データ 型 はすべて、d_int や d_string など、 適 切 な <strong>C++</strong> オブジェクトにマップされます。リテラル・タイプのインスタンスが NULL でない 場 合 は、 標 準 <strong>C++</strong> タイプに 変 換 できます。d_int は int に、d_string は std::string または std::wstringに、d_time、d_date、および d_timestamp は tm にそれぞれ 変 換 されます。<strong>Caché</strong> データ 型 を 表 す <strong>C++</strong> オブジェクトは、データ 型 クラスの CLIENTDATATYPE のキーワード 値 で 決 まります。すべての 単 純 な 型 は、 以 下 を 持 ちます。• 変 換 演 算 子 。これを 使 用 すると、すべての 基 本 タイプを <strong>C++</strong> タイプとして 使 用 することができます。 例 えば、d_int はint に、d_double は double に 変 換 できます。• value() メソッド (テンプレートに 使 用 )• make_null() メソッドおよび is_null() メソッド• 出 力 ストリーム 用 のオーバーロードされた "


単 純 なデータ 型 クラスのリファレンス• d_decimal — %Library.Decimal は キーワード DECIMAL に 対 応 します。• d_currency — %Library.Currency は キーワード CURRENCY に 対 応 します。6.1.1 InterSystems::d_int クラスd_int は int に 変 換 でき、int を 割 り 当 てることができます。これは、その 他 のオーバーロードされた 演 算 子 を 持 ちません。オブジェクトに 変 更 がある 場 合 、int 値 を 取 得 して、 変 更 された 値 をオブジェクトに 割 り 当 てるというのが 通 常 の 使 用 法 です。 以 下 はその 例 です。d_int t = 2;d_int q = int(t) + 2;通 常 、この 場 合 と 同 様 に、 変 換 は 暗 黙 なので、2 行 目 は 単 に 以 下 のようになります。d_int q = t + 2;必 要 に 応 じて、さまざまなケースがあります。6.2 バイナリ・クラスこれらは 可 変 長 バイナリ・データを 含 むクラスです。• d_binary — %Library.Binary は CLIENTDATATYPE のキーワード BINARY に 対 応 します。• d_longbinary —• d_oid — 完 全 なオブジェクト ID で、キーワード OID に 対 応 します。d_oid は d_binary の typedef です。• d_status — %Library.Status は キーワード STATUS に 対 応 します。• d_string — %Library.String は キーワード VARCHAR または LONG VARCHAR に 対 応 します。• d_list — %Library.List は <strong>Caché</strong> の $list 構 造 に 対 応 します。6.2.1 InterSystems::d_binary クラスd_binary は、バイナリ・データを 保 持 します。d_oid は、 完 全 なオブジェクト ID を 表 す d_binary の typedef です。メンバ・リスト• d_binary constructors– パラメータはありません。d_binary();– NULL で 終 了 する 文 字 列 を 基 に 実 行 します。d_binary(const char* cstr);– std::string を 基 に 実 行 します。d_binary(const std::string& s);– cstr で 始 まりサイズが sz の 文 字 列 を 基 に 実 行 します。d_binary(const char* cstr, int sz);50 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


バイナリ・クラス• std::string() operator — データを std::string として 返 します。 std::stringoperator std::string() const;• Comparison operators — 別 の d_binary と 比 較 します。 d_binarybool operator==(const d_binary& t);bool operator!=(const d_binary& t);• append_bin() — バイナリ・データを 追 加 します。void append_bin(const char* buf, byte_size_t size);• assign() — バイナリ・データを 割 り 当 てます。void assign(const char* buf, byte_size_t size);• get_buf() — バイナリ・バッファのアドレスを 取 得 します。const char* get_buf() const;• get_size() — バイナリ・バッファのサイズを 取 得 します。long get_size() const;6.2.2 InterSystems::d_status クラスd_status は、%Library.Status をカプセル 化 します。これは、サーバの 状 態 を 変 換 するためにのみ 使 用 します。メンバ・リスト• operator int() — エラー・コードの 値 を 持 つ int に 変 換 します。operator int() const;• get_code() — エラー・コードを 取 得 します (エラーがない 場 合 は 0 を 返 します)。int get_code() const;• get_msg() — エラー・メッセージを 取 得 します。const d_string& get_msg() const;• get_from_srv() — サーバ 上 の 状 態 を 分 析 し、 可 能 であればそのメッセージを 言 語 lang に 変 換 します (システム・エラーの 場 合 )。void get_from_srv(Database* db, const char* lang = "", Db_err* err = 0);• throw_err() — エラー・コードおよびメッセージと 共 に、Db_err をスローします。void throw_err() const;6.2.3 InterSystems::d_string クラスd_string は、 文 字 列 データを 保 持 します。d_string は、 必 要 に 応 じて 自 動 的 にデータを 変 換 し、 変 換 メソッドを 提 供 しますが、d_binary はこれらを 実 行 しません。メンバ・リスト• d_string constructors<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 51


単 純 なデータ 型 クラスのリファレンス– パラメータはありません。d_string();– NULL で 終 了 する 文 字 列 、または NULL で 終 了 するワイド 文 字 列 を 基 に 実 行 します。d_string(const char* cstr);d_string(const wchar_t* cstr);– std::string または std::wstring を 基 に 実 行 します。d_string(const std::string& s);d_string(const std::wstring& s);– cstr で 始 まり、サイズが sz の 文 字 列 またはワイド 文 字 列 を 基 に 実 行 します。d_string(const char* cstr, int sz);d_string(const wchar_t* cstr, int sz);• is_unicode() — 文 字 列 が Unicode 形 式 であるかどうかを 調 べます。bool is_unicode() const;• to_mb() — マルチバイトに 変 換 します。– 容 量 が cap のバッファ buf に 格 納 し、buf に 配 置 されたバイト 数 を 返 します。byte_size_t to_mb(char* buf, char_size_t cap) const;– 適 切 なマルチバイトに 変 換 します。void to_mb();• to_uni() — Unicode に 変 換 します。– 結 果 を 容 量 が cap のバッファ buf に 格 納 し、buf に 配 置 された 文 字 数 を 返 します。char_size_t to_uni(wchar_t* buf, char_size_t cap) const;– 適 切 な Unicode に 変 換 します。void to_uni();• std::string() operator — std::string または std::wstring に 変 換 します。operator std::string() const;operator std::wstring() const;• Comparison operators — 別 の d_binary と 比 較 します。 d_string• assign()bool operator==(const d_string& val) const;bool operator!=(const d_string& val) const;bool operator


バイナリ・クラス6.2.4 InterSystems::d_list クラスd_list オブジェクトは、<strong>Caché</strong> の $list 構 造 の <strong>C++</strong> 実 装 です。d_list クラスには、その 標 準 メソッドに 加 えて、d_list オブジェクトにコピーすることなく $list を 含 むバッファからデータを 抽 出 できる 一 連 のスタティック・メソッドがあります。6.2.4.1 d_list メソッドd_list オブジェクトは、 本 質 的 にはフォワード 反 復 子 ですが、 現 在 の 位 置 に 要 素 を 挿 入 、 削 除 、 置 換 するメソッドや、 全 体として $list と 連 動 する 他 のメソッドも 提 供 します。d_list の 位 置 は 0 ベースです。$list は 連 続 メモリに 格 納 されているため、$list 要 素 を 変 更 する 処 理 を 実 行 すると、コストの 高 い、ダイナミック・メモリの 配 置 転 換 やコピーが 発 生 します。メンバ・リスト• d_list()d_list(const char* buf, byte_size_t size)• append_elem()void append_elem(__int64 val);void append_elem(double val);void append_elem(const d_string& val);void append_elem(const d_binary& val);void append_elem(const wchar_t* p, char_size_t size);void append_elem(const char* p, char_size_t size);• append_elem_null()• at_end()void append_elem_null();bool at_end() const;• clear() — すべての 要 素 を 削 除 します。void clear();• count() — 要 素 数 をカウントします。int count();• del_elem() — 現 在 の 要 素 を 削 除 します。• elem_null()• get_elem()void del_elem();void ins_elem_null();void get_elem(__int64* val) const;void get_elem(double* val) const;void get_elem(d_string& val) const;void get_elem(d_binary& val) const;void get_elem(bool* is_uni, const char** p_buf,byte_size_t* p_size) const;• get_elem_idx() — 現 在 の 要 素 のインデックスを 取 得 します。int get_elem_idx() const;• get_elem_type()<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 53


単 純 なデータ 型 クラスのリファレンス• ins_elem()char get_elem_type() const;void ins_elem(__int64 val);void ins_elem(double val);void ins_elem(const d_string& val);void ins_elem(const d_binary& val);void ins_elem(const wchar_t* p, char_size_t size);void ins_elem(const char* p, char_size_t size);• is_elem_double()bool is_elem_double() const;• is_elem_int()bool is_elem_int() const;• is_elem_null()bool is_elem_null() const;• is_elem_str()bool is_elem_str() const;• move_to() — 現 在 の 位 置 を idx に 変 更 します (0 ベース)。void move_to(int idx) const;• move_to_front() — move_to(0) と 同 じですが、 最 適 化 されています。void move_to_front() const;• next() — 動 作 は move_to() と 似 ていますが、 次 の 要 素 に 移 動 する 処 理 に 最 適 化 されています。void next() const;• reset() — バッファをリセットします。• set_elem()void reset(const char* buf, byte_size_t size);void set_elem(__int64 val);void set_elem(double val);void set_elem(const d_string& val);void set_elem(const d_binary& val);void set_elem(const wchar_t* p, char_size_t size);void set_elem(const char* p, char_size_t size);• set_elem_null()void set_elem_null();6.2.4.2 d_list スタティック・メンバ 関 数スタティック・メンバ 関 数 を 使 用 すると、d_list オブジェクトにコピーすることなく、$list であるバッファからデータを 抽 出 できます。インタフェースは、バッファで 指 定 された $list 要 素 を 処 理 します。 次 の 要 素 は、バッファ + d_list::get_elem_size(buffer) から 開 始 します。メンバ・リスト• get_elem() — 要 素 を 取 得 します。54 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


日 時 クラス– _int64、double、d_string、または d_binary として 要 素 を 取 得 します。static void get_elem(const char* buf, __int64* val);static void get_elem(const char* buf, double* val);static void get_elem(const char* buf, d_string& val);static void get_elem(const char* buf, d_binary& val);– 文 字 列 および 文 字 列 サイズへのポインタとして 要 素 を 取 得 します。また、Unicode と 1 バイト 文 字 のどちらであるかを 調 べます。static void get_elem(const char* buf, bool* is_uni,const char** p_buf, byte_size_t* p_size);• get_elem_size() — 要 素 サイズを 取 得 します。static byte_size_t get_elem_size(const char* buf);• is_elem_double() — 要 素 が double として 格 納 されているかどうかを 調 べます。 doublestatic bool is_elem_double(const char* buf);• is_elem_int() — 要 素 が int として 格 納 されているかどうかを 調 べます。 intstatic bool is_elem_int(const char* buf);• is_elem_null() — 要 素 が NULL かどうかを 調 べます。static bool is_elem_null(const char* buf);• is_elem_str() — 要 素 が string として 格 納 されているかどうかを 調 べます。static bool is_elem_str(const char* buf);6.3 日 時 クラスこれらのタイプのオブジェクトは、 関 係 のない 値 をすべて -1 に 設 定 して tm 構 造 オブジェクトに 変 換 することができます。tm オブジェクトを 割 り 当 てることもできます。tm 構 造 に 関 係 のない 値 は 無 視 されます。これらのクラスのインタフェースは、コンストラクタと 演 算 子 の 割 り 当 てが 異 なるだけです。• d_date — %Library.Date は CLIENTDATATYPE のキーワード DATE に 対 応 します。• d_time — %Library.Time は キーワード TIME に 対 応 します。• d_timestamp — %Library.TimeStamp は キーワード TIMESTAMP に 対 応 します。6.3.1 InterSystems::d_time クラスメンバ・リスト• d_time– tm を 基 に 実 行 します。d_time(const tm& ts);– 時 間 用 の ODBC 構 造 を 基 に 実 行 します。d_time(const TIME_STRUCT& t);<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 55


単 純 なデータ 型 クラスのリファレンス– 時 間 、 分 、 秒 を 基 に 実 行 します。d_time(int h, int m, int s);– 時 間 用 の ODBC 構 造 を 基 に 実 行 します。d_time& operator=(const TIME_STRUCT& t);6.3.2 InterSystems::d_date クラスメンバ・リスト• d_date– tm を 基 に 実 行 します。d_date(const tm& ts);– 日 付 用 の ODBC 構 造 を 基 に 実 行 します。d_date(const DATE_STRUCT& d);– 年 、 月 、 日 を 基 に 実 行 します。d_date(int y, int m, int d);– 日 付 用 の ODBC 構 造 を 基 に 実 行 します。d_date& operator=(const DATE_STRUCT& d);6.3.3 InterSystems::d_timestamp クラスメンバ・リスト• d_timestamp– tm を 基 に 実 行 します。d_timestamp(const tm& ts);– タイムスタンプ 用 の ODBC 構 造 を 基 に 実 行 します。d_timestamp(const TIMESTAMP_STRUCT& ts);56 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


7オブジェクトのデータ 型 クラスのリファレンスこの 章 では、リスト、 配 列 、ストリームなど、<strong>Caché</strong> オブジェクトのデータ 型 クラスに 対 応 する、 事 前 定 義 された 一 連 のプロキシ・クラスについて 説 明 しています。これらのプロキシ・クラスはすべて、Dyn_obj と Obj_t の 両 方 のクラスから 継 承 されます。このいずれにも、 標 準 の open()、create_new()、openid()、および openref() メソッドがあります。コレクション・クラスは 以 下 のとおりです。• d_vector — リスト・コレクション• d_map — 配 列 コレクションストリーム・クラス :• d_char_stream• d_bin_stream• d_file_bin_stream• d_file_char_streamリレーションシップ :• d_relationship7.1 コレクション・クラス<strong>Caché</strong> は、リストと 配 列 という 2 つのコレクションをサポートしています。これらは、1 つのタイプの 要 素 を、2 つの 異 なる 考え 方 でグループ 分 けしたものです。• d_vector リスト・コレクション — <strong>Caché</strong> の %ListOfObjects クラスおよび %ListOfDataTypes クラスに 対 応 します。• d_map 配 列 コレクション — <strong>Caché</strong> の %ArrayOfObjects クラスおよび %ArrayOfDataTypes クラスに 対 応 します。通 常 、<strong>C++</strong> クライアントでは、 既 にコレクションが 存 在 するものとして 処 理 が 行 われます。7.1.1 クラス・テンプレート d_vector (リスト・コレクション)%ListOfObjects および %ListOfDataTypes のプロキシは、std::vector のインタフェースとほぼ 同 じインタフェースを 提 供します。<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 57


オブジェクトのデータ 型 クラスのリファレンス<strong>Caché</strong> のリスト・オブジェクトは d_obj_vector クラスや d_prim_vector クラスとして 生 成 されるため、これらは d_vectorにより 指 定 されるものと 同 じインタフェースを 提 供 します。リスト 処 理 、スタック 処 理 、および 要 素 アクセス• erase() — 位 置 pos にある 要 素 を 削 除 します。iterator erase(iterator pos);• insert() — 位 置 pos に 値 が val の 要 素 を 挿 入 します。iterator insert(iterator pos, const value_type& val);• pop_back() — リストの 最 終 の 要 素 ( 空 でないもの) を 削 除 します。void pop_back();• push_back() — リストの 最 後 に、 値 が val である 要 素 を 挿 入 します。void push_back(const value_type& val);• [] operator — "[]" 演 算 子 をオーバーロードすることにより、 未 確 認 の 要 素 のアクセスをサポートします。reference operator[](size_type index);const;_reference operator[](size_type index) const;• at() — 確 認 済 みの 要 素 のアクセスを 提 供 します。 位 置 index にあるリスト 要 素 への 参 照 を 返 します。index が 有 効 な位 置 でない 場 合 、このメソッドは out_of_range エラーをスローします。reference at(size_type index);const;_reference at(size_type index) const;サイズと 容 量• capacity() — 現 在 、リストに 割 り 当 てられているストレージを 返 します。size_type capacity() const;• empty() — リストが 空 であるかどうかを 確 認 し、 空 の 場 合 は True を 返 します。bool empty() const;• max_size() — リストの 長 さの 許 容 最 大 値 を 返 します。size_type max_size() const;• reserve() — 総 数 n 個 の 要 素 に 対 して 領 域 を 割 り 当 てます。このメソッドは、n 個 の 要 素 に 対 してメモリを 割 り 当 てるのみで、それら 要 素 を 生 成 するわけではありません。void reserve(size_type n);• size() — リストの 長 さを 返 します。size_type size();反 復 子• begin() — リストの 最 初 の 要 素 を 指 すランダム・アクセス 反 復 子 を 返 します。iterator begin();• end() — 配 列 の 最 後 の 要 素 の 直 後 を 指 すランダム・アクセス 反 復 子 を 返 します。iterator end();58 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


コレクション・クラス• rbegin() — リストの 逆 の 順 番 の 開 始 位 置 (リストの 最 後 の 要 素 の 直 後 ) を 指 す 逆 ランダム・アクセス 反 復 子 を 返 します。reverse_iterator rbegin();• rend() — リストの 逆 の 順 番 の 終 了 位 置 (リストの 最 初 の 要 素 の 直 前 ) を 指 す 逆 ランダム・アクセス 反 復 子 を 返 します。reverse_iterator rend();7.1.2 クラス・テンプレート d_map ( 配 列 コレクション)%ArrayOfObjects および %ArrayOfDataTypes のプロキシは、std::map のインタフェースとほぼ 同 じインタフェースを 提供 します。<strong>Caché</strong> の 配 列 オブジェクトはd_obj_map クラスや d_prim_map クラスとして 生 成 されるため、これらは d_map により指 定 されるものと 同 じインタフェースを 提 供 します。リスト 処 理 と 要 素 アクセス• erase() — 要 素 を 削 除 します。– pos によって 指 定 された 配 列 要 素 を 削 除 します。iterator erase(iterator pos);– キー k によって 一 意 に 識 別 される 要 素 を 削 除 します ( 要 素 がある 場 合 )。size_type erase(const key_type& k);• insert() — 要 素 を 挿 入 します。– pos を 手 がかりとして、 値 が val である 要 素 を 挿 入 します。iterator insert(iterator pos, const value_type& val);– 値 が val である 要 素 を 挿 入 します。std::pair insert(const value_type& val);• [] operator — TBDmapped_type& operator[](const key_type& key);const mapped_type& operator[](const key_type& key) const;サイズと 容 量• capacity() — 現 在 、 配 列 に 割 り 当 てられているストレージを 返 します。size_type capacity() const;• empty() — 配 列 が 空 の 場 合 、True を 返 します。bool empty() const;• max_size() — 配 列 が 含 むことのできる 要 素 の 最 大 数 を 返 します。size_type max_size() const;• size() — 配 列 に 含 まれる 要 素 の 数 を 返 します。size_type size();<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 59


オブジェクトのデータ 型 クラスのリファレンス反 復 子• begin() — 最 初 の 配 列 要 素 を 指 す 双 方 向 の 反 復 子 を 返 します。iterator begin();• end() — 最 後 の 配 列 要 素 の 直 後 を 指 す 双 方 向 反 復 子 を 返 します。iterator end();• rbegin() — 配 列 の 逆 の 順 番 の 開 始 位 置 ( 配 列 の 最 後 の 要 素 の 直 後 ) を 指 す 逆 反 復 子 を 返 します。reverse_iterator rbegin();• rend() — 配 列 の 逆 の 順 番 の 終 了 位 置 ( 配 列 の 最 初 の 要 素 の 直 前 ) を 指 す 逆 反 復 子 を 返 します。reverse_iterator rend();• find() — ソート・キーの 順 番 が key の 順 番 と 同 じになっている 配 列 中 の 要 素 を 示 す、 双 方 向 の 反 復 子 を 返 します。iterator find(const key_type& key);7.2 ストリーム<strong>Caché</strong> ストリームのプロキシは、 標 準 <strong>C++</strong> ライブラリ・ストリーム・フレームワークにストリームを 当 てはめ、パフォーマンスの 最 適 化 を 実 行 するアダプタを 使 用 します。ストリームに 対 する 一 連 のプロキシ・クラスは、それらに 共 通 のインタフェースを d_stream クラスから 継 承 します。ストリームで 作 業 する 場 合 には、このアダプタの 使 用 をお 勧 めします。アダプタによってストリームにバッファが 適 用 されるので、(ストリームの 読 み 取 りや 書 き 込 み、または 位 置 の 直 接 変 更 の 結 果 として)ストリームの 読 み 取 りや 書 き 込 みの 位 置 を 変 更 するプロキシ・オブジェクト 呼 び 出 しと、アダプタ 呼 び 出 しが 混 在 しないようにしてください。ストリーム・オブジェクト以 下 のテーブルは、<strong>Caché</strong> ストリーム・クラスのマッピングについて 説 明 しています。<strong>Caché</strong> クラス%Library.GlobalCharacterStream%Library.GlobalBinaryStream%Library.FileBinaryStream%Library.FileCharacterStream<strong>C++</strong> クラスd_char_streamd_bin_streamd_file_bin_streamd_file_char_streamすべてのストリーム・クラスは、 静 的 な open() メソッドおよび create_new() メソッドを 持 ちます。d_file_char_stream クラスは、is_unicode() メソッドを 持 ち、ストリームが Unicode データを 含 むかどうかを 確 認 します。<strong>C++</strong> ストリーム・アダプタストリーム・アダプタは、<strong>C++</strong> 標 準 ライブラリのストリームとまったく 同 じように 使 用 できます。また、すべての <strong>Caché</strong> ストリームに 共 通 の <strong>Caché</strong> 独 自 のメソッドにも、それらアダプタからアクセスできます。アダプタ・クラスは、 以 下 のとおりです。• typedef に d_istream および d_wistream を 持 つ d_basic_istream60 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


ストリーム• typedef に d_ostream および d_wostream を 持 つ d_basic_ostream• typedef に d_iostream および d_wiostream を 持 つ d_basic_iostreamすべての <strong>C++</strong> アダプタ・オブジェクトは、ストリーム・オブジェクト・プロキシに 対 する d_ref から 構 築 できます。 以 下 はその 例 です。// create a low level stream objectd_ref stream = d_char_stream::create_new(&db);// create an IOStreams extension stream objectd_iostream io(stream);すべてのアダプタはヘルパー・メソッドを 持 ち、これによりアダプタ 経 由 <strong>での</strong>みストリームを 操 作 できます。すべての <strong>C++</strong>アダプタ・オブジェクトは、ストリーム・オブジェクト・プロキシに 対 する d_ref から 構 築 できます。 以 下 はその 例 です。// create a low level stream objectd_ref stream = d_char_stream::create_new(&db);// create an IOStreams extension stream objectd_iostream io(stream);7.2.1 ストリーム・アダプタ・クラスd_basic_ostreamd_ostream および d_wostream の typedef があります。std::basic_ostream インタフェースに 加 え、このクラスは 以 下 のメソッドも 提 供 します。d_binary oid();long size();d_status erase();d_status save();d_basic_istreamd_istream および d_wistream の typedef があります。std::basic_istream インタフェースに 加 え、このクラスは 以 下 のメソッドも 提 供 します。d_binary oid();long size();d_status rewind();d_basic_iostreamd_iostream および d_wiostream の typedef があります。std::basic_iostream インタフェースに 加 え、このクラスは 以 下 のメソッドも 提 供 します。d_binary oid();long size();d_status rewind();d_status move_to_end();d_status erase();d_status save();7.2.2 クラス d_streamd_stream クラスは、すべてのストリームに 共 通 のインタフェースを 提 供 します。d_file_stream クラスは、これにすべてのファイル・ストリームに 共 通 のインタフェースを 追 加 します。d_stream メソッド文 字 ストリームとバイナリ・ストリームに 共 通 の d_stream メソッドは、 以 下 のとおりです。<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 61


オブジェクトのデータ 型 クラスのリファレンスd_binary oid();d_status save();d_status clear();d_status rewind();d_status move_to_end();long size();d_stream& copy(const abs_d_ref& stream);文 字 ストリームに 特 有 のメソッドは、 以 下 のとおりです。void read(d_int& len, d_string& res);void readline(d_int& len, d_string& res);void write(const d_string& data);バイナリ・ストリームに 特 有 のメソッドは、 以 下 のとおりです。void read(d_int& len, d_binary& res);void write(const d_binary& data);d_file_stream メソッドd_file_stream クラスから 追 加 で 利 用 できるメソッドは、 以 下 のとおりです。d_string get_filename();void set_filename(const d_string& fname);d_timestamp last_modified();d_status link_to_file(const_name_t fname);// const_name_t is a typedef for const wchar_t*7.3 クラス・テンプレート d_relationship<strong>Caché</strong> 内 と 同 様 に、リレーションシップはプロパティとして 扱 われます。クラス P とクラス Q の 間 にリレーションシップがあり、P がシングル・バリュー・サイドで Q がマルチ・バリュー・サイドである 場 合 、シングル・バリュー・サイドはタイプ P のプロパティとして 生 成 され (d_ref)、マルチ・バリュー・サイドはタイプ d_relationship のプロパティとして 生 成 されます(d_ref)。 他 のプロパティと 同 様 に、P または Q が 実 行 時 にのみ 指 定 できる 場 合 は、P または Q (または 両 方 ) は Dyn_obj (ダイナミック・オブジェクト) になります。d_relationship メソッドd_relationship クラスは、 以 下 のメソッドをサポートする 標 準 コンテナです。• begin() — 双 方 向 反 復 子 を 返 します。iterator begin();• end() — 双 方 向 反 復 子 を 返 します。iterator end();• rbegin() — 逆 反 復 子 を 返 します。reverse_iterator rbegin();• rend() — 逆 反 復 子 を 返 します。reverse_iterator rend();62 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


8接 続 および 継 承 されるプロキシ・クラスのリファレンスこの 章 では、プロキシ・クラスと <strong>Caché</strong> データベースとの 対 話 方 法 について 理 解 するための 最 も 重 要 なクラスについて 説明 します。• プロキシ・ベース・クラス — Persistent_t、Registered_t、LC_Persistent_t、および LC_Serial_t は、 生 成 されるプロキシ・クラスのベース・クラスになります。• データベース・クラス — Database および LC_Database• 接 続 クラス — Conn_t (d_connection)、tcp_conn、および lc_conn• オブジェクト 参 照 クラス・テンプレート — d_ref および lc_d_ref8.1 プロキシ・ベース・クラス以 下 のクラスを 使 用 できます。• Persistent_t — ほとんどの 永 続 プロキシ・クラスの 生 成 に 使 用 されるベース・クラスです。• Registered_t — すべてのシリアル・プロキシ・クラスの 生 成 に 使 用 されるベース・クラスです。• LC_Persistent_t — Light <strong>C++</strong> バインディングの 永 続 プロジェクション・クラスの 生 成 に 使 用 されるベース・クラスです。• LC_Serial_t — Light <strong>C++</strong> バインディングのシリアル・プロジェクション・クラスの 生 成 に 使 用 されるベース・クラスです。8.1.1 InterSystems::Persistent_t クラス永 続 プロキシ・クラスの 生 成 に 使 用 されるベース・クラスです。Registered_t から 継 承 されます。8.1.1.1 コンストラクタPersistent_t()コンストラクタは PROTECTED メンバ 関 数 です (" 標 準 のプロキシ・クラス・メソッド" を 参 照 してください)。InterSystems::Persistent_t::Persistent_t( ) [inline, protected]<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 63


接 続 および 継 承 されるプロキシ・クラスのリファレンス8.1.1.2 メンバ・リスト_delete()_is_null()create_new()delete_id()d_status Persistent_t::_delete( Database * db,const d_binary & oid,int conc = -1) [static]bool InterSystems::Obj_t::_is_null( ) const [inline, inherited]static d_ref InterSystems::Registered_t::create_new( Database * db,const_str_t init_val = 0, // const_str_t is a typedef of const wchar_t*Db_err * err = 0) [inline, static, inherited]d_status Persistent_t::delete_id( Database * db,const_name_t cl_name, // const_name_t is a typedef for const wchar_t*const_str_t id,// const_str_t is a typedef of const wchar_t*int conc = -1) [static]downgrade_concurrency()exists_id()get_cl_name()get_db()get_id()get_ref()get_val()d_status Persistent_t::downgrade_concurrency( int conc )bool Persistent_t::exists_id( Database * db,const_name_t cl_name, // const_name_t is a typedef for const wchar_t*const_str_t id// const_str_t is a typedef of const wchar_t*) [static]const wchar_t* InterSystems::Obj_t::get_cl_name( ) const [inline, inherited]Database* InterSystems::Obj_t::get_db( ) const [inline, inherited]d_string Persistent_t::get_id( ) constint InterSystems::Obj_t::get_ref( ) const [inline, inherited]const Oref_t& InterSystems::Obj_t::get_val( ) const [inline, inherited]64 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


プロキシ・ベース・クラスid()d_string Persistent_t::id( ) constoid()d_oid InterSystems::Persistent_t::oid( ) const [inline]openref()static d_ref InterSystems::Registered_t::openref( Database * db,int oref,const_name_t cl_name // const_name_t is a typedef for const wchar_t*) [inline, static, inherited]static d_ref InterSystems::Registered_t::openref( t_istream & in,Database * db) [inline, static, inherited]reload()d_status Persistent_t::reload( )save()d_status Persistent_t::save( int related = 1 ) constto_xml()upgrade_concurrency()void InterSystems::Obj_t::to_xml( xml_writer & out ) [inline, inherited]d_status Persistent_t::upgrade_concurrency( int conc )8.1.2 InterSystems::Registered_t クラスすべてのシリアル・プロキシ・クラスの 生 成 に 使 用 されるベース・クラスです。8.1.2.1 コンストラクタRegistered_t()コンストラクタは PROTECTED メンバ 関 数 です (" 標 準 のプロキシ・クラス・メソッド" を 参 照 してください)。8.1.2.2 メンバ・リスト_is_null()InterSystems::Registered_t::Registered_t( ) [inline, protected]bool InterSystems::Obj_t::_is_null( ) const [inline, inherited]<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 65


接 続 および 継 承 されるプロキシ・クラスのリファレンスget_cl_name()create_new()get_db()get_ref()get_val()openref()to_xml()const wchar_t* InterSystems::Obj_t::get_cl_name( ) const [inline, inherited]static d_ref&lt;Registered_t> InterSystems::Registered_t::create_new( Database * db,const_str_t init_val = 0, // const_str_t is a typedef of const wchar_t*Db_err * err = 0) [inline, static]Database* InterSystems::Obj_t::get_db( ) const [inline, inherited]int InterSystems::Obj_t::get_ref( ) const [inline, inherited]const Oref_t& InterSystems::Obj_t::get_val( ) const [inline, inherited]static d_ref&lt;Registered_t> InterSystems::Registered_t::openref( Database * db,int oref,const_name_t cl_name // const_name_t is a typedef for const wchar_t*) [inline, static]static d_ref&lt;Registered_t> InterSystems::Registered_t::openref( t_istream & in,Database * db) [inline, static]void InterSystems::Obj_t::to_xml( xml_writer & out ) [inline, inherited]8.1.3 InterSystems::LC_Persistent_t クラスLight <strong>C++</strong> バインディングの 永 続 クラスの 生 成 に 使 用 されるベース・クラスです。このクラスは、Light <strong>C++</strong> バインディング・アプリケーション<strong>での</strong>み 使 用 可 能 です。8.1.3.1 コンストラクタLC_Persistent_t両 コンストラクタは 共 に PROTECTED メンバ 関 数 です (" 標 準 のプロキシ・クラス・メソッド" を 参 照 してください)。LC_Persistent_t::LC_Persistent_t( ) [inline, protected]LC_Persistent_t::LC_Persistent_t( Database * db,int oref,const wchar_t * cl_name) [inline, protected]66 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


プロキシ・ベース・クラス8.1.3.2 メンバ・リスト_is_null()connect()detach()disconnect()get_cl_name()get_classname()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。void LC_Persistent_t::connect( LC_Database * db )void LC_Persistent_t::detach ( )void LC_Persistent_t::disconnect ( )使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。get_classname_length()get_db()get_ref()get_val()has_idkey()id()virtual const unsigned char* LC_Persistent_t::get_classname( ) const [pure virtual]virtual int LC_Persistent_t::get_classname_length( ) const [pure virtual]Database* InterSystems::Obj_t::get_db( ) const [inline, inherited]使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。virtual DLL_DECL bool LC_Persistent_t::has_idkey( ) [inline, virtual]const wchar_t * LC_Persistent_t::id( ) const [inline]int LC_Persistent_t::id( char * buf,size_t bufsiz) [inline]int LC_Persistent_t::id( wchar_t * buf,size_t bufsiz) [inline]<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 67


接 続 および 継 承 されるプロキシ・クラスのリファレンスid_is_uni()insert()is_attached()is_connected()save()serialize()serialize_idkey()set_id_from_properties()to_xml()unlock()update()bool LC_Persistent_t::id_is_uni( ) const [inline]d_status LC_Persistent_t::insert( bool defer_indices = false,int timeout = -1,Db_err * err = 0 )bool LC_Persistent_t::is_attached( ) [inline]bool LC_Persistent_t::is_connected( ) [inline]virtual DLL_DECL d_status LC_Persistent_t::save( bool defer_indices = false,int timeout = -1,Db_err * err = 0) [pure virtual]virtual DLL_DECL void LC_Persistent_t::serialize( lc_dlist_out * ,LC_Database *) [inline, virtual]virtual DLL_DECL void LC_Persistent_t::serialize_idkey( lc_dlist_out * ,LC_Database *) [inline, virtual]virtual DLL_DECL void LC_Persistent_t::set_id_from_properties( ) [inline, virtual]使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。virtual void LC_Persistent_t::unlock( ) [pure virtual]d_status LC_Persistent_t::update( bool defer_indices = false,int timeout = -1,Db_err * err = 0 )68 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


データベース・クラス8.1.4 InterSystems::LC_Serial_t クラスLight <strong>C++</strong> バインディングのシリアル・クラスの 生 成 に 使 用 されるベース・クラスです。このクラスは、Light <strong>C++</strong> バインディング・アプリケーション<strong>での</strong>み 使 用 可 能 です。8.1.4.1 コンストラクタLC_Serial_t()コンストラクタは PROTECTED メンバ 関 数 です (" 標 準 のプロキシ・クラス・メソッド" を 参 照 してください)。8.1.4.2 メンバ・リストdirty()getProperties()serialize()set_clean()set_dirty()InterSystems::LC_Serial_t::LC_Serial_t( ) [inline, protected]bool LC_Serial_t::dirty( ) const [inline]virtual void LC_Serial_t::getProperties( lc_dlist_in &in,bool unicode_srv)=0 [pure virtual]virtual void LC_Serial_t::serialize( lc_dlist_out *outlist,LC_Database *db)=0 [pure virtual]void LC_Serial_t::set_clean( ) [inline]void LC_Serial_t::set_dirty( ) [inline]8.2 データベース・クラス以 下 のデータベース・クラスを 使 用 できます。• Database — 標 準 の <strong>Caché</strong> <strong>C++</strong> バインディングで 使 用 されます。• LC_Database — Light <strong>C++</strong> バインディング・アプリケーション<strong>での</strong>み 使 用 されます。8.2.1 InterSystems::Database クラス標 準 の <strong>Caché</strong> <strong>C++</strong> バインディングで 使 用 されるデータベース・クラスです。<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 69


接 続 および 継 承 されるプロキシ・クラスのリファレンス8.2.1.1 コンストラクタDatabase()8.2.1.2 メンバ・リストdel_obj()get_class_global_info()get_class_info()get_classes_info()get_coln_property()get_conn()get_hdbc()Database::Database( const d_connection & conn,bool use_cache = true,bool is_lc_db = false )void InterSystems::Database::del_obj( const d_binary & oid,int concurrency) [inline]t_istream & Database::get_class_global_info( const_name_t cl_name, // const_name_t is a typedef for const wchar_t*cl_meta_info_kind info_kind )t_istream & Database::get_class_info( const_name_t cl_name, // const_name_t is a typedef for const wchar_t*cl_meta_info_kind info_kind )t_istream & Database::get_classes_info( const char * msg,const std::vector&lt; std::wstring > & cl_names )void Database::get_coln_property( int oref,const_name_t prop_name, // const_name_t is a typedef for const wchar_t*int ii,int idx,d_double & res )void Database::get_coln_property( int oref,const_name_t prop_name,int ii,int idx,d_int & res )void Database::get_coln_property( int oref,const_name_t prop_name,int ii,int idx,d_string & val )d_connection InterSystems::Database::get_conn( ) [inline]HDBC InterSystems::Database::get_hdbc( ) [inline]70 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


データベース・クラスget_indexes_info()get_job_id()get_lc_class_info()get_methods()get_nsp()get_oid()get_properties()get_property()get_proxies_info()get_queries()get_query_info()t_istream & Database::get_indexes_info( const_name_t cl_name, // const_name_t is a typedef for const wchar_t*cl_meta_info_kind info_kind )int InterSystems::Database::get_job_id( ) [inline]t_istream & Database::get_lc_class_info( const_name_t cl_name, // const_name_t is a typedef for const wchar_t*cl_meta_info_kind info_kind )t_istream & Database::get_methods( const_name_t class_name ) // const_name_t is a typedef for const wchar_t*const d_string& InterSystems::Database::get_nsp( ) const [inline]d_oid Database::get_oid( int oref )t_istream & Database::get_properties( const_name_t class_name ) // const_name_t is a typedef for const wchar_t*t_istream & Database::get_property( int oref,int ii,int jj,d_type_id type_id,const_name_t name ) // const_name_t is a typedef for const wchar_t*void Database::get_property( int oref,const_name_t prop_name,int ii,int jj,Args_mgr & args_mgr )Proxies_info* InterSystems::Database::get_proxies_info( ) [inline]t_istream & Database::get_queries( const_name_t class_name ) // const_name_t is a typedef for const wchar_t*t_istream & Database::get_query_info( const wchar_t * class_name,const wchar_t * query_name )<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 71


接 続 および 継 承 されるプロキシ・クラスのリファレンスget_run_mtd_level()get_serialization_info()get_srv_ver()get_status_info()int InterSystems::Database::get_run_mtd_level( ) const [inline]t_istream & Database::get_serialization_info( const_name_t cl_name, // const_name_t is a typedef for const wchar_t*cl_meta_info_kind info_kind )double InterSystems::Database::get_srv_ver( ) const [inline]void Database::get_status_info( const d_status & status,d_int & code,d_string & msg,const char * lang = "",Db_err * err = 0 )get_term_input_callback()get_term_output()init_coln()make_obj()open_cl_def()openid_obj()db_input_callback* InterSystems::Database::get_term_input_callback( ) [inline]db_output& InterSystems::Database::get_term_output( ) [inline]templatevoid InterSystems::Database::init_coln( int oref,C & coln) [inline]t_istream & Database::make_obj( const_name_t type_name, // const_name_t is a typedef for const wchar_t*const_str_t init_val = 0, // const_str_t is a typedef of const wchar_t*Db_err * err = 0 )const Class_def* InterSystems::Database::open_cl_def( const_name_t class_name, // const_name_t is a typedef for const wchar_t*bool check_exists = false) [inline]t_istream & Database::open_obj( const d_binary & oid,int concurrency = -1,int timeout = -1,Db_err * err = 0 )t_istream & Database::openid_obj( const_name_t name, // const_name_t is a typedef for const wchar_t*const_str_t id,// const_str_t is a typedef of const wchar_t*int concurrency = -1,int timeout = -1,Db_err * err = 0 )72 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


データベース・クラスreset_term_input_callback()void InterSystems::Database::reset_term_input_callback( ) [inline]reset_term_output_callback()run_method()set_property()void InterSystems::Database::reset_term_output_callback( ) [inline]t_istream & Database::run_method( int obj_ref,const_name_t cl_name, // const_name_t is a typedef for const wchar_t*const_name_t mtd_name,D_type ** args,int num_args,const int * refs,int num_refs,d_type_id ret_t )void Database::run_method( int oref,const_name_t cl_name,const_name_t mtd_name,Args_mgr & args_mgr )void Database::set_property( int oref,const_name_t prop_name,int ii,int jj,int mod_flag,Args_mgr & args_mgr )// const_name_t is a typedef for const wchar_t*void Database::set_property( int oref,int ii,int jj,int mod_flag,const_name_t name, // const_name_t is a typedef for const wchar_t*D_type * val )set_term_input_callback()void InterSystems::Database::set_term_input_callback( db_input_callback * f ) [inline]set_term_output_callback()sync()tcommit()tlevel()void InterSystems::Database::set_term_output_callback( db_output_callback * f ) [inline]void Database::sync ( )使 用 例 は、"トランザクションの 使 用 法 " を 参 照 してください。void InterSystems::Database::tcommit( Db_err * err = 0 ) [inline]使 用 例 は、"トランザクションの 使 用 法 " を 参 照 してください。int InterSystems::Database::tlevel( Db_err * err = 0 ) [inline]<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 73


接 続 および 継 承 されるプロキシ・クラスのリファレンスtrollback()tstart()unicode_srv()使 用 例 は、"トランザクションの 使 用 法 " を 参 照 してください。void InterSystems::Database::trollback( Db_err * err = 0 ) [inline]使 用 例 は、"トランザクションの 使 用 法 " を 参 照 してください。void InterSystems::Database::tstart( Db_err * err = 0 ) [inline]bool InterSystems::Database::unicode_srv( ) const [inline]8.2.2 InterSystems::LC_Database クラスLight <strong>C++</strong> バインディングで 使 用 されるデータベース・クラスです。このクラスは、Light <strong>C++</strong> バインディング・アプリケーション<strong>での</strong>み 使 用 可 能 です。8.2.2.1 コンストラクタLC_Database()8.2.2.2 メンバ・リストadd_key_prop()build_indexes()check_thread()InterSystems::LC_Database::LC_Database( const d_connection & conn,bool use_cache = true) [inline]使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。void LC_Database::build_indexes( const unsigned char * classname,int classname_length )使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。create_index_entry()cvtForCollation()del_obj()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。74 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


データベース・クラスdelete_direct()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。delete_index_entry()delete_object()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。get_coln_property()get_conn()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。d_connection InterSystems::Database::get_conn( ) [inline, inherited]get_default_concurrency_level()get_default_max_locks()get_default_timeout()get_hdbc()int InterSystems::LC_Database::get_default_concurrency_level( ) [inline]int InterSystems::LC_Database::get_default_max_locks( ) [inline]int InterSystems::LC_Database::get_default_timeout( ) [inline]使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。get_idkey_out_list()get_in_list()get_indexes_info()get_job_id()get_lc_class_info()get_methods()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 75


接 続 および 継 承 されるプロキシ・クラスのリファレンスget_nsp()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。get_oid()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。get_out_list()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。get_properties()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。get_property()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。get_proxies_info()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。get_queries()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。get_query_info()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。get_run_mtd_level()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。get_serialization_info()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。get_srv_info()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。get_srv_ver()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。get_status_info()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。get_term_input_callback()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。get_term_output()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。76 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


データベース・クラスinit_coln()lc_batch_save()lc_openid_obj()make_obj()open_cl_def()open_obj()openid_obj()reset()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。void LC_Database::lc_batch_save( int num_objs,lc_nested_list_iterator & buf,std::vector&lt; std::pair&lt; d_status, d_binary > > & errors,std::vector&lt; d_string > & ids,const unsigned char * classname,int classname_length,int concurrency = -1,bool use_idkeys = false,bool return_ids = false,byte_size_t cap = 0,bool do_tx = true )使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。reset_idkey_props()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。reset_term_input_callback()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。reset_term_output_callback()run_method()save()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 77


接 続 および 継 承 されるプロキシ・クラスのリファレンスsave_direct()このメソッドを、Light <strong>C++</strong> バインディング・プロジェクション・クラスで 使 用 される direct_save() メソッドと 混 同 しないでください (" 標 準 の LCB プロジェクション・クラス・メソッド" を 参 照 してください)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。set_key_props_id()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。set_key_props_index()set_lcb_option ()set_property()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。set_term_input_callback()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。set_term_output_callback()sync()tcommit()time_to_string()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 例 は、"トランザクションの 使 用 法 " を 参 照 してください。timestamp_to_string()tlevel()transaction()void InterSystems::Database::tcommit( Db_err * err = 0) [inline, inherited]void LC_Database::time_to_string( d_time & in,d_string & out )void LC_Database::timestamp_to_string( d_timestamp & in,d_string & out )使 用 例 は、"トランザクションの 使 用 法 " を 参 照 してください。int InterSystems::Database::tlevel( Db_err * err = 0) [inline, inherited]使 用 例 は、"トランザクションの 使 用 法 " を 参 照 してください。78 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


接 続 クラスvoid LC_Database::transaction( trans_flag_t flag,Db_err * err,int * level = 0) [virtual]trollback()tstart()unicode_srv()unlock()使 用 例 は、"トランザクションの 使 用 法 " を 参 照 してください。void InterSystems::Database::trollback( Db_err * err = 0) [inline, inherited]使 用 例 は、"トランザクションの 使 用 法 " を 参 照 してください。void InterSystems::Database::tstart( Db_err * err = 0) [inline, inherited]bool InterSystems::Database::unicode_srv( ) const [inline, inherited]使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。unlock_after_delete()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。8.3 接 続 クラス以 下 の 接 続 クラスを 使 用 できます。• d_connection — Conn_t クラス・インスタンスへのスマート・ポインタとして 動 作 します。• Conn_t — ベースとなる 接 続 クラスです。• tcp_conn — 標 準 のバインディングで 使 用 される 接 続 クラスです。• lc_conn — Light <strong>C++</strong> バインディング・アプリケーション<strong>での</strong>み 使 用 される 接 続 クラスです。8.3.1 d_connection クラスd_connection は、Conn_t クラス・インスタンスへのスマート・ポインタとして 動 作 するプロキシ・クラスです。 詳 細 は、"<strong>Caché</strong>データベースへの 接 続 " を 参 照 してください。8.3.2 InterSystems::Conn_t クラスベースとなる 接 続 クラスです。このクラスに 直 接 アクセスするのではなく、 常 に d_connection を 使 用 します。8.3.2.1 コンストラクタConn_t()InterSystems::Conn_t::Conn_t ( ) [inline]<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 79


接 続 および 継 承 されるプロキシ・クラスのリファレンス8.3.2.2 メンバ・リストalloc_messenger()free_messenger()get_thread_check()is_busy()is_connected()is_uni_srv()lock()release_to_pool()set_uni_srv()unlock()virtual int InterSystems::Conn_t::alloc_messenger( void ** ppm) [inline, virtual]virtual int InterSystems::Conn_t::free_messenger( void * pm) [inline, virtual]virtual LC_Thread_Check* InterSystems::Conn_t::get_thread_check( ) const [inline, virtual]bool InterSystems::Conn_t::is_busy( ) const [inline]bool InterSystems::Conn_t::is_connected( ) const [inline]bool InterSystems::is_uni_srv_info::is_uni_srv( ) const [inline, inherited]void InterSystems::Conn_t::lock( ) [inline]virtual void InterSystems::Conn_t::release_to_pool( ) [inline, virtual]void InterSystems::is_uni_srv_info::set_uni_srv( bool val) [inline, inherited]void InterSystems::Conn_t::unlock( ) [inline]8.3.3 InterSystems::tcp_conn クラス標 準 の <strong>Caché</strong> <strong>C++</strong> バインディング 用 の 接 続 クラスです。Conn_t から 継 承 され、TCP/IP を 使 用 して 接 続 を 実 装 します。8.3.3.1 コンストラクタtcp_conn()InterSystems::tcp_conn::tcp_conn ( ) [inline]80 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


接 続 クラス8.3.3.2 メンバ・リストalloc_messenger()connect()free_messenger()get_connection()get_namespaces()get_thread_check()is_busy()int tcp_conn::alloc_messenger( void ** ppm) [virtual]d_connection tcp_conn::connect( const d_string & conn_str,const d_string & srv_principal_name,int security_level,int timeout = 0,Db_err * err = 0) [static]d_connection tcp_conn::connect( const d_string & conn_str,const d_string & user,const d_string & pwd,int timeout = 0,Db_err * err = 0) [static]int tcp_conn::free_messenger( void * pm) [virtual]d_connection tcp_conn::get_connection( const d_string & conn_str,const d_string & user,const d_string & pwd,int timeout = 0,Db_err * err = 0) [static]void tcp_conn::get_namespaces( const wchar_t * host,const wchar_t * port,const wchar_t * srv_principal_name,int security_level,int timeout,std::list&lt; std::wstring > & res,Conn_err * err = 0) [static]void tcp_conn::get_namespaces( const wchar_t * host,const wchar_t * port,const wchar_t * user,const wchar_t * pwd,int timeout,std::list&lt; std::wstring > & res,Conn_err * err = 0) [static]LC_Thread_Check* InterSystems::tcp_conn::get_thread_check( ) const [inline, virtual]bool InterSystems::Conn_t::is_busy( ) const [inline, inherited]<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 81


接 続 および 継 承 されるプロキシ・クラスのリファレンスis_connected()is_uni_srv()lock()parse_conn_str()set_uni_srv()unlock()bool InterSystems::Conn_t::is_connected( ) const [inline, inherited]bool InterSystems::is_uni_srv_info::is_uni_srv( ) const [inline, inherited]void InterSystems::Conn_t::lock( ) [inline, inherited]void Conn_t::parse_conn_str( const std::wstring & conn_str,std::wstring * host,std::wstring * port,std::wstring * nsp) [static, protected, inherited]void InterSystems::is_uni_srv_info::set_uni_srv( bool val) [inline, inherited]void InterSystems::Conn_t::unlock( ) [inline, inherited]8.3.4 InterSystems::lc_conn クラスLight <strong>C++</strong> バインディング 用 の 接 続 クラスです。Conn_t から 継 承 され、プロセス 間 通 信 を 使 用 して 接 続 を 実 装 します。このクラスは、Light <strong>C++</strong> バインディング・アプリケーション<strong>での</strong>み 使 用 可 能 です。8.3.4.1 コンストラクタlc_conn()8.3.4.2 メンバ・リストalloc_messenger()connect()disconnect()lc_conn::lc_conn ( ) [inline]使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。static d_connection lc_conn::connect( const d_string & conn_str,const d_string & user,const d_string & pwd,int timeout = 0,Db_err * err = 0) [inline, static]void lc_conn::disconnect( ) [virtual]82 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


オブジェクト 参 照 クラスfree_messenger()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。get_thread_check()is_busy()is_connected()is_uni_srv()lock()release_to_pool()set_uni_srv()unlock()使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。bool InterSystems::is_uni_srv_info::is_uni_srv( ) const [inline, inherited]使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。使 用 しません (インターシステムズ 内 部 <strong>での</strong> 使 用 専 用 に 予 約 されています)。8.4 オブジェクト 参 照 クラス以 下 のクラスを 使 用 できます。• d_ref — 標 準 のバインディングで 使 用 される 参 照 クラス・テンプレートです。• lc_d_ref — Light <strong>C++</strong> バインディング・アプリケーション<strong>での</strong>み 使 用 される 参 照 クラス・テンプレートです。8.4.1 Template InterSystems::d_ref クラスこのクラスの 詳 細 は、"プロキシ・クラスの 生 成 " および "プロキシ・オブジェクトの 使 用 法 " を 参 照 してください。8.4.1.1 コンストラクタd_ref()templateInterSystems::d_ref< T >::d_ref( ) [inline]<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 83


接 続 および 継 承 されるプロキシ・クラスのリファレンス8.4.1.2 メンバ・リストconv_to()get()get_conv_ptr()get_cpp_type()get_data()get_ignore_null()templateInterSystems::d_ref< T >::d_ref( T * p) [inline]templateInterSystems::d_ref< T >::d_ref( bool dummy,T * p) [inline]templateInterSystems::d_ref< T >::d_ref( T * p,int * ref_cnt) [inline]templateInterSystems::d_ref< T >::d_ref( bool dummy,T * p,int * ref_cnt) [inline]templatetemplateInterSystems::d_ref< T >::d_ref( const d_ref< P > & p) [inline]templateInterSystems::d_ref< T >::d_ref( const d_ref< T > & r) [inline]templatetemplatevoid InterSystems::d_ref< T >::conv_to( d_ref< P > & res) [inline]templatevoid InterSystems::d_ref< T >::get( t_istream & in, Database * db) [virtual]void D_type::get( char * buf,byte_size_t size,Database * db = 0) [inherited]templateconst T* InterSystems::d_ref< T >::get_conv_ptr( ) const [inline]static SQLSMALLINT InterSystems::abs_d_ref::get_cpp_type( ) [inline, static, inherited]void D_type::get_data( d_seq_query & query) [virtual, inherited]static bool InterSystems::D_type::get_ignore_null( ) [inline, static, inherited]84 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


オブジェクト 参 照 クラスget_is_lc_dref()get_oref_n_name()get_type_id()is_null()is_obj()make_not_null()make_null()make_undef()operator !=operator ->operator =operator ==bool InterSystems::abs_d_ref::get_is_lc_dref( ) const [inline, inherited]void abs_d_ref::get_oref_n_name( t_istream & in,int * oref,cl_name_t name) [static, inherited]d_type_id InterSystems::abs_d_ref::get_type_id( ) const [inline, virtual, inherited]bool InterSystems::D_type::is_null( ) const [inline, inherited]bool InterSystems::D_type::is_obj( ) const [inline, inherited]void InterSystems::D_type::make_not_null( ) [inline, inherited]void InterSystems::abs_d_ref::make_null( ) [inline, virtual, inherited]void InterSystems::D_type::make_undef( ) [inline, inherited]bool InterSystems::abs_d_ref::operator!=( const abs_d_ref & r) const [inline, inherited]templateT* InterSystems::d_ref< T >::operator->( ) const [inline]templatetemplated_ref& InterSystems::d_ref< T >::operator=( const d_ref< P > & p) [inline]bool InterSystems::abs_d_ref::operator==( const abs_d_ref & r) const [inline, inherited]<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 85


接 続 および 継 承 されるプロキシ・クラスのリファレンスoperator *operator


オブジェクト 参 照 クラス8.4.2.1 コンストラクタlc_d_ref()8.4.2.2 メンバ・リストtemplatelc_d_ref< T >::lc_d_ref( ) [inline]templatelc_d_ref< T >::lc_d_ref( T * p ) [inline]templatelc_d_ref< T >::lc_d_ref( T * p,int * ref_cnt) [inline](このクラスには、パブリック・メンバ 関 数 はありません)。<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 87


9ユーティリティ・クラスのリファレンスこの 章 では、 便 利 ではあるものの <strong>Caché</strong> のデータ 型 に 対 応 せず、プロキシによって 自 動 的 に 継 承 されないクラスについて 説 明 します。• データ 処 理 クラス — Light <strong>C++</strong> バインディングを 使 用 したトランザクション 制 御 やバッチ 挿 入 、および 標 準 クエリを 実行 します。• エラー・クラス — エラー 報 告 を 行 います。9.1 データ 処 理 クラス• Transaction — プログラムで 例 外 が 発 生 した 場 合 に、 自 動 的 にロールバックを 行 います。• LC_Batch — Light <strong>C++</strong> バインディング 用 のバッチ 挿 入 クラスです。• d_query — SQL 文 の 作 成 、パラメータの 結 合 、クエリの 実 行 、および 結 果 セットの 検 索 の 各 メソッドを 提 供 します。9.1.1 InterSystems::Transaction クラスこのクラスでは、 例 外 発 生 時 の 自 動 的 なロールバック 動 作 が 保 証 されます。commit() または rollback() のいずれも 呼 び出 されていないときに、Transaction オブジェクトが 範 囲 外 になると、そのトランザクションはロールバックされます。Databaseトランザクション・メソッドと 異 なり、このクラスでは、 入 れ 子 になったトランザクションは 許 可 されません。 両 タイプのトランザクションの 詳 細 は、"トランザクションの 使 用 法 " を 参 照 してください。9.1.1.1 コンストラクタTransaction()クラス・コンストラクタがトランザクションを 開 始 します (Database::tstart() の 呼 び 出 しを 必 要 とする Database オブジェクトとは 異 なります)。9.1.1.2 メンバ・リストcommit()InterSystems::Transaction::Transaction( Database * _db ) [inline]トランザクションをコミットします。<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 89


ユーティリティ・クラスのリファレンスrollback()void InterSystems::Transaction::commit( ) [inline]同 じ Transaction オブジェクトに 対 して commit() を 複 数 回 呼 び 出 しても 何 も 実 行 されません ( 入 れ 子 になったトランザクションの 複 数 レベルでロールバックを 実 行 するために 繰 り 返 し 呼 び 出 すことのできる Database::tcommit()とは 異 なります)。現 在 のトランザクションをロールバックします。void InterSystems::Transaction::rollback( ) [inline]トランザクションがコミットまたはロールバックされる 前 に Transaction オブジェクトが 範 囲 外 になると、 自 動 的 に呼 び 出 されます。9.1.2 InterSystems::LC_Batch クラスこのクラスは、Light <strong>C++</strong> バインディングを 使 用 したバッチ 挿 入 のメソッドを 提 供 します。 詳 細 は、"LCB バッチ 挿 入 の 使用 法 " を 参 照 してください。9.1.2.1 コンストラクタLC_Batch()9.1.2.2 メンバ・リストclear()clear_errors()clear_ids()close()flush()InterSystems::LC_Batch::LC_Batch( LC_Database * _db,int _concurrency = 1,bool _return_ids = false,bool _throw_errs = true,size_t reserve_size = 32768,bool _do_tx = false) [inline]バッチに 追 加 されているオブジェクトを 保 存 しないようにするには、clear() を 呼 び 出 します。void InterSystems::LC_Batch::clear( ) [inline]void InterSystems::LC_Batch::clear_errors( ) [inline]void InterSystems::LC_Batch::clear_ids( ) [inline]void LC_Batch::close( )オブジェクトをデータベースに 保 存 するには、flush()、close() を 呼 び 出 すか、バッチ・オブジェクトを 破 棄 します。90 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


データ 処 理 クラスvoid LC_Batch::flush( )get_errors()エラーのリストが 返 されます。const std::vector< std::pair >&InterSystems::LC_Batch::get_errors( ) const [inline]flush() の 実 行 後 、get_errors() によって 以 下 のリストが 返 されます。• エラーがない 場 合 、リストの size() は 0 になります。• エラーがある 場 合 、 各 リストのエントリは、エラー・ステータスとオブジェクト・シリアル 化 の 組 み 合 わせになります。• プロジェクション・オブジェクトには set_from_err_list() メンバ 関 数 があり、エラーの 発 生 したオブジェクトのプロパティを 検 証 できます。get_ids()operator


ユーティリティ・クラスのリファレンスexecute()fetch()get_col_name()get_col_name_len()get_col_sql_type()get_cur_idx()get_data()void abs_d_query::execute( ) [inherited]void InterSystems::abs_d_query::execute( const wchar_t * sql_query) [inline, inherited]bool InterSystems::d_seq_query::fetch( ) [inline, inherited]const SQLWCHAR* InterSystems::abs_d_query::get_col_name( int idx) const [inline, inherited]SQLSMALLINT InterSystems::abs_d_query::get_col_name_len( int idx) const [inline, inherited]SQLSMALLINT InterSystems::abs_d_query::get_col_sql_type( int idx) const [inline, inherited]int InterSystems::d_seq_query::get_cur_idx( ) const [inline, inherited]void d_seq_query::get_data( char * buf,int * size,int cap,bool * is_null = 0) [inherited]void d_seq_query::get_data( d_binary * val) [inherited]void d_seq_query::get_data( d_bool * val) [inherited]void d_seq_query::get_data( d_currency * val) [inherited]void d_seq_query::get_data( d_date * val) [inherited]void d_seq_query::get_data( d_double * val) [inherited]void d_seq_query::get_data( d_int * val) [inherited]void d_seq_query::get_data( d_string * val,str_conv_t conv = NO_CONV) [inherited]void d_seq_query::get_data( d_time * val) [inherited]void d_seq_query::get_data( d_timestamp * val) [inherited]92 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


データ 処 理 クラスvoid d_seq_query::get_data( D_type * val) [inherited]void d_seq_query::get_data( d_wstring * val) [inherited]void d_seq_query::get_data( DATE_STRUCT * val,bool * is_null = 0) [inherited]void d_seq_query::get_data( double * val,bool * is_null = 0) [inherited]void d_seq_query::get_data( long * val,bool * is_null = 0) [inherited]void d_seq_query::get_data( std::string * val,bool * is_null = 0) [inherited]void d_seq_query::get_data( std::wstring * val,bool * is_null = 0) [inherited]void d_seq_query::get_data( TIME_STRUCT * val,bool * is_null = 0) [inherited]void d_seq_query::get_data( TIMESTAMP_STRUCT * val,bool * is_nuol = 0) [inherited]void d_seq_query::get_data( void * buf,int * size,int cap,bool * is_null = 0) [inherited]void d_seq_query::get_data( wchar_t * buf,int * size,int cap,bool * is_null = 0) [inherited]void InterSystems::d_seq_query::get_data( bool * val,bool * is_null = 0) [inline, inherited]get_job_id()get_num_cols()get_num_pars()int InterSystems::abs_d_query::get_job_id( ) [inline, inherited]int InterSystems::abs_d_query::get_num_cols( ) const [inline, inherited]int InterSystems::abs_d_query::get_num_pars( ) const [inline, inherited]<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 93


ユーティリティ・クラスのリファレンスget_par_col_size()SQLUINTEGER InterSystems::abs_d_query::get_par_col_size( int idx) const [inline, inherited]get_par_num_dec_digits()get_par_sql_type()is_par_nullable()is_par_unbound()prepare()set_cur_idx()set_par()SQLSMALLINT InterSystems::abs_d_query::get_par_num_dec_digits( int idx) const [inline, inherited]SQLSMALLINT InterSystems::abs_d_query::get_par_sql_type( int idx) const [inline, inherited]SQLSMALLINT InterSystems::abs_d_query::is_par_nullable( int idx) const [inline, inherited]bool InterSystems::abs_d_query::is_par_unbound( int idx) const [inline, inherited]void abs_d_query::prepare( const char * cl_name,const char * proc_name) [inherited]void abs_d_query::prepare( const char * sql_query,int len) [inherited]void abs_d_query::prepare( const wchar_t * cl_name,const wchar_t * proc_name) [inherited]void abs_d_query::prepare( const wchar_t * sql_query,int len) [inherited]void abs_d_query::prepare( d_string & sql_name,int num_pars) [inherited]void InterSystems::abs_d_query::prepare( const char * sql_query) [inline, inherited]void InterSystems::abs_d_query::prepare( const wchar_t * sql_query) [inline, inherited]void InterSystems::d_query::set_cur_idx( int idx) [inline]void abs_d_query::set_par( int idx) [inherited]94 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


データ 処 理 クラスvoid abs_d_query::set_par( int idx,const char * buf,char_size_t size) [inherited]void abs_d_query::set_par( int idx,const d_binary & val) [inherited]void abs_d_query::set_par( int idx,const d_bool & val) [inherited]void abs_d_query::set_par( int idx,const d_currency & val) [inherited]void abs_d_query::set_par( int idx,const d_date & val) [inherited]void abs_d_query::set_par( int idx,const d_double & val) [inherited]void abs_d_query::set_par( int idx,const d_int & val) [inherited]void abs_d_query::set_par( int idx,const d_string & val) [inherited]void abs_d_query::set_par( int idx,const d_time & val) [inherited]void abs_d_query::set_par( int idx,const d_timestamp & val) [inherited]void abs_d_query::set_par( int idx,const D_type & val) [inherited]void abs_d_query::set_par( int idx,const d_wstring & val) [inherited]void abs_d_query::set_par( int idx,const void * buf,byte_size_t size) [inherited]void abs_d_query::set_par( int idx,const wchar_t * buf,char_size_t size) [inherited]void abs_d_query::set_par( int idx,double val) [inherited]<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 95


ユーティリティ・クラスのリファレンスset_par_default()set_stored_proc()skip()throw_err()unbind_pars()void abs_d_query::set_par( int idx,int val) [inherited]void InterSystems::abs_d_query::set_par( int idx,const char * val) [inline, inherited]void InterSystems::abs_d_query::set_par( int idx,const std::string & val) [inline, inherited]void InterSystems::abs_d_query::set_par( int idx,const std::wstring & val) [inline, inherited]void InterSystems::abs_d_query::set_par( int idx,const wchar_t * val) [inline, inherited]void abs_d_query::set_par_default( int idx) [inherited]void InterSystems::abs_d_query::set_stored_proc( bool is_stored_proc) [inline, inherited]void InterSystems::d_seq_query::skip( unsigned int num_cols = 1) [inline, inherited]void abs_d_query::throw_err( SQLSMALLINT err_src,SQLHANDLE handle) [static, inherited]void abs_d_query::unbind_pars( ) [inherited]9.2 エラー・クラスエラー 報 告 を 行 います。9.2.1 InterSystems::Db_err クラスこのクラスの 使 用 例 は、"<strong>C++</strong> バインディング・アプリケーションのサンプル" を 参 照 してください。96 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法


エラー・クラス9.2.1.1 コンストラクタDb_err()9.2.1.2 メンバ・リストclear()get()get_code()get_msg()get_src()log()make_err_msg()InterSystems::Db_err::Db_err( ) [inline]InterSystems::Db_err::Db_err( int c) [inline]InterSystems::Db_err::Db_err( int c,const char * m,int l,const char * s) [inline]InterSystems::Db_err::Db_err( int c,const std::string & m) [inline]InterSystems::Db_err::Db_err( int c,const std::string & m,const char * s) [inline]void InterSystems::Db_err::clear( ) [inline]void Db_err::get( t_istream & in)int InterSystems::Db_err::get_code( ) const [inline]const std::string& InterSystems::Db_err::get_msg( ) const [inline]const std::string& InterSystems::Db_err::get_src( ) const [inline]void Db_err::log( ) conststd::string Db_err::make_err_msg( const char * msg,const char * arg1 = 0,const char * arg2 = 0,const char * arg3 = 0,const char * arg4 = 0,const char * arg5 = 0) [static]<strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法 97


ユーティリティ・クラスのリファレンスoperator bool()reset()set_code()set_msg()set_src()to_xml()std::string Db_err::make_err_msg( const char * msg,const wchar_t * arg1 = 0,const wchar_t * arg2 = 0,const wchar_t * arg3 = 0,const wchar_t * arg4 = 0,const wchar_t * arg5 = 0) [static]InterSystems::Db_err::operator-bool( ) const [inline]void InterSystems::Db_err::reset( int c,const char * m) [inline]void InterSystems::Db_err::set_code( int code) [inline]void InterSystems::Db_err::set_msg( const char * m) [inline]void InterSystems::Db_err::set_msg( const char * m,int l) [inline]void InterSystems::Db_err::set_src( const char * s) [inline]void Db_err::to_xml( xml_writer & out) const98 <strong>Caché</strong> <strong>での</strong> <strong>C++</strong> の 使 用 法

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!