CLFS ストリームからのデータ レコードの読み取り
共通ログ・ファイル・システム (CLFS) ストリームには、データ・レコードと再始動レコードの 2 種類のレコードがあります。 このトピックでは、ストリームから一連のデータ レコードを読み取る方法を説明します。 再始動レコードの読み取り方法については、「CLFS ストリームからの再始動レコードの読み取り」を参照してください。
ストリームから一連のデータ レコードを読み取る方法には、いくつかのバリエーションがあります。 たとえば、指定したレコードからストリーム内を前方に読み取る方法や、リンクされたレコードのチェーンに沿って後方に読み取る方法があります。
一連のデータ レコードの読み取りに関するすべてのバリエーションを知りたい場合は、次の手順を実行してください。
ClfsReadLogRecord を呼び出して、読み取りコンテキストとシーケンス内の最初のデータ レコードを取得します。
手順 1 で取得した読み取りコンテキストを ClfsReadNextLogRecord に繰り返し渡して、シーケンス内の残りのデータ レコードを取得します。
注意 読み取りコンテキストはスレッド セーフではありません。 読み取りコンテキストへのアクセスをシリアル化する役割は、クライアントが担います。
次のサブトピックでは、さまざまな種類のレコード シーケンスとチェーンの読み取りの詳細について説明します。
指定されたデータ レコードからの前方読み取り
CLSF ストリームで(任意のデータ レコードから始める) 前方読み取りを行うには、モードを ClfsContextForward に設定した読み取りコンテキストを作成する必要があります。 読み取りコンテキストを作成し、(読み取り用に選択したセット内の) 最初のレコードを読み取るには、次の表に示す ClfsReadLogRecord を呼び出します。
パラメーター名 | 値 |
---|---|
pvMarshalContext |
マーシャリング領域へのポインターを指定します。 |
plsnFirst |
読み取る最初のレコードの LSN を指定します。 これは、再始動レコードではなく、データ レコードの LSN とします。 |
peContextMode |
値 ClfsContextForward を指定します。 |
ppvReadBuffer |
レコード データを受け取ります。 |
pcbReadBuffer |
レコード データのサイズを受け取ります。 |
peRecordType |
レコードの種類を受け取ります。 この値は、レコードのさまざまな機能を示すフラグのセットです。 レコードはデータ レコードなので、受け取る値には ClfsDataRecord フラグが設定され、ClfsRestartRecord フラグがクリアされている必要があります。 |
plsnUndoNext |
データ レコードの元に戻す次の LSN を受け取ります。 チェーンの読み取り続行にこの値は必要ないので、無視できます。 |
plsnPrevious |
データ レコードの前の LSN を受け取ります。 チェーンの読み取り続行にこの値は必要ないので、無視できます。 |
ppvReadContext |
不透明な読み取りコンテキストへのポインターを受け取ります。 読み取りコンテキストを使用して、後続のレコードを読み取ります。 |
読み取りコンテキストと最初のレコードを取得すると、ClfsReadNextLogRecord を繰り返し呼び出せば、ストリーム内の後続のレコードを取得できます。 ストリームにこれ以上データ レコードがない場合、ClfsReadNextLogRecord で STATUS_END_OF_FILE が返ります。 以下の表に、パラメーターの設定方法と解釈方法を示します。
パラメーター名 | 値 |
---|---|
pvReadContext |
ClfsReadLogRecord から受け取った読み取りコンテキストへのポインターを指定します。 |
ppvBuffer |
レコード データを受け取ります。 |
pcbBuffer |
レコード データのサイズを受け取ります。 |
peRecordType |
ClfsDataRecord の値を指定します。 |
plsnUndoNext |
データ レコードの元に戻す次の LSN フィールドを受け取ります。 チェーンの読み取り続行にこの値は必要ないので、無視できます。 |
plsnPrevious |
データ レコードの前の LSN フィールドを受け取ります。 チェーンの読み取り続行にこの値は必要ないので、無視できます。 |
plsnRecord |
読み取ったデータ レコードの LSN を受け取ります。 |
前の LSN でリンクされたデータ レコードのチェーンの読み取り
CLFS ストリームにデータ レコードを書き込むとき、データ レコードの前の LSN を、ストリームに以前に書き込んだ任意のレコードの LSN に設定できます。 前の LSN を設定すると、後で逆の順序でトラバースできる関連レコードのチェーンを作成できます。 たとえば、データベース トランザクションを実行していて、トランザクションによって行われた更新を記述するために複数の CLFS ログ レコードを書き込む必要があるとします。 トランザクションの更新を記述するログ レコードを書き込むたびに、レコードの前の LSN を、同じトランザクションによって行われた更新を記述する前のログ レコードの LSN に設定できます。
たとえば、以前の LSN によってリンクされているデータ レコードのチェーンを作成したとします。 レコードのチェーンを読み取るには、モードが ClfsContextPrevious に設定されている読み取りコンテキストを作成する必要があります。 読み取りコンテキストを作成し、チェーンの最初のレコードを読み取るには、次の表に示すように ClfsReadLogRecord を呼び出します。
パラメーター名 | 値 |
---|---|
pvMarshalContext |
マーシャリング領域へのポインターを指定します。 |
plsnFirst |
チェーンの最初のレコードの LSN を指定します。 これは、再始動レコードではなく、データ レコードの LSN とします。 |
peContextMode |
ClfsContextPrevious の値を指定します。 |
ppvReadBuffer |
レコード データを受け取ります。 |
pcbReadBuffer |
レコード データのサイズを受け取ります。 |
peRecordType |
レコードの種類を受け取ります。 この値は、レコードのさまざまな機能を示すフラグのセットです。 レコードはデータ レコードなので、受け取る値には ClfsDataRecord フラグが設定され、ClfsRestartRecord フラグがクリアされている必要があります。 |
plsnUndoNext |
データ レコードの元に戻す次の LSN を受け取ります。 チェーンの読み取り続行にこの値は必要ないので、無視できます。 |
plsnPrevious |
データ レコードの前の LSN を受け取ります。 チェーンの読み取り続行にこの値は必要ないので、無視できます。 |
ppvReadContext |
不透明な読み取りコンテキストへのポインターを受け取ります。 読み取りコンテキストを使用して、チェーン内の前のレコードを読み取ります。 |
読み取りコンテキストと最初のレコードを取得したら、ClfsReadNextLogRecord を繰り返し呼び出すと、チェーン内の残りのレコードを読み取ることができます。 以下の表に、パラメーターの設定方法と解釈方法を示します。
パラメーター名 | 値 |
---|---|
pvReadContext |
ClfsReadLogRecord から受け取った読み取りコンテキストへのポインターを指定します。 |
ppvBuffer |
レコード データを受け取ります。 |
pcbBuffer |
レコード データのサイズを受け取ります。 |
peRecordType |
ClfsDataRecord の値を指定します。 |
plsnUndoNext |
データ レコードの元に戻す次の LSN を受け取ります。 チェーンの読み取り続行にこの値は必要ないので、無視できます。 |
plsnPrevious |
データ レコードの前の LSN を受け取ります。 チェーンの読み取り続行にこの値は必要ないので、無視できます。 |
plsnRecord |
読み取ったデータ レコードの LSN を受け取ります。 |
ClfsReadNextLogRecord を繰り返し呼び出すと、呼び出しシーケンスは次のいずれかの方法で終了します。
最終的には、前回の LSN が CLFS_LSN_INVALID に設定されているデータ レコードが読み取られます。 次回に ClfsReadNextLogRecord を呼び出すと、STATUS_END_OF_FILE が返ります。
最終的には、そのストリームのベース LSN と ストリームのアーカイブ 末尾 の両方より小さい以前の LSN をあるデータ レコードを読み取ります。 次回に ClfsReadNextLogRecord を呼び出すと、STATUS_LOG_START_OF_LOG が返ります。
元に戻す次の LSN によってリンクされたデータ レコードのチェーンの読み取り
CLFS ストリームにデータ レコードを書き込むとき、データ レコードの元に戻す次の LSN を、ストリームに以前に書き込んだ任意のレコードの LSN に設定できます。 元に戻す次の LSN を設定すると、後で逆の順序でトラバースできる関連レコードのチェーンを作成できます。 元に戻す次のチェーンの作成と解釈の詳細については、「CLFS ログ シーケンス番号」を参照してください。
たとえば、元に戻す次の LSN によってリンクされているデータ レコードのチェーンを作成したとします。 レコードのチェーンを読み取るためには、ClfsReadLogRecord を呼び出して、そのモードが ClfsContextUndoNext に設定されている読み取りコンテキストを作成する必要があります。 その後のプロセスは、前の LSN によってリンクされたチェーンの読み取りと同じです (このトピックで前述)。
ユーザー LSN でリンクされたデータ レコードのチェーンの読み取り
以前の LSN によってリンクされたチェーンと元に戻す次の LSN に加えて、自分のレコード データに埋め込んだ自身の LSN によってリンクされたチェーンも作成できます。
たとえば、レコード データ自体に保存されている LSN によってリンクされているデータ レコードのチェーンを作成したとします。 レコードのチェーンを読み取るためには、モードが ClfsContextPrevious または ClfsContextUndoNext に設定された読み取りコンテキストを作成する必要があります。 自分の読み取りコンテキストを作成し、ClfsReadLogRecord を呼び出して、チェーン内で前回書き込まれたレコードを取得します。 次に、ClfsReadNextLogRecord を繰り返し呼び出して、チェーン内の以前のレコードを取得します。 ClfsReadNextLogRecord を呼び出すたびに、plsnUser パラメーターをチェーン内の前のレコードの LSN に設定します。 plsnUser で指定した LSN は、現在のレコードの以前の LSN フィールドや、元に戻す次の LSN フィールドに保存されている値をオーバーライドします。
ストリーム内で後方に移動できるのは、ClfsReadNextLogRecord を呼び出してレコード チェーンを読み取るときのみなので注意してください。 plsnUser で指定する LSN は、チェーンの現在のレコードの LSN より小さいこととします。