Small. Fast. Reliable.
Choose any three.

会话模块C接口

重新设定变更集

typedef struct sqlite3_rebaser sqlite3_rebaser;

重要提示:此界面是实验性的,如有更改,恕不另行通知。

假设有一个站点托管状态为S0的数据库。并进行了修改,使该数据库移至状态S1并记录了变更集(“本地”变更集)。然后,从另一个站点接收基于S0的变更集(“远程”变更集)并将其应用于数据库。然后,数据库处于状态(S1 +“远程”),其中确切的状态取决于在应用“远程”时做出的任何冲突解决决策(OMIT或REPLACE)。更改变更集的基础是对其进行更新,以考虑那些冲突解决方案的决策,从而不必在网络中的其他位置解决相同的冲突。

例如,如果本地和远程更改集都在“ CREATE TABLE t1(a PRIMARY KEY,b)”上包含相同键的INSERT:

本地:插入到t1值(1,'v1'); 远程:INSERT INTO t1 VALUES(1,'v2');

并且冲突解决方案为REPLACE,则将INSERT更改从本地更改集中删除(已被覆盖)。或者,如果冲突解决方案是“ OMIT”,则将本地更改集修改为包含以下内容:

更新t1设置b ='v2'其中a = 1;

本地变更集中的变更将按以下方式重新建立基础:

本地插入
这可能仅与远程INSERT冲突。如果冲突解决方案是OMIT,则将UPDATE更改添加到重新设置的变更集。或者,如果冲突解决方案是REPLACE,则不向重新设置的变更集添加任何内容。

本地删除
这可能与远程UPDATE或DELETE冲突。在这两种情况下,唯一可能的解决方案是OMIT。如果远程操作是DELETE,则不将任何更改添加到重新设置的变更集。如果远程操作是UPDATE,则将更改的old。*字段更新为反映UPDATE中的new。*值。

本地更新
这可能与远程UPDATE或DELETE冲突。如果它与DELETE冲突,并且冲突解决方案是OMIT,则将更新更改为INSERT。来自更新更改的new。*记录中的所有未定义值都使用冲突DELETE中的old。*值来填充。或者,如果冲突解决方案是REPLACE,则从重新建立的变更集中将UPDATE变更简单地省略。

如果与远程UPDATE冲突并且解决方案为OMIT,则将使用远程更改中的new。*值对old。*值进行重新基准化。或者,如果解决方案是REPLACE,则将更改复制到重新设置的变更集中,同时更新对列的更新,该列也将通过冲突的远程UPDATE进行更新。如果这意味着将不更新任何列,则更改将被忽略。

本地更改可以同时针对多个远程更改重新建立基础。如果单个键被多个远程变更集修改,则在重新建立本地变更集之前,将它们组合如下:

请注意,来自多个远程变更集的冲突解决方案是按字段而不是按行组合的。这意味着,在执行多个远程UPDATE操作的情况下,单个本地更改的某些字段可能会被替换为REPLACE,而其他字段则被替换为OMIT。

为了对本地变更集进行基础设置,必须首先使用sqlite3changeset_apply_v2()和捕获的基础信息缓冲区将远程变更集应用于本地数据库。然后:

  1. 通过调用sqlite3rebaser_create()创建一个sqlite3_rebaser对象。
  2. 新对象配置有通过调用sqlite3rebaser_configure()从sqlite3changeset_apply_v2()获得的基准缓冲区。如果要根据多个远程变更集重新建立本地变更集,则应多次调用sqlite3rebaser_configure(),其顺序与调用多个sqlite3changeset_apply_v2()的顺序相同。
  3. 每个本地变更集都通过调用sqlite3rebaser_rebase()来重定基础。
  4. 通过调用sqlite3rebaser_delete()删除sqlite3_rebaser对象。

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