XLAで使用されるCデータ構造体
この項では、この章で説明されているXLA関数で使用されるCデータ構造体について説明します。
これらの構造体は、次のファイルで定義されています。
installation_dir
/include/tt_xla.h
XLAアプリケーションの作成時に、このファイルをインクルードする必要があります。
表9-1 Cデータ構造体の概要
Cデータ構造体 | 説明 |
---|---|
レコード・タイプについて記述します。XLAによって返されるレコードの先頭で使用されます。 |
|
更新レコードについて記述します。 |
|
|
|
|
|
|
|
|
|
ブックマークで使用されるログ・レコード識別子について記述します。この構造体は、 |
|
XLAブックマークで使用されるログ・レコード識別子について記述します。 |
ttXlaNodeHdr_t
ほとんどCデータ構造体は、データのレコード・タイプおよび長さについて記述する標準ヘッダーで始まります。標準ヘッダーの型はttXlaNodeHdr_t
です。
このヘッダーには、次のフィールドがあります。
フィールド | 型 | 説明 |
---|---|---|
|
|
レコードのタイプ。
|
|
|
レコードのバイト順序。
|
|
|
すべての添付ファイルを含むレコードの全長 |
ttXlaUpdateDesc_t
この構造体は、データベース内の単一行(またはタプル)への更新処理について記述します。
ttXlaNextUpdate
またはttXlaNextUpdateWait
関数によって返される各更新レコードは、固定長ヘッダーttXlaUpdateDesc_t
で始まり、その後に0(ゼロ)から2行のデータベースからの行が続きます。行データはttXlaUpdateDesc_t
ヘッダーにレポートされたレコード・タイプによって異なります。
-
COMMITONLY
レコードに行はありません。 -
INSERTTUP
またはDELETETUP
には1つの行があります。 -
UPDATETUP
レコードには2つの行があり、更新前および更新後の行データがレポートされます。 -
CREATAB
、DROPTAB
、CREAIND
、DROPIND
、CREATVIEW
、DROPVIEW
、CREATSEQ
、DROPSEQ
、CREATSYN
、DROPSYN
、ADDCOLS
およびDRPCOLS
レコードには特別な書式の行があります(「特別な更新データの書式」を参照)。
flags
フィールドは、レコード更新の特別なオプションのビットマップです。
connID
フィールドにより、更新を開始したODBC接続ハンドルを特定します。この値を使用すると、更新が同一の接続から行われたかどうかを確認できます。
個別のコミットXLAレコードは、ttApplicationContext
プロシージャをコールした後にXLAレコードを生成する処理が行われない場合に生成されます。ttApplicationContext
プロシージャの説明は、「アプリケーション・コンテキストの受渡し」を参照してください。
ノート
XLAは、次の通知を受信できません。
-
非マテリアライズド・ビューの
CREATE VIEW
またはDROP VIEW
-
一時表の
CREATE GLOBAL TEMPORARY TABLE
またはDROP TABLE
ALTER TABLE
処理で生成可能なXLAレコードは、次のタイプのみです。
-
ADDCOLS
またはDRPCOLS
(列を追加または削除する場合) -
CREAIND
またはDROPIND
(列の一意の属性を変更する場合)
順序の作成(CREATESEQ
)と削除(DROPSEQ
)はXLAで参照できますが、順序の増分は参照できません。
カスケード削除およびエージングによるすべての削除はXLAで参照できます。削除がカスケードによるものかエージングによるものかは、flags
の値(次の表を参照)で示されます。
ttXlaUpdateDesc_t
によって定義される更新ヘッダーのフィールドは、次のとおりです。
ノート:
tt_LSN_t
の、具体的にはlogFile
およびlogOffset
フィールドの使用方法が以前のリリースとは異なり、これらのフィールドが、連続的に増加するLSNではなく、ログ・レコード識別子を参照する点に注意してください。tt_LSN_tのノートを参照してください。
特別な更新データの書式
ttXlaTblDesc_t
ヘッダーの後には、更新レコードに含まれているデータが続きます。
この項では、特定のSQL処理に関連した特別な更新レコードのデータ書式について説明します。「ttXlaTblDesc_t」を参照してください。
CREATE TABLE
CREATE TABLE
処理の場合、特別な行の値は、新しい表について記述するttXlaTblDesc_t
レコードおよびその後に続く、各列について記述するttXlaColDesc_t
レコードで構成されています。
「ttXlaColDesc_t」を参照してください。
ALTER TABLE
ALTER TABLE
処理の場合、特別な行の値は、ttXlaDropTableTup_t
またはttXlaAddColumnTup_t
値およびその後に続く、列について記述するttXlaColDesc_t
レコードで構成されます。
ttXlaDropTableTup_t
DROP TABLE
処理の場合、行の値は次のようになります。
フィールド | 型 | 説明 |
---|---|---|
|
|
削除される表の名前 |
|
|
削除される表の所有者 |
ttXlaTruncateTableTup_t
TRUNCATE TABLE
処理の場合、行の値は次のようになります。
フィールド | 型 | 説明 |
---|---|---|
|
|
切り捨てられる表の名前。 |
|
|
切り捨てられる表の所有者 |
ttXlaCreateIndexTup_t
CREATE INDEX
処理の場合、行の値は次のようになります。
フィールド | 型 | 説明 |
---|---|---|
|
|
索引が定義されている表の名前。 |
|
|
索引が定義される表の所有者 |
|
|
新しい索引の名前 |
|
|
索引フラグ:
|
|
|
索引付けされる列の数 |
|
|
システム番号を使用して索引付けされる列番号 |
|
|
ユーザー定義の列IDを使用して索引付けされる列番号 |
|
|
索引のタイプ:
|
|
|
索引の一意性:
|
|
|
ハッシュ索引のページ数 |
ttXlaDropIndexTup_t
DROP INDEX
処理の場合、行の値は次のようになります。
フィールド | 型 | 説明 |
---|---|---|
|
|
索引が削除された表の名前 |
|
|
索引が削除された表の所有者 |
|
|
削除された索引の名前 |
ttXlaAddColumnTup_t
ADD COLUMN
処理の場合、行の値は次のようになります。
フィールド | 型 | 説明 |
---|---|---|
|
|
追加列の数 |
この特別な行の後に、新しい列について記述するttXlaColDesc_t
レコードが続きます。
ttXlaDropColumnTup_t
DROP COLUMN
処理の場合、行の値は次のようになります。
フィールド | 型 | 説明 |
---|---|---|
|
|
削除された列の数 |
この特別な行の後に、削除された列について記述するttXlaColDesc_t
レコードの配列が続きます。
ttXlaCreateSeqTup_t
CREATE SEQUENCE
処理の場合、行の値は次のようになります。
フィールド | 型 | 説明 |
---|---|---|
|
|
順序の名前 |
|
|
順序の所有者 |
|
|
サイクル・フラグ 順序番号ジェネレータが、最大値または最小値に達した後も番号の生成を続行するかどうかを指定します。
|
|
|
順序の最小値 |
|
|
順序の最大値 |
|
|
順序番号間の増分 正の値は昇順、負の値は降順を示します。降順の場合、値の範囲は |
ttXlaDropSeqTup_t
DROP SEQUENCE
処理の場合、行の値は次のようになります。
フィールド | 型 | 説明 |
---|---|---|
|
|
順序の名前 |
|
|
順序の所有者 |
ttXlaViewDesc_t
CREATE VIEW
処理の場合、行の値は次のようになります。
ノート:
これは、マテリアライズド・ビューおよび非マテリアライズド・ビューのどちらにも適用されます。
フィールド | 型 | 説明 |
---|---|---|
|
|
ビューの名前 |
|
|
ビューの所有者 |
|
|
|
ttXlaDropViewTup_t
DROP VIEW
処理の場合、行の値は次のようになります。
ノート:
これは、マテリアライズド・ビューおよび非マテリアライズド・ビューのどちらにも適用されます。
フィールド | 型 | 説明 |
---|---|---|
|
|
ビューの名前 |
|
|
ビューの所有者 |
ttXlaCreateSynTup_t
CREATE SYNONYM
処理の場合、行の値は次のようになります。
フィールド | 型 | 説明 |
---|---|---|
|
|
シノニムの名前 |
|
|
シノニムの所有者 |
|
|
シノニムが指すオブジェクトの名前 |
|
|
シノニムが指すオブジェクトの所有者 |
|
|
シノニムがパブリックかどうかを示します。
|
|
|
シノニムが
|
ttXlaDropSynTup_t
DROP SYNONYM
処理の場合、行の値は次のようになります。
フィールド | 型 | 説明 |
---|---|---|
|
|
シノニムの名前 |
|
|
シノニムの所有者 |
|
|
シノニムがパブリックかどうかを示します。
|
ttXlaSetTableTup_t
SET TABLE ID
処理の場合、更新レコードの主要部分で以前に割り当てられたアプリケーション表識別子を使用し、アプリケーション表識別子の新しい値を次の特別な行に指定するように記述されます。
フィールド | 型 | 説明 |
---|---|---|
|
|
新しいユーザー定義の表ID |
ttXlaSetColumnTup_t
SET COLUMN ID
処理の場合、次の特別な行が記述されます。
フィールド | 型 | 説明 |
---|---|---|
|
|
以前のユーザー定義の列ID値 |
|
|
新しいユーザー定義の列ID値 |
|
|
システム列ID |
ttXlaUpdateDesc_tヘッダーの後に続く行データのアドレス検出
更新ヘッダーの直後に行データが続きます。行データは、ttXlaGetColumnInfoによって返される
ttXlaColDesc_t
構造体に指定されているオフセットとともに内部形式で格納されます。
更新レコードの取得、およびttXlaUpdateDesc_t
ヘッダーの内容確認の詳細は、「トランザクション・ログからの更新レコードの取得」および「レコード・ヘッダーの確認および行アドレスの検出」を参照してください。次に、これらの手順の概要を示します。
「ttXlaGetColumnInfo」
を参照してください。
更新ヘッダーのサイズにそのアドレスを追加して、行データのアドレスを検出することができます。
例:
char* Row = (char*)&ttXlaUpdateDesc_t + sizeof(ttXlaUpdateDesc_t);
UPDATETUP
レコードの場合、ttXlaUpdateDesc_t
ヘッダーの後に2行のデータが続きます。1つ目の行には更新前のデータ、2つ目の行には更新後のデータが含まれています。
新しい行は古い行の直後に続くため、古い行の長さ(tuple1
)にそのアドレスを追加して、新しい行のアドレスを計算することができます。
例:
char* oldRow = (char*)&ttXlaUpdateDesc_t + sizeof(ttXlaUpdateDesc_t); char* newRow = oldRow + ttXlaUpdateDesc_t.tuple1;
返された行の列データにアクセスする方法の詳細は、「ttXlaColDesc_t」を参照してください。
ttXlaVersion_t
XLAを将来拡張できるように、バージョン構造体ttXlaVersion_t
に、現在のXLAのバージョンおよび構造体のバイト順序が記述されています。
この構造体はttXlaGetVersion
関数によって返されます。
この構造体には、次のフィールドがあります。
フィールド | 型 | 説明 |
---|---|---|
|
標準データ・ヘッダー |
|
|
|
ハードウェア・プラットフォームの名前 |
|
|
システム固有のワード・サイズ(32または64ビット) |
|
|
TimesTenメジャー・バージョン |
|
|
TimesTenマイナー・バージョン |
|
|
TimesTenポイント・リリース番号 |
|
|
オペレーティング・システムの名前 |
|
|
オペレーティング・システムのバージョン番号 |
|
|
オペレーティング・システムのリリース番号 |
ttXlaTblDesc_t
表情報は、ttXlaTblDesc_t
構造体を使用して表現されます。
この構造体は、ttXlaGetTableInfo
関数によって返されます。
この構造体には、次のフィールドがあります。
フィールド | 型 | 説明 |
---|---|---|
|
標準データ・ヘッダー |
|
|
|
表の名前(空文字で終了) |
|
|
表の所有者(空文字で終了) |
|
|
一意のシステム定義表識別子 |
|
|
ユーザー定義の表の識別子 |
|
|
列の数 |
|
|
インライン行のサイズ |
|
|
プライマリ列の数 |
|
|
システム主キー列番号 |
|
|
ユーザー定義主キー列番号 |
インライン行のサイズには、すべての固定長列、NULL列フラグ、および可変長列のポインタ情報のためのスペースが含まれています。可変長列ごとに、4バイトのインライン行領域が使用されます。
表に宣言済の主キーがある場合は、次の点に注意してください。
-
nPrimCols
は0(ゼロ)より大きい値となります。 -
primColsSys
配列には、最初にCREATE TABLE
文で宣言した順序と同じ順序で、主キーの列番号が含まれます。 -
primColsUser
配列には、対応する、アプリケーションで指定された列識別子が含まれます。
ttXlaTblVerDesc_t
このデータ構造体には、表のバージョン番号とttXlaTblDesc_t
が含まれています。
この構造体はttXlaVersionTableInfo
によって返されます。この構造体には、次のフィールドがあります。
フィールド | 型 | 説明 |
---|---|---|
|
表記述 |
|
|
|
システム生成表のバージョン番号 |
ttXlaColDesc_t
列情報は、ttXlaGetColumnInfo
関数によって返される、この構造体を使用して提供されます。
この構造体には、次のフィールドがあります。
フィールド | 型 | 説明 |
---|---|---|
|
標準データ・ヘッダー |
|
|
|
列の名前 |
|
|
4バイト境界まで埋込み |
|
|
表の作成時またはその後の変更時に決定された列の序数
|
|
|
列の序数(オプションでユーザーが指定した場合) これは、0(ゼロ)または |
|
|
「XLAデータ型」を参照してください。 |
|
|
列の最大または基本サイズ |
|
|
列の固定長部分に対するオフセット |
|
|
NULLバイトに対するオフセット、またはNULL値可能でない場合は0(ゼロ) |
|
|
DECIMAL型の数値の精度 |
|
|
DECIMAL型の数値のスケール |
|
|
列フラグ:
|
ttXlaColDesc_t
構造体を取得する手順およびその内容を確認する手順は、「列データの確認」を参照してください。次に、これらの手順の概要を示します。
ttXlaColDesc_t
構造体は、ttXlaGetColumnInfo
関数によって返されます。この構造体には、特定の表の列情報にアクセスするために必要なメタデータが格納されています。たとえば、offset
フィールドを使用すると、ttXlaColDesc_t
構造体の後の更新レコードに返された行(一行または複数行)内の特定の列データをみつけることができます。返された行のアドレスにoffset
を追加することで、列値のアドレスがわかります。その後、dataType
フィールドに基づいてこの値を対応するCデータ型にキャストすることや、「複合データ型の変換」で説明されている変換ルーチンの1つに渡すことができます
TimesTenの行データは、固定長データおよびその後に続く可変長データで構成されます。
-
固定長列データの場合、
ttXlaColDesc_t
は列データのoffset
およびsize
を返します。offset
は、レコードの固定部分の先頭からの相対位置です。次の例を参照してください。 -
可変長列データ(
VARCHAR2
、NVARCHAR2
およびVARBINARY
)の場合、offset
は、4バイトのオフセット値を指すアドレスです。オフセット・アドレスをオフセット値に追加すると、行の可変長部分の列データのアドレスを取得できます。この位置にある最初の8バイトはデータの長さで、その後に実際のデータが続きます。可変長データの場合、返されるsize値は列の許容最大サイズです。次の例を参照してください。
NULL値が含まれる可能性がある列の場合、nullOffset
はレコード内のNULLバイトを指します。この値は、列がNULLの場合は1、NULLでない場合は0(ゼロ)になります。「NULL値の検出」を参照してください。
flags
のビットにより、列がNULL値可能であるか、主キーの一部であるか、表外に格納されているかを定義します。
sysColNum
値は、列に割り当てるシステム列番号です。この値は、最初の列に対しては1から始まります。
ノート:
XLAでのLOBのサポートは、次のように制限されています。
-
LOB列を含む表にサブスクライブできますが、LOB値自体についての情報は使用できません。
-
ttXlaGetColumnInfo
では、LOB列に関する情報が返されます。 -
LOBを含む列は、空(長さがゼロ)またはNULL(実際に値が
NULL
の場合)としてレポートされます。このようにして、NULL列と非NULL列を区別できます。
固定長列データの場合、列のアドレスは、次のように、ttXlaColDesc_t
構造体のoffset
値に行のアドレスを追加したものです。
ttXlaColDesc_t colDesc; void* pColVal = colDesc->offset + row;
列の値は、データ型に対応する型ポインタを使用してこのポインタを参照解除すると取得できます。たとえば、SQL_INTEGER
の場合、ODBC型はSQLINTEGER
であるため、列の値は次のように入力すると取得できます。
*((SQLINTEGER*) pColVal))
可変長列データの場合、前述の手順で計算されたpColVal
は、4バイトのオフセット値のアドレスになります。このオフセット値をpColVal
のアドレスに追加すると、可変長列データの先頭へのポインタとなります。この位置にある最初の8バイトはこのデータ(var_len
)の長さで、その後に実際のデータ(var_data
)が続きます。
この例では、VARCHAR
文字列をコピーおよび出力します。
tt_ptrint* var_len = (tt_ptrint*)((char*)pColVal + *((int*)pColVal)); char* var_data = (char*)(var_len+1); char* buffer = malloc(*var_len+1); memcpy(buffer,var_data,*var_len); buffer[*var_len] = (char)NULL; /* NULL terminate the string */ printf("%s\n",buffer); free(buffer);
tt_LSN_t
ブックマークで使用されるログ・レコード識別子の記述です。
この構造体は、ttXlaUpdateDesc_t
構造体によって使用されます。
フィールド | 型 | 説明 |
---|---|---|
|
|
ログ・レコード識別子の上位部分 |
|
|
ログ・レコード識別子の下位部分 |
ノート:
logFile
およびlogOffset
のフィールド名は、下位互換性を保つために保持されていますが、使用方法は変更されています。以前のリリースでは、値は連続的に増加するLSNを参照しており、この値は具体的な意味を持ち、ログ・ファイル番号とバイト・オフセットを表していました。現在ではログ・レコード識別子を参照していて、この識別子は、より抽象的で、ログ・ファイル番号やバイト・オフセットとは直接関係しません。ログ・レコード識別子の順序に関して想定できることは、ログ・レコード識別子Aよりも後に読み取られたログ・レコード識別子Bは、より大きい値を持つということのみです。
tt_XlaLsn_t
ブックマークで使用されるログ・レコード識別子の記述です。
この構造体はttXlaGetLSN
関数によって返され、ttXlaSetLSN
関数によって使用されます。
checksum
は、XLAハンドル固有であり、すべてのログ・レコード識別子が既知のXLA接続に関連することを保証します。
フィールド | 型 | 説明 |
---|---|---|
|
|
有効なログ・レコード識別子ハンドルであることを保証するためのチェックサム |
|
|
トランザクションID |
|
|
ログ・レコード識別子の上位部分 |
|
|
ログ・レコード識別子の下位部分 |
ノート:
logFile
およびlogOffset
のフィールド名は、下位互換性を保つために保持されていますが、使用方法は変更されています。以前のリリースでは、値は連続的に増加するLSNを参照しており、この値は具体的な意味を持ち、ログ・ファイル番号とバイト・オフセットを表していました。現在ではログ・レコード識別子を参照していて、この識別子は、より抽象的で、ログ・ファイル番号やバイト・オフセットとは直接関係しません。ログ・レコード識別子の順序に関して想定できることは、ログ・レコード識別子Aよりも後に読み取られたログ・レコード識別子Bは、より大きい値を持つということのみです。