ReadLogRecord 関数 (clfsw32.h)

指定したログ シーケンス番号 (LSN) から 3 つのモードのいずれかで一連の読み取りを開始し、指定したログ レコードの先頭と読み取りコンテキストを返します。 クライアントは、 ReadNextLogRecord に読み取りコンテキストを渡すことによって、指定されたモードで後続のレコードを読み取ることができます。

構文

CLFSUSER_API BOOL ReadLogRecord(
  [in]                PVOID             pvMarshal,
  [in]                PCLFS_LSN         plsnFirst,
  [in]                CLFS_CONTEXT_MODE eContextMode,
  [out]               PVOID             *ppvReadBuffer,
  [out]               PULONG            pcbReadBuffer,
  [out]               PCLFS_RECORD_TYPE peRecordType,
  [out]               PCLFS_LSN         plsnUndoNext,
  [out]               PCLFS_LSN         plsnPrevious,
  [out]               PVOID             *ppvReadContext,
  [in, out, optional] LPOVERLAPPED      pOverlapped
);

パラメーター

[in] pvMarshal

CreateLogMarshallingArea 関数を使用して割り当てられるマーシャリング コンテキストへのポインター。

[in] plsnFirst

読み取 操作を開始するレコードのログ シーケンス番号 (LSN) を指定するCLFS_LSN構造体へのポインター。

この値は、ログのアクティブな範囲内の有効なレコードの LSN である必要があります。

[in] eContextMode

*ppvReadContext で返される読み取りコンテキストのモード。

次の表は、相互に排他的な 3 つの読み取りモードを示しています。

意味
ClfsContextPrevious
plsnPrevious によってリンクされているレコードを読み取ります。
ClfsContextUndoNext
plsnUndoNext によってリンクされているレコード チェーンを読み取ります。
ClfsContextForward
読み取りコンテキストで現在の LSN の直後にある LSN を使用してレコードを読み取ります。

[out] ppvReadBuffer

ログ I/O ブロック内のターゲット レコードへのポインターを受け取る変数へのポインター。

[out] pcbReadBuffer

*ppvReadBuffer で返されるデータのサイズをバイト単位で受け取る変数へのポインター。

[out] peRecordType

読み取られたレコードの種類を受け取る変数へのポインター。

このパラメーターは、 CLFS_RECORD_TYPE定数のいずれかです

[out] plsnUndoNext

元に戻すレコード チェーン 内の次 のレコードの LSN を受け取るCLFS_LSN構造体へのポインター。

[out] plsnPrevious

のレコード チェーン内の次のレコードの LSN を受け取るCLFS_LSN構造体へのポインター。

[out] ppvReadContext

読み取りが成功したときにシステム割り当て読み取りコンテキストへのポインターを受け取る変数へのポインター。

関数は、操作の完了を延期すると、有効な読み取りコンテキスト ポインターと エラー状態ERROR_IO_PENDINGを返します。 その他のすべてのエラーでは、読み取りコンテキスト ポインターは NULL です。 関数の遅延完了の処理の詳細については、このトピックの「解説」セクションを参照してください。

要求されたすべてのログ レコードを取得した後、クライアントは読み取りコンテキストを TerminateReadLog に渡して、関連付けられているメモリを解放する必要があります。 これを行わないと、メモリリークが発生します。

メモ 共通ログ ファイル システム (CLFS) の読み取りコンテキストはスレッド セーフではありません。 一度に複数のスレッドで使用したり、一度に複数の非同期読み取りに渡したりしないでください。
 

[in, out, optional] pOverlapped

非同期操作に必要な OVERLAPPED 構造体へのポインター。

非同期操作を使用しない場合、このパラメーターは NULL にすることができます。

戻り値

関数が成功すると、戻り値は 0 以外になります。

関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。

次の一覧は、考えられるエラー コードを示しています。

注釈

CreateLogMarshallingArea で指定されたログ ブロック サイズが、完全なログ ブロックを保持するのに十分な大きさでない場合は、エラー メッセージ ERROR_LOG_BLOCK_INCOMPLETEが返されます。

有効な pOverlapped 構造体を使用して ReadLogRecord が呼び出され、重複するオプションを使用してログ ハンドルが作成された場合、この関数の呼び出しがERROR_IO_PENDINGのエラー コードで失敗した場合、有効な読み取りコンテキストへのポインターが ppvReadContext パラメーターによって指される変数に配置されます。

CreateLogMarshallingArea の以前の呼び出しで指定した数バッファーよりも多くの読み取りコンテキストを開こうとすると、ERROR_LOG_BLOCK_EXHAUSTEDが返されます。

ログ レコードのコピーを完了するには、クライアントはまず、 GetOverlappedResult またはいずれかの同期 待機関数を使用して、重複した I/O 操作の遅延完了と実行を同期する必要があります。 詳細については、「 同期」と「入力と出力の重複」を参照してください。

ReadLogRecord が非同期的に完了すると、要求されたレコードはディスクから読み取られますが、*ppvReadBuffer 内のポインターには解決されません。

要求された読み取りを完了し、ログ レコードへの有効なポインターを取得するには、クライアントは ReadNextLogRecord を呼び出す必要があります。これは、 ReadLogRecord が返す読み取りコンテキスト ポインターを渡します。

メモ 共通ログ ファイル システム (CLFS) の読み取りコンテキストはスレッド セーフではありません。 一度に複数のスレッドで使用しないでください。

CLFS 読み取りコンテキストは、一度に複数の非同期読み取りに渡さないでください。または、関数がERROR_BUSYで失敗します。

 

要件

要件
サポートされている最小のクライアント Windows Vista [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2003 R2 [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー clfsw32.h
Library Clfsw32.lib
[DLL] Clfsw32.dll

こちらもご覧ください

CLFS_CONTEXT_MODE

CLFS_LSN

CLFS_RECORD_TYPE

一般的なログ ファイル システム関数

CreateLogMarshallingArea

OVERLAPPED

ReadNextLogRecord

TerminateReadLog