11 カートリッジ・サービスの使用
カートリッジ・サービスの使用方法について考えます。
11.1 カートリッジ・サービスの概要
カートリッジ・サービスとは、Oracle Extensibilityフレームワークにおけるデータ・カートリッジの作成に役立つ一連のサービスです。
Oracleカートリッジ・サービスを使用すると、次のようなメリットがあります。
移植性
Oracleカートリッジ・サービスは、様々なマシン・アーキテクチャにまたがって作業できる柔軟性を提供します。
Oracle環境内での柔軟性
すべてのカートリッジ・サービスが、クライアントが購入した操作の構成に関係なくOracle Databaseで動作するという点で、別のタイプの柔軟性が提供されます。
言語独立性
グローバリゼーション・サポート・サービスの使用により、カートリッジを国際化できます。言語独立性とは、カートリッジの様々なインスタンスを異なる言語環境で操作できることを意味します。
サーバーとの緊密な統合
Oracle ORDBMSへのアクセスを容易にするために、各種のカートリッジ・サービスが設計されています。これにより、同じ操作を実行しようとするクライアント側プログラムのパフォーマンスが大幅に向上します。
保証付きの互換性
Oracle Databaseのテクノロジは急速に進化しており、クライアントが操作しているOracleのリリースがすべて同じであるとはかぎりません。カートリッジ・サービスは、すべてのバージョンのOracle Databaseで動作します。
様々なカートリッジの統合
カートリッジ・サービスの統合により、様々なデータ・カートリッジの均一な統合を生成できます。
データ・カートリッジの一部として使用できる一連のサービスについて考えます。これらのインタフェースを記述するAPIについては、「C、C++およびJavaを使用したカートリッジ・サービス」を参照してください。
11.2 カートリッジ・ハンドル
カートリッジ・サービスは、次の2種類のOCIハンドルにカプセル化された各種のハンドルを必要とします。
環境ハンドル
環境ハンドルはOCIEnv
またはOCI_HTYPE_ENV
です。セッションが使用できない場合は、プロセス・レベルで各種のカートリッジ・サービスが必要です。OCIInitialize
()では、カートリッジ・サービスにOCI_OBJECT
オプションを使用する必要があります。
ユーザー・セッション・ハンドル
ユーザー・セッション・ハンドルはOCISession
またはOCI_HTYPE_SESSION
です。コールアウトでは、データベースへの接続をオープンしなくても、ハンドルが割り当てられる場合にサービスを使用できます。
すべてのカートリッジ・サービス・コールは、環境ハンドルまたはセッション・ハンドルである引数の1つとしてvoid
*
OCIハンドルを取ります。ほとんどのサービス・コールにはいずれかのハンドルを使用できますが、一方のハンドルでは無効なコールがあります。たとえば、環境ハンドルを使用してOCI_DURATION_SESSION
を割り当てるとエラーになる場合があります。通常、エラーはエラー・ハンドルで戻されます。
11.2.1 クライアント側での使用
ほとんどのカートリッジ・サービスは、クライアント側コードでも使用できます。制限事項については、各サービスを参照してください。クライアント側でカートリッジ・サービスを使用するには、OCI_OBJECT
オプションを指定してOCI環境を初期化する必要があります。これは自動的にカートリッジに反映されます。
11.2.2 カートリッジ側での使用
この章で説明するサービスのほとんどはデータベース・カートリッジの開発に使用できますが、制限事項については各サービスのドキュメントを参照してください。コールアウトでセッション・ハンドルを取得するために、新規サービス・コールを使用できます。セッション・ハンドルは、サーバーへの接続をオープンせずに使用できます。
11.2.3 サービス・コールの作成
いずれかのサービスを使用する前に、OCI環境ハンドルを初期化する必要があります。すべてのサービスは引数としてOCI環境(またはuser_session)ハンドルを取ります。エラーはOCIエラー・ハンドルで戻されます。各種サービス・コールに必要なサブ・ハンドルがOCI環境変数とともに割り当てられることはありません。環境を初期化する必要のあるサービスには、初期化メソッドが用意されています。例11-1に、これらのハンドルの初期化を示します。
例11-1 OCIハンドルの初期化
{ OCIEnv *envhp; OCIError *errhp; (void) OCIInitialize(OCI_OBJECT, (dvoid *)0, 0, 0, 0); (void) OCIEnvInit(&envhp, OCI_OBJECT, (size_t)0, (dvoid **)0); (void) OCIHandleAlloc((dvoid *)envhp, (dvoid **)errhp, OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0); /* ... use the handles ... */ (void) OCIHandleFree((dvoid *)errhp, OCI_HTYPE_ERROR); }
11.2.4 エラーの処理
通常、エラーを戻すルーチンは、OCI_SUCCESS
またはOCI_ERROR
を戻します。OCI_SUCCESS_WITH_INFO
、OCI_INVALID_HANDLE
またはOCI_NO_DATA
を戻すルーチンもあります。OCI_ERROR
またはOCI_SUCCESS_WITH_INFO
が戻される場合は、例11-2で示すように、OCIErrorGet
をコールするとエラー・コード、エラー機能および可能な場合はエラー・メッセージを取得できます。
例11-2 OCIErrorGet()を使用したエラー情報の取得
{ OCIError *errhp; ub4 errcode; text buffer[512]; (void) OCIErrorGet((dvoid *)errhp, 1, (text *)NULL, &errcode, buffer, sizeof(buffer), OCI_HTYPE_ERROR); }
11.3 メモリー・サービス
メモリー・サービスにより、クライアントはメモリー・チャンクを割り当てたり解放できます。各メモリー・チャンクは期間に関連付けられています。これにより、クライアントは期間に関連付けられている全メモリーを(期間の終了時に)自動的に解放できます。期間により、メモリーの割当てに使用されるヒープが決定されます。メモリー・サービスでは、コール(OCI_DURATION_CALL
)、文(OCI_DURATION_STATEMENT
)およびセッション(OCI_DURATION_SESSION
)という3種類の期間が事前定義されます。
クライアントはユーザー期間を作成することもできます。クライアントは、ユーザー期間を明示的に開始および終了する必要があります。そのため、クライアントはユーザー期間の長さを制御できます。事前定義済の期間と同様に、ユーザー期間を使用して割当て期間を指定できます(たとえば、メモリー・チャンクはユーザー期間の終了時に解放されます)。
各ユーザー期間には親期間があります。親期間が終了すると、ユーザー期間が暗黙的に終了します。親期間として、コール期間、文期間、トランザクション期間、セッション期間または他のユーザー期間を使用できます。ユーザー期間中に割り当てられたメモリーは、親期間のヒープから取り込まれます。
Oracle RDBMSメモリー・マネージャは、様々なメモリー・モデルをサポートしています。現在、コールアウトはそのコールアウトの期間についてメモリーをサポートしています。外部索引付けをサポートするように行ソースが拡張されており、期間のメモリー所要量はコールアウトの場合よりも大きくなっています。
次の機能がサポートされています。
-
次の期間のメモリー(永続および非永続)の割当て。
-
エージェント・プロセスのコール
-
文
-
セッション
-
カートリッジの共有属性(メタデータ)
-
-
メモリー再割当て機能。
-
サブ期間メモリー(親ヒープが解放されると解放されるサブ・ヒープ)の作成機能。このサブ・ヒープのメモリーを割り当てて解放できます。
-
ゼロ指定メモリーの指定機能。
-
連続する大きいメモリーの割当て機能。
11.4 コンテキストの維持
コンテキスト管理により、クライアントは複数のコールにまたがって値を格納できます。カートリッジ・サービスは、コンテキストを保存およびリストアするためのメカニズムを提供します。
スレッドをサポートしているほとんどのオペレーティング・システムには、スレッド・コンテキストの概念があります。スレッドでは、このコンテキスト(または状態)にスレッド固有のデータを格納し、任意の時点で取り出すことができます。これにより、スレッド・グローバル変数の表記法が提供されます。通常は、構造のルートを指すポインタがコンテキストに格納されます。
行ソース・メカニズムが外部化される場合は、同じ行ソースへの複数のコール間で状態を維持するためのメカニズムが必要です。
セッション、文およびプロセスの状態を維持する必要があります。セッションの状態には、オープンしている複数の文、セッションのグローバリゼーション・サポート設定に基づくメッセージ・ファイルなどの情報が含まれます。プロセスの状態には、共有メタデータ(システム単位のメタデータなど)、メッセージ・ファイルなどが含まれます。カートリッジ・アプリケーションが実際にマルチ・スレッド化されているかどうかに応じて、情報をプロセス・レベルまたはシステム・レベルで共有できます。
ユーザーは必要に応じて複数のカートリッジを使用できるため、カートリッジごとに状態を維持する必要があります。そのために、ユーザーは期間ごとにキーを入力するように要求されます。
11.5 グローバリゼーション・サポート
多言語アプリケーションをサポートするために、カートリッジとコールアウトにはグローバリゼーション・サポート機能が必要です。NLSRTL
は現在RDBMSで使用されているマルチプラットフォーム多言語ライブラリであり、すべてのOracle製品に一貫性のあるグローバリゼーション・サポート動作を提供します。
グローバリゼーション・サポートの基本サービスは、言語および文化に依存する次の機能を提供します。
-
ロケール情報の検索
-
マルチバイトおよびワイド・キャラクタの書式による文字列の操作
-
Unicodeサポートを含むキャラクタ・セット変換
-
メッセージング・メカニズム
11.5.1 グローバリゼーション・サポートの言語情報検索
Oracleロケールは、言語、地域およびキャラクタ・セット定義で構成されています。ロケールにより、システム固有の曜日名、月名、日付書式、時刻書式、数値書式および通貨書式などの変換が決定されます。国際化されたアプリケーションは、ユーザーのロケール設定および文化的規則に従います。たとえば、ドイツ語ロケール設定では、ユーザーは曜日名と月名がドイツ語のスペルで表示されるものと想定します。次のインタフェースは、ローカル依存情報を取り出す最も単純な方法を提供します。
11.5.2 文字列操作
文字列操作の場合、マルチバイト文字列およびワイド・キャラクタ文字列という2種類のデータ構造がサポートされています。マルチバイト文字列にはシステム固有のOracleキャラクタ・セット・エンコーディングが使用され、それに対するファンクションは文字列全体を1単位として取ります。ワイド・キャラクタ文字列ファンクションは文字列操作よりも柔軟性が高く、キャラクタ・ベースと文字列ベースの操作をサポートします。
ここで使用するワイド・キャラクタ・データ型はOracle固有であり、ANSI/ISO C標準で定義されているwchar_t
と混同しないでください。Oracleワイド・キャラクタはすべてのプラットフォームで常に4バイトですが、wchar_t
は実装およびプラットフォームに依存します。Oracleワイド・キャラクタの考え方は、マルチバイト文字を処理が容易になるように固定幅に標準化するというものです。Oracleワイド・キャラクタとネイティブ・キャラクタ・セットとの間のラウンドトリップ変換が保証されます。
文字列操作は、次のカテゴリに分類できます。
-
マルチバイト・キャラクタとワイド・キャラクタとの間の文字列変換
-
文字の分類
-
大/小文字の変換
-
表示長の計算
-
比較、連結および検索などの一般的な文字列操作
11.6 パラメータ・マネージャ・インタフェース
パラメータ・マネージャは、ファイルまたは文字列からのパラメータを処理する一連のルーチンを提供します。各ルーチンは、入力を処理してキーと値のペアを取得するために提供されます。このキーと値のペアはメモリーに格納され、格納されたパラメータの値にアクセスできるルーチンが提供されます。
入力処理ルーチンは、ファイルの内容または文字列を既存の構文と照合し、入力に含まれるキー名をユーザーが登録した既知のキーのリストと比較します。入力処理ルーチンの動作は、フラグ引数に設定されるビットに応じて構成できます。
パラメータは一度に1つずつ取得するか、格納されているパラメータを反復処理するファンクションをコールして一度にすべてを取得できます。
11.6.1 特殊文字の入力処理およびサポート
パラメータはキーまたはパラメータ名、型および値で構成され、key
=
value
とう形式で指定する必要があります。
パラメータには、オプションで値リストをカッコで囲んで次のように指定できます。key
= (
value1
, ...,
valuen
)またはkey
=
value1
, ...,
valuen
値は文字列、整数、OCINumber
またはブールです。y
またはt
で始まるブール値はTRUE
に対応し、n
またはf
で始まるブール値はFALSE
に対応します。ブール値の照合では大/小文字は区別されません。
パラメータ・マネージャには、特定の文字がリテラルに解析されない特殊文字として表示されます。表11-1に、特殊文字と意味を示します。
表11-1 特殊文字
文字 | 説明 |
---|---|
|
コメント(ファイルのみ) |
|
値リストの開始 |
|
値リストの終了 |
|
引用符で囲む文字列の開始または終了 |
|
引用符で囲む文字列の開始または終了 |
|
キーワードと値のセパレータ |
|
エスケープ文字 |
特殊文字をリテラルに処理する必要がある場合は、エスケープ文字で始めるか、文字列全体を一重引用符または二重引用符で囲む必要があります。
キー文字列に使用できるのは英数字のみです。値には任意の文字を使用できます。ただし、特殊文字を使用するには、引用符で囲むかエスケープ文字を付ける必要があります。
11.6.2 パラメータ・マネージャの動作フラグ
ファイルまたは文字列を処理するルーチンは、パラメータ・マネージャのデフォルト特性を変更する動作フラグを使用します。フラグには、次のビットを設定できます。
-
OCI_EXTRACT_CASE_SENSITIVE
すべての比較で大/小文字が区別されます。デフォルトでは、大/小文字を区別しない比較が使用されます。 -
OCI_EXTRACT_UNIQUE_ABBREVS
一意の省略形をキーとして使用できます。デフォルトでは一意の省略形を使用できません。 -
OCI_EXTRACT_APPEND_VALUES
特定のキーに対して1つ以上の値が格納されている場合に、このキーに対する新しい値が追加されます。デフォルトではエラーが返されます。
11.6.3 キーの登録
入力処理ルーチン(OCIExtractFromFile()
またはOCIExtractFromString()
)を起動する前に、OCIExtractSetNumKeys()
に続けてOCIExtractSetKey()
をコールして次の情報を指定し、すべてのキーを登録する必要があります。
-
キー名。
-
キーの型(
integer
、string
、boolean
、OCINumber
)。 -
複数の値が許可される場合は、フラグ値に
OCI_EXTRACT_MULTIPLE
が設定されます(デフォルト: 許可される値は1つのみ)。 -
キーに使用するデフォルト値(
NULL
可)。 -
開始値から終了値の範囲で指定した整数値の許容範囲(
NULL
可)。 -
許容可能な文字列値のリスト(
NULL
可)。
11.6.4 パラメータの格納と取出し
キーと値のペアへの入力を処理した結果が格納されます。パラメータの妥当性は、メモリーへの格納前にチェックされます。値がチェックされて、適切な型かどうかが確認されます。また、必要な場合は、値をチェックして整数値の一定範囲に含まれるか、列挙した文字列値のリストのメンバーであるかを確認できます。キーに複数の値が許可されるように指定していない場合は、キーが特定の入力ソースで2回以上指定されているとエラーが戻されます。キーが不明な場合にもエラーが戻されます。処理の完了後に、文字列、整数、OCINumber
またはブール値を取り出す特定のルーチンを使用して、キー値を取り出すことができます。
すべてのパラメータを同時に取得することもできます。メモリーに格納されたパラメータ構造体から作成されるパラメータのリストを生成するために、まずファンクションOCIExtractToList()
をコールする必要があります。OCIExtractToList()
は、メモリーに格納された一意のキーの数を返します。その後、OCIExtractFromList()
をコールすることで、各キーに関連付けられた値のリストを返すことができます。
11.7 ファイルI/O
OCIファイルI/Oパッケージは、複数のプラットフォームにまたがってファイルI/Oの一貫したビューを提供することで、ファイル・システムと相互作用する移植可能コードを容易に記述できるように設計されています。
このパッケージをデータ・カートリッジ環境で使用する際には、2つの問題に注意する必要があります。第1の問題は、ファイルを書込み用にオープンするときや、ファイルおよびディレクトリに対するオペレーティング・システム保護で提供されるセキュリティ以外のディレクトリに新規ファイルを作成するときには、このパッケージはセキュリティを提供しないことです。第2の問題は、このパッケージは、マルチスレッド化されたサーバー環境では複数のコールにまたがるファイル・ディスクリプタの使用をサポートしないことです。