readLogRecord 函数 (clfsw32.h)

以三种模式之一从指定的日志序列号 (LSN) 启动读取序列,并返回指定的日志记录和读取上下文中的第一个。 客户端可以通过将读取上下文传递给 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

指向 CLFS_LSN 结构的指针,该结构指定读取操作应在其中启动的记录 (LSN) 日志序列号。

此值必须是日志活动范围内有效记录的 LSN。

[in] eContextMode

*ppvReadContext 中返回的读取上下文的模式。

下表标识了三种互斥读取模式。

含义
ClfsContextPrevious
读取 plsnPrevious 链接到的记录。
ClfsContextUndoNext
读取 plsnUndoNext 链接到的记录链。
ClfsContextForward
使用紧跟在读取上下文中的当前 LSN 后面的 LSN 读取记录。

[out] ppvReadBuffer

指向变量的指针,该变量接收指向日志 I/O 块中目标记录的指针。

[out] pcbReadBuffer

指向变量的指针,该变量接收以 *ppvReadBuffer 为单位返回的数据的大小(以字节为单位)。

[out] peRecordType

指向接收记录读取类型的变量的指针。

此参数是 CLFS_RECORD_TYPE常量之一。

[out] plsnUndoNext

指向 CLFS_LSN 结构的指针,该结构接收撤消记录链中下一条记录的 LSN。

[out] plsnPrevious

指向 CLFS_LSN 结构的指针,该结构接收上一记录链中下一条记录的 LSN。

[out] ppvReadContext

指向变量的指针,该变量在读取成功时接收指向系统分配的读取上下文的指针。

如果函数延迟完成操作,它将返回有效的读取上下文指针和 错误状态ERROR_IO_PENDING。 在所有其他错误中,读取上下文指针为 NULL。 有关处理函数延迟完成的详细信息,请参阅本主题的“备注”部分。

获取所有请求的日志记录后,客户端必须将读取上下文传递给 TerminateReadLog 以释放关联的内存。 否则会导致内存泄漏。

注意 常见的日志文件系统 (CLFS) 读取上下文不是线程安全的。 它们不应一次由多个线程使用,或一次传递到多个异步读取中。
 

[in, out, optional] pOverlapped

指向异步操作所需的 OVERLAPPED 结构的指针。

如果未使用异步操作,此参数可以为 NULL

返回值

如果该函数成功,则返回值为非零值。

如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 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