会话模块 C 接口

API函数的流版本。

int sqlite3changeset_apply_strm(
  sqlite3 *db,                    /* Apply change to "main" db of this handle */
  int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */
  void *pIn,                                          /* First arg for xInput */
  int(*xFilter)(
    void *pCtx,                   /* Copy of sixth arg to _apply() */
    const char *zTab              /* Table name */
  ),
  int(*xConflict)(
    void *pCtx,                   /* Copy of sixth arg to _apply() */
    int eConflict,                /* DATA, MISSING, CONFLICT, CONSTRAINT */
    sqlite3_changeset_iter *p     /* Handle describing change and conflict */
  ),
  void *pCtx                      /* First argument passed to xConflict */
);
int sqlite3changeset_apply_v2_strm(
  sqlite3 *db,                    /* Apply change to "main" db of this handle */
  int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */
  void *pIn,                                          /* First arg for xInput */
  int(*xFilter)(
    void *pCtx,                   /* Copy of sixth arg to _apply() */
    const char *zTab              /* Table name */
  ),
  int(*xConflict)(
    void *pCtx,                   /* Copy of sixth arg to _apply() */
    int eConflict,                /* DATA, MISSING, CONFLICT, CONSTRAINT */
    sqlite3_changeset_iter *p     /* Handle describing change and conflict */
  ),
  void *pCtx,                     /* First argument passed to xConflict */
  void **ppRebase, int *pnRebase,
  int flags
);
int sqlite3changeset_concat_strm(
  int (*xInputA)(void *pIn, void *pData, int *pnData),
  void *pInA,
  int (*xInputB)(void *pIn, void *pData, int *pnData),
  void *pInB,
  int (*xOutput)(void *pOut, const void *pData, int nData),
  void *pOut
);
int sqlite3changeset_invert_strm(
  int (*xInput)(void *pIn, void *pData, int *pnData),
  void *pIn,
  int (*xOutput)(void *pOut, const void *pData, int nData),
  void *pOut
);
int sqlite3changeset_start_strm(
  sqlite3_changeset_iter **pp,
  int (*xInput)(void *pIn, void *pData, int *pnData),
  void *pIn
);
int sqlite3changeset_start_v2_strm(
  sqlite3_changeset_iter **pp,
  int (*xInput)(void *pIn, void *pData, int *pnData),
  void *pIn,
  int flags
);
int sqlite3session_changeset_strm(
  sqlite3_session *pSession,
  int (*xOutput)(void *pOut, const void *pData, int nData),
  void *pOut
);
int sqlite3session_patchset_strm(
  sqlite3_session *pSession,
  int (*xOutput)(void *pOut, const void *pData, int nData),
  void *pOut
);
int sqlite3changegroup_add_strm(sqlite3_changegroup*, 
    int (*xInput)(void *pIn, void *pData, int *pnData),
    void *pIn
);
int sqlite3changegroup_output_strm(sqlite3_changegroup*,
    int (*xOutput)(void *pOut, const void *pData, int nData), 
    void *pOut
);
int sqlite3rebaser_rebase_strm(
  sqlite3_rebaser *pRebaser,
  int (*xInput)(void *pIn, void *pData, int *pnData),
  void *pIn,
  int (*xOutput)(void *pOut, const void *pData, int nData),
  void *pOut
);

六个流式 API xxx_strm() 函数用于与相应的非流式 API 函数类似的目的:

Streaming functionNon-streaming equivalent
sqlite3changeset_apply_strmsqlite3changeset_apply
sqlite3changeset_apply_strm_v2sqlite3changeset_apply_v2
sqlite3changeset_concat_strmsqlite3changeset_concat
sqlite3changeset_invert_strmsqlite3changeset_invert
sqlite3changeset_start_strmsqlite3changeset_start
sqlite3session_changeset_strmsqlite3session_changeset
sqlite3session_patchset_strmsqlite3session_patchset

接受变更集(或补丁集)作为输入的非流函数要求将整个变更集存储在内存中的单个缓冲区中。类似地,返回变更集或补丁集的那些通过返回指向使用 sqlite3_malloc() 分配的单个大缓冲区的指针来实现。通常这很方便。但是,如果需要在低内存环境中运行的应用程序处理非常大的变更集,则所需的大量连续内存分配可能会变得繁重。

为了避免这个问题,而不是单个大缓冲区,输入通过回调函数传递给流式 API 函数,会话模块调用该回调函数以根据需要递增地请求输入数据。在所有情况下,一对 API 函数参数,例如

       int nChangeset,
       void *pChangeset,
 

被替换为:

       int (*xInput)(void *pIn, void *pData, int *pnData),
       void *pIn,
 

每次会话模块调用 xInput 回调时,传递的第一个参数是提供的 pIn 上下文指针的副本。第二个参数 pData 指向大小为 (*pnData) 字节的缓冲区。假设没有错误发生,xInput 方法应该将最多 (*pnData) 字节的数据复制到缓冲区中,并在返回 SQLITE_OK 之前将 (*pnData) 设置为复制的实际字节数。如果输入完全耗尽,(*pnData) 应设置为零以表明这一点。或者,如果发生错误,则应返回 SQLite 错误代码。在所有情况下,如果 xInput 回调返回错误,所有处理都将被放弃,流式 API 函数将错误代码的副本返回给调用者。

在 sqlite3changeset_start_strm() 的情况下,xInput 回调可以在迭代器生命周期内的任何时候由会话模块调用。如果此类 xInput 回调返回错误,迭代器将进入错误状态,所有后续对迭代器函数的调用将立即失败,并返回与 xInput 返回的相同错误代码。

类似地,返回变更集(或补丁集)的流式 API 函数通过回调函数而不是通过指向单个大缓冲区的指针以块的形式返回它们。在这种情况下,一对参数例如:

       int *pnChangeset,
       void **ppChangeset,
 

被替换为:

       int (*xOutput)(void *pOut, const void *pData, int nData),
       void *pOut
 

xOutput 回调被调用零次或多次以将数据返回到应用程序。传递给每个调用的第一个参数是应用程序提供的 pOut 指针的副本。第二个参数 pData 指向一个大小为 nData 字节的缓冲区,其中包含要返回的输出数据块。如果 xOutput 回调成功处理了提供的数据,它应该返回 SQLITE_OK 以指示成功。否则,它应该返回一些其他的 SQLite 错误代码。在这种情况下,处理会立即被放弃,流式 API 函数会将 xOutput 错误代码的副本返回给应用程序。

会话模块从不调用第三个参数设置为小于或等于零的值的 xOutput 回调。除此之外,不保证返回的数据块的大小。

另请参阅 对象常量函数的列表。