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;
本地变更集中的变更将按以下方式重新建立基础:
如果与远程UPDATE冲突并且解决方案为OMIT,则将使用远程更改中的new。*值对old。*值进行重新基准化。或者,如果解决方案是REPLACE,则将更改复制到重新设置的变更集中,同时更新对列的更新,该列也将通过冲突的远程UPDATE进行更新。如果这意味着将不更新任何列,则更改将被忽略。
本地更改可以同时针对多个远程更改重新建立基础。如果单个键被多个远程变更集修改,则在重新建立本地变更集之前,将它们组合如下:
请注意,来自多个远程变更集的冲突解决方案是按字段而不是按行组合的。这意味着,在执行多个远程UPDATE操作的情况下,单个本地更改的某些字段可能会被替换为REPLACE,而其他字段则被替换为OMIT。
为了对本地变更集进行基础设置,必须首先使用sqlite3changeset_apply_v2()和捕获的基础信息缓冲区将远程变更集应用于本地数据库。然后: