流操作回调
读取器
从操作系统流中读取数据的函数,例如 mco_db_load()
,必须指定一个具有以下原型的流读取器函数:
typedef mco_size_sig_t(*mco_stream_read)(
void* stream_handle, // 可以引用任何合法的流(例如文件或套接字)
mco_size_t max_nbytes, // 为 to 设定缓冲区大小
/*OUT*/void* to // 大小为 max_nbytes 的内存缓冲区
);
以下是一个流读取器实现的示例:
mco_size_sig_t file_reader(
void *stream_handle /* FILE * */,
/* OUT */void *to,
mco_size_t max_nbytes )
{
FILE *f = (FILE *)stream_handle;
mco_size_sig_t nbs;
nbs = fread( to, 1, max_nbytes, f );
return nbs;
}
写入器
向操作系统流写入数据的函数,例如 mco_db_save()
,必须指定一个具有以下原型的流写入器函数:
typedef mco_size_sig_t(*mco_stream_write) (
/*IN*/ void *stream_handle, // 可以引用任何合法的流(例如,文件或套接字)
/*IN*/ const void * from, // from 是一个数组,将从其中向流写入 nbytes。
/*IN*/ unsigned nbytes
);
此外,用户定义的写入器回调函数不需要写入整个缓冲区。它可以写入特定数量的字节,然后返回此值(小于请求的大小但大于零)。例如,如果操作被信号中断,SmartEDB 运行时将再次调用用户定义的回调函数以完成缓冲区。可以设置运行时选项 MCO_RT_OPTION_DB_SAVE_CRC
(请参阅 mco_runtime_setoption()
)来验证流式传输到输出的数据。为用户定义的流写入器回调函数实现了内部缓冲。当达到缓冲区大小时,运行时会调用用户定义的回调函数进行写入。默认缓冲区大小为 16 千字节。(如果需要更改以满足应用程序要求,则需要特殊构建运行时)。用户定义的回调函数必须向运行时返回以下值范围:
< 0 – system dependent error code.
= 0 – no more data can be written.
> 0 – number of bytes written
流写入器实现的示例如下:
mco_size_sig_t file_writer(
void *stream_handle /* FILE * */,
const void *from,
mco_size_t nbytes )
{
FILE *f = (FILE *)stream_handle;
mco_size_sig_t nbs;
nbs = fwrite( from, 1, nbytes, f );
return nbs;
}