Caché C++ バインディング
Caché C++ バインディングは、C++ アプリケーション内で Caché オブジェクトを直接使用する簡単な方法を提供します。以下の方法で、Caché データベースと連動する C++ アプリケーションを生成できます。
-
Caché C++ バインディング
Caché C++ バインディングでは、C++ アプリケーションから Caché サーバ上のオブジェクトを操作できます。Caché クラス・ジェネレータによって、あらゆる Caché クラスに対する C++ プロキシ・クラスを作成できます。プロキシ・クラスには、C++ アプリケーション内でコンパイルおよび使用が可能な標準的な C++ コードが含まれ、対応する Caché クラスが持つプロパティおよびメソッドへのアクセスを可能にします。
C++ バインディングは、並行処理やトランザクション制御に加えて、オブジェクト・データベースの永続性を完全にサポートします。また、高度なデータ・キャッシング・スキーマも装備されており、Caché サーバと C++ アプリケーションが別マシンにある場合のネットワーク・トラフィックを最小限に抑えることができます。
-
コンパイル済みの C++ プロキシ・クラスを使用する代わりに、実行時に Caché クラスを動的に操作できます。したがって、汎用クラスを扱い、特定の Caché クラスに依存しないアプリケーションやツールを記述する際に役立ちます。
-
Light C++ バインディング (LCB) は、単純なデータを非常に高速にロードすることを主な目的とした、Caché C++ ライブラリの限定されたサブセットです。データ交換に TCP/IP ではなくプロセス間通信を使用し、C++ アプリケーションのプロセスと Caché オブジェクト・サーバのプロセスを 1 つに結合します。オブジェクトの基本的な操作 (オブジェクトの作成、ID によるオブジェクトのオープン、更新、および削除) については、標準的な C++ バインディングと比較すると、処理が 10 ~ 20 倍も高速になります。
-
Caché ODBC ドライバ
Caché には、データベースに対して SQL クエリを実行する機能など、Caché への高性能なリレーショナル・アクセスを提供する標準の ODBC ドライバが組み込まれています。C++ バインディングには、ODBC の複雑さをカプセル化する特別なクラスも用意されています。柔軟性を最大限に活かすために、アプリケーションで ODBC と Caché C++ バインディングを同時に使用できます。
それぞれの機能については、この後の章で説明します。
このドキュメントは、C++ および C++ 標準ライブラリの基礎を理解しているユーザのために作成されたものです。Caché ではいくつかの C++ コンパイラがサポートされていますが、C++ コンパイラや開発環境は含まれていません。
C++ バインディング・アーキテクチャ
Caché C++ バインディングを使用すると、C++ アプリケーションから Caché サーバ内にあるオブジェクトにアクセスして、それを操作できます。これらのオブジェクトは、Caché オブジェクト・データベースに格納される永続オブジェクト、または Caché サーバ内で処理を行う一時的なオブジェクトです。
Caché C++ バインディングには、以下のコンポーネントが含まれます。
-
C++ ジェネレータは、Caché クラス・ディクショナリに定義されたクラスから C++ プロキシ・クラス (ソース・ファイルおよびヘッダ・ファイル) を生成するプログラムです。
-
C++ ライブラリは、C++ プロキシ・クラスのすべての機能を実装するために Caché C++ ジェネレータによって使用される C++ クラスのセットです。このライブラリには、C++ 標準ライブラリ・フレームワークに適合するために特別な対応を必要とする、特殊な Caché サーバ・クラスのプロキシ・クラス・セットも含まれます。
-
Caché オブジェクト・サーバ
Caché オブジェクト・サーバは、C++ クライアントと Caché データベース・サーバ間の通信を管理する高性能なサーバ・プロセスです。通信には標準のネットワーク・プロトコル (TCP/IP) が使用され、Caché がサポートする任意のプラットフォーム上で動作できます。Caché オブジェクト・サーバは、C++、Java、JDBC、ODBC、Perl、Python などの、あらゆる Caché 言語バインディングによって使用されます。
Caché C++ ジェネレータは、Caché クラス・ディクショナリ内のあらゆるクラスに、C++ クライアント・クラスを生成できます。これらの生成された C++ クラスは、対応する Caché サーバ上の Caché クラスと (TCP/IP ソケットを使用して) 実行時に通信します。以下はその図です。
基本機能は以下のとおりです。
-
Caché 内で 1 つ以上のクラスを定義します。これらのクラスは、Caché データベースに格納される永続オブジェクト、または、Caché サーバで実行する一時的なオブジェクトです。
-
Caché C++ クラス・ジェネレータは、それぞれの Caché クラスに対応する C++ クラスを生成します。これらのクラスには、サーバ上の対応する Caché メソッドを呼び出す "スタブ・メソッド" や、オブジェクト・プロパティのアクセサ・メソッド (GET と SET) が含まれます。
-
実行時、C++ アプリケーションは Caché サーバに接続します。その後、Caché オブジェクト・サーバによって保持されている Caché オブジェクトに対応する C++ オブジェクトを生成できます。これらのオブジェクトを、他の C++ オブジェクトとして使用することができます。
-
システムは、すべての通信とクライアント側のデータ・キャッシングを自動的に管理します。実際の配置構成は、アプリケーション開発者が決定します。C++ クライアント・アプリケーションと Caché サーバは、同じ物理マシン、あるいは異なるマシンのいずれに置いてもかまいません。C++ アプリケーションと Caché サーバ間のすべての通信は、標準 TCP/IP プロトコルを使用します。
実行時のアーキテクチャは以下のとおりです。
-
Caché データベース・サーバ (複数可)。Caché サーバは、データベース処理と Caché オブジェクト・メソッドの実行を管理します。
-
生成およびコンパイルされた C++ プロキシ・クラスがリンク付けされた、 C++ "クライアント"・アプリケーション (通常、C++ は専門的なツールやミドル・ウェアの開発に使用しますが、このドキュメントでは、これらのコードをサーバ・コードと区別する目的でクライアントと呼びます)。
-
Caché C++ ライブラリに含まれる、接続クラスによって提供されるアプリケーションおよびサーバ間の接続。
Light C++ バインディングのアーキテクチャはまったく異なります。このアーキテクチャでは、C++ アプリケーションと Caché オブジェクト・サーバ間のデータ交換を行うために TCP/IP の代わりにプロセス間通信を使用し、同じマシン上でクライアントとサーバ操作をすべて実行して、柔軟性の代わりに速度を得ます。
Caché C++ ライブラリ
Caché C++ バインディングが提供する C++ クラスのダイナミック・ライブラリは、Caché サーバとの通信に必要な、基本的な接続やキャッシング機能を実装します。
Caché への接続に必要な C++ コンポーネントは、<cachesys>\dev\cpp\lib ディレクトリにある C++ ライブラリ・ファイルに含まれています (ご使用のシステムの <cachesys> の場所については、"Caché インストール・ガイド" の "Caché の既定のインストール・ディレクトリ" を参照してください)。このディレクトリには、さまざまなプラットフォーム用のさまざまなビルド構成に対応するライブラリの各バージョンが含まれます。対応するインクルード・ファイルのセットは、 <cachesys>\dev\cpp\include サブディレクトリにあります。
このライブラリには、Caché クラス・ライブラリにある多数のクラスの C++ バージョンがあります。その中には、%PersistentOpens in a new tab、%RegisteredObjectOpens in a new tab、%SerialObjectOpens in a new tab や、さまざまな Caché コレクション・クラス、および各種データ型クラスの C++ バージョンが含まれます。さらに、このライブラリには C++ アプリケーション内で Caché サーバとの通信を管理するために使用する、さまざまなクラスが含まれます。
C++ バインディング・アプリケーションで使用可能なクラスは、以下の各章にリストして説明しています。
-
単純なデータ型クラスのリファレンス — 文字列や数字などの単純なデータを含むリテラル・データ型について説明しています。
-
オブジェクトのデータ型クラスのリファレンス — リスト、配列、ストリームなど、標準の Caché オブジェクトのデータ型クラスに対応する、事前定義されたプロキシ・クラスについて説明しています。
-
接続および継承されるプロキシ・クラスのリファレンス — プロキシ・クラスを生成して、それらをサーバに接続するために必要な機能を提供するクラスをリストしています。
-
ユーティリティ・クラスのリファレンス — トランザクション、バッチ処理、および SQL クエリ用の特殊なクラスをいくつかリストしています。
インストールと構成
Caché C++ バインディング・ソフトウェアは、標準の Caché インストールの一部ではなく、カスタム・インストールでオプションとして提供されます。C++ バインディングをサポートするプラットフォームの一覧については、このリリース用のオンライン・ドキュメント "インターシステムズでサポートされるプラットフォームOpens in a new tab" の “サポート対象クライアント・プラットフォーム” を参照してください。
Caché C++ バインディング・アプリケーションには、C++ 標準ライブラリをサポートする C++ コンパイラが必要です。コンパイルするときは、各自のパスに以下のディレクトリが含まれている必要があります (ご使用のシステムの <cachesys> の場所については、"Caché インストール・ガイド" の "Caché の既定のインストール・ディレクトリ" を参照してください)。
<cachesys>\bin <cachesys>\dev\cpp\lib
コンパイルされた C++ バインディング・アプリケーションは、追加の設定作業を一切行うことなく既存の Caché クラスにアクセスでき、Caché のインストールされていないクライアント・マシンで実行できます。
レベル 3 ("ロック・ダウン") セキュリティで Caché がインストールされている場合、Caché C++ ジェネレータを実行するには、%Service_Bindings を有効にする必要があります。
Light C++ バインディングには、他にも要件があります ("Light C++ バインディングのインストール" を参照)。
ソースからの Caché C++ バインディングの構築
特殊な状況によっては、ソース・コードから Caché C++ バインディングを構築することが便利な場合があります。Caché のカスタム・インストール時、"C++ SDK" オプションを選択するとソース・コードがインストールされます。Windows MSVC プロジェクトや UNIX® Makefile は、さまざまなバージョンのコンパイラや標準ライブラリを使用するようにカスタマイズできます。UNIX® では gmake が必要です。出荷時のソース、プロジェクト、および Makefile は、製品バージョンの C++ バインディングの構築に使用されたものと同じですが、Linux で異なる gcc バージョンを使用して再構築を行う際は、これらを変更せずに使用できます。通常、異なる gcc バージョンで構築された C++ コードはバイナリ互換ではないので、これが必要になる場合があります。
Microsoft Visual Studio 2008 の設定
ここでは、Windows XP 上の Microsoft Visual Studio 2008 で、Caché C++ バインディング・プロジェクトを構成する手順について説明します。他の環境では、一部の手順が異なる場合があります。
プロジェクトを構成する前に、一部の Windows 環境変数を設定する必要があります。手順は、以下のとおりです。
-
Windows の [スタート] メニューで、[設定]→[コントロール パネル]→[システム] を選択します。[システムのプロパティ] ダイアログ・ボックスが開きます。
-
[システムのプロパティ] ダイアログ・ボックスで、[詳細設定] タブを選択し、[環境変数] ボタンをクリックします。[環境変数] ダイアログ・ボックスが開きます。
-
[環境変数] ダイアログ・ボックスの [システム環境変数] セクションに以下の変数を追加します (ご使用のシステムの <cachesys> の場所については、"Caché インストール・ガイド" の "Caché の既定のインストール・ディレクトリ" を参照してください)。
変数名
変数の値
CACHEBIN <cachesys>\bin CACHECPPLIB <cachesys>\dev\cpp\lib
-
PATH システム環境変数に以下を追加します。
;%CACHEBIN%;%CACHECPPLIB%
以下の手順に従って、Visual Studio 2008 のプロジェクト参照ウィンドウを開きます。
-
Visual C++ で構成するプロジェクトを開きます。以下の手順では、<cachesys>\Dev\cpp\samples\msvc90\ にあるサンプル・プロジェクトを開いていることを前提としています。
-
メイン・メニューで、[プロジェクト]→[サンプルのプロパティ] を選択します。[サンプル・プロパティ・ページ] ダイアログ・ボックスが開きます。
-
ダイアログ・ボックスの左側に表示されるツリーで、最上位の項目をクリックします。これを実行できない場合は、右側の一部のタブが非表示になっている可能性あります。
-
[サンプル・プロジェクト・ページ] ダイアログ・ボックスで、以下の手順の変更を実行します。
wchar_t および ランタイム型情報 (RTTI) サポートを有効にします。
-
左上隅にある [構成] ドロップダウン・ボックスで、[すべての構成] を選択します。
-
左側のメニュー・ツリーで、[構成プロパティ]→[C/C++]→[言語] を選択します。
-
[wchar_t をビルトイン型として扱う] の値が [はい] に設定されていることを確認します。
-
[ランタイム型情報を有効にする] の値が [はい] に設定されていることを確認します。
-
[適用] ボタンをクリックします。
C++ バインディング・ヘッダ・ファイルの場所を指定します。
-
左側のメニュー・ツリーで、[構成プロパティ]→[C/C++]→[全般] を選択します。
-
[追加のインクルード ディレクトリ] テキスト・フィールドに、以下を追加します。
"<cachesys>\dev\cpp\include\"
ここで <cachesys> は、Caché のインストール・ディレクトリです。前のエントリと区切るには、セミコロンを使用します。
-
[適用] ボタンをクリックします。
C++ バインディング・ライブラリ・ディレクトリの場所を指定します。
-
左上隅にある [構成] ドロップダウン・ボックスで、[すべての構成] を選択します。
-
左側のメニュー・ツリーで、[構成プロパティ]→[リンカ]→[全般] を選択します。
-
[追加のライブラリ ディレクトリ] テキスト・フィールドに、以下を追加します。
"$(CACHECPPLIB)\"
前のエントリと区切るには、セミコロンを使用します。
-
[適用] ボタンをクリックします。
C++ バインディング・リリース・ライブラリの場所を指定します。
-
左上隅にある [構成] ドロップダウン・ボックスで、[リリース] を選択します。
-
左側のメニュー・ツリーで、[構成プロパティ]→[リンカ]→[入力] を選択します。
-
[追加の依存ファイル] テキスト・フィールドに、以下を追加します。
cppbind_msvc90.lib
前のエントリと区切るには、スペースを使用します。
-
Light C++ バインディングを使用するときは、以下のファイルを追加します。
lcbind_msvc90.lib lcbclient.lib
-
[適用] ボタンをクリックします。
C++ バインディング・デバッグ・ライブラリの場所を指定します。
-
左上隅にある [構成] ドロップダウン・ボックスで、[デバッグ] を選択します。
-
左側のメニュー・ツリーで、[構成プロパティ]→[リンカ]→[入力] を選択します。
-
[追加の依存ファイル] テキスト・フィールドに、以下を追加します。
cppbind_msvc90d.lib
前のエントリと区切るには、スペースを使用します。
-
Light C++ バインディングを使用するときは、以下のファイルを追加します。
lcbind_msvc90d.lib
-
[適用] ボタンをクリックします。
リリース・コードの生成には、以下のようにランタイム・ライブラリを指定します。
-
左上隅にある [構成] ドロップダウン・ボックスで、[リリース] を選択します。
-
左側のメニュー・ツリーで、[構成プロパティ]→[C/C++]→[コード生成] を選択します。
-
[ランタイム ライブラリ] ドロップダウン・ボックスから、[マルチスレッド DLL (/MD)] を選択します。
-
[適用] ボタンをクリックします。
デバッグ・コードの生成には、以下のようにランタイム・ライブラリを指定します。
-
左上隅にある [構成] ドロップダウン・ボックスで、[デバッグ] を選択します。
-
左側のメニュー・ツリーで、[構成プロパティ]→[C/C++]→[コード生成] を選択します。
-
[ランタイム・ライブラリ] ドロップダウン・ボックスから、[マルチスレッド デバッグ DLL (/MDd)] を選択します。
-
[OK] ボタンをクリックし、[サンプル・プロパティ・ページ] ダイアログを閉じます。
ACE ライブラリを使用した C++ バインディングの使用法
Windows 上で C++ バインディング (通常または Light) を ACE ライブラリと共に使用するには、ACE ヘッダ・ファイルの後に Caché ヘッダ・ファイルを記述する必要があります。これは、ACE ヘッダには Microsoft winsock2.h が、Caché C++ バインディング・クラス・ヘッダには Microsoft windows.h が含まれているためです。両方のファイルを含める場合、windows.h の前に winsock2.h がないと、定義の競合のために MSVC コンパイラは失敗します。
ACE ヘッダを含む例を以下に示します。Sample_Person.h および Sample_Address.h は Caché C++ バインディングのクラス・ヘッダであるため、すべての 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<ACE_SOCK_STREAM> SVC_HANDLER;
typedef IPC_Server<SVC_HANDLER, ACE_SOCK_ACCEPTOR> IPC_SERVER;
#include "Sample_Person.h" // C++ binding projected class header
#include "Sample_Address.h" // C++ binding projected class header
Light C++ バインディングのインストール
Light C++ バインディング (LCB) は、Caché C++ バインディングの特別な目的を持ったサブセットで、いくつかの追加要件があります。Light C++ バインディングをサポートするプラットフォームの一覧については、このリリース用のオンライン・ドキュメント "インターシステムズでサポートされるプラットフォームOpens in a new tab" の “サポート対象クライアント・プラットフォーム” を参照してください。
LCB の追加要件
LCB では、設計上、以下の追加要件があります。
-
GLOBALS_HOME という環境変数を Caché インストール環境の <cache-root> ディレクトリの完全パスに設定する必要があります (システムの <cache-root> の場所については “既定の Caché インストール・ディレクトリ” を参照)。この環境変数が設定されていないと、すべての接続の試行に失敗します。
以前のリリースでは、必須環境変数は CACHEMGRDIR であり、<cache-root> ではなく <cache-root>/mgr ディレクトリに設定していました。この変数を使用することもまだ可能ですが、非推奨となっています。両変数が設定されている場合は、CACHEMGRDIR ではなく GLOBALS_HOME が使用されます。
-
標準の C++ バインディングとは異なり、LCB アーキテクチャでは、Caché および LCB アプリケーションが同じマシン上にインストールされている必要があります。これは、それらを同じプロセスで実行する必要があるためです (詳細は、"Light C++ バインディング・アーキテクチャ" を参照してください)。
-
LCB は低レベルのコールイン・インタフェースに依存するため、任意の LCB アプリケーションを含むディレクトリのフル・パスは、232 文字未満にする必要があります。
-
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 のセキュリティで Caché をインストールしている場合は、LCB の接続を許可するために %Service_callin を有効にする必要があります。
Windows 64 ビット・プラットフォームへのインストール
Light C++ バインディングは、Windows の 64 ビット・プラットフォームで使用できます。64 ビット Windows 用の Caché インストールでは、スタジオに必要な 32 ビット・バージョンの標準 Caché C++ バインディングもインストールされます。64 ビット・バージョンの LCB サンプル・アプリケーションを構築するには、これらのアプリケーション用の MSVC プロジェクト・ファイルで、"win64 Release" または "win64 Debug" 構成を使用します。
LCB アプリケーションのデバッグ・バージョンを実行するには、64 ビット・デバッグ・バージョンのライブラリである msvcrtd.dll および msvcp60d.dll を含む、Microsoft Platform SDK をダウンロードする必要があります。64 ビットのシステムでは、Microsoft Visual Studio をインストールしても、これらのファイルの 32 ビット・バージョンしかインストールされません (これは Caché または Light C++ バインディングに固有の問題ではなく、64 ビット・システムで C++ 開発を実行するうえでの一般的な問題です)。
UNIX® での高信頼アプリケーションの実行
UNIX® で Light C++ バインディング・アプリケーションを実行するには、それが "高信頼アプリケーション" でない限り、root で実行するか、cacheusr グループに属するユーザとして実行する必要があります。配置済みのアプリケーションについては、高信頼アプリケーションにすることをお勧めします。これにより、アプリケーションは、実質的なグループとして cacheusr で実行されますが、このアプリケーションの実行可能ファイルに対して実行アクセス権を持つユーザであれば誰でもこのアプリケーションを実行できます (この実行アクセス権は、UNIX® の一般的な手法である chmod を使用して制御します)。
高信頼アプリケーションにするには、以下を実行します。
-
アプリケーションの makefile で、アプリケーションをリンクするフラグのうち、libcachet.so、liblcbind.so、および liblcbclient.so の各ライブラリについて、ランタイム・パス名に -rpath <pathname> を指定します。g++ では、以下を使用します。
-Xlinker -rpath -Xlinker <pathname>
ランタイム・パス名とは、アプリケーションを実行する環境内のライブラリへのパス名で、アプリケーションを構築した環境でのパス名とは完全に異なる場合があります。
-
または、各ライブラリの /usr/lib にソフト・リンクを作成することもできます。
cd /usr/lib ln -s <path>/libcachet.so libcachet.so ln -s <path>/liblcbind.so liblcbind.so ln -s <path>/liblcbclient.so liblcbclient.so
高信頼アプリケーションで共有ライブラリを使用する場合は、アプリケーションの構築時、共有ライブラリの実行時の場所をわかっている必要があります。これは、ユーザが LD_LIBRARY_PATH を使用して、共有ライブラリの信頼されていないバージョンをポイントしないようにするためです。アプリケーションの構築時、特定の共有ライブラリの実行時のパスを指定しなかった場合は、既定で /usr/lib/<libraryname> が使用されます。
-
LCB アプリケーションの所有者、グループ、SUID ビットを設定します。以下はその例です。
chown <whoever> lcbdemo chgrp cacheusr lcbdemo chmod g+s lcbdemo
サンプル・プログラム
標準の Caché インストールには、C++ のサンプル・ディレクトリである <cachesys>\dev\cpp\samples\ に、いくつかの簡単なサンプル・プログラムが含まれています (ご使用のシステムの <cachesys> の場所については、"Caché インストール・ガイド" の "Caché の既定のインストール・ディレクトリ" を参照してください)。用意されているサンプル・プログラムは以下のとおりです。
-
samples.cpp — 標準の Caché C++ バインディングの使用法を示す簡単なプログラムです。
-
lcbdemo.cpp — Light C++ バインディングの使用法を示します。
-
mttest.cpp — スレッドの安全性を検証するためのマルチスレッドの LCB テストです。
-
qtest.cpp — 標準のバインディングおよびマルチスレッド LCB の両方を使用するクエリ・プログラムです。
これらのプログラムの MS Visual Studio プロジェクト・ファイルは、..\samples\msvc90 にあります。
UNIX® プラットフォームの場合は、Caché 2008.1 以降で run_samples.sh を使用できます。
samples.cpp プログラムは、同様に標準の Caché インストールに付属する、SAMPLES ネームスペースの Sample パッケージにあるクラスを使用します。以下のファイルが C++ のメインのサンプル・ディレクトリにない場合は、Sample.PersonOpens in a new tab および Sample.AddressOpens in a new tab について、以下の C++ プロキシ・クラス・ファイルを生成する必要があります ("プロキシ・クラスの生成" を参照してください)。
-
Sample_Person.h、Sample_Person.cpp
-
Sample_Address.h、Sample_Address.cpp
lcbdemo.cpp プログラムは、SAMPLES ネームスペースの User パッケージにあるクラスを使用します。以下の C++ プロキシ・クラス・ファイルが C++ のメインのサンプル・ディレクトリにない場合は、User.PersonOpens in a new tab および User.testidkey2Opens in a new tab について、これらのファイルを生成する必要があります。
-
LC_User_Person.h、LC_User_Person.cpp
-
LC_User_testidkey2.h、LC_User_testidkey2.cpp