int sqlite3changegroup_add(sqlite3_changegroup *,int nData,void * pData);
将缓冲区pData(大小为nData字节)中的变更集(或补丁集)内的所有变更添加到变更组。
如果缓冲区包含补丁程序集,那么在同一changegroup对象上对该函数的所有先前调用也必须具有指定的补丁程序集。或者,如果缓冲区包含一个变更集,那么必须对该函数进行更早的调用。否则,将返回SQLITE_ERROR,并且不会将任何更改添加到更改组。
变更集和变更组中的行由其“主键”列中的值标识。如果两行具有相同的主键,则该变更集中的更改将被视为与更改组中已经存在的更改应用于同一行。
只需将尚未出现在变更组中的行更改复制到变更组中即可。或者,如果新变更集和变更组都包含应用于单个行的变更,则变更组的最终内容取决于每个变更的类型,如下所示:
现有变化 | 新变化 | 输出变化 |
---|---|---|
插 | 插 | 新更改将被忽略。如果在将变更集添加到变更组之后立即记录了新的变更集,则不会发生这种情况。 |
插 | 更新 | INSERT更改保留在更改组中。修改INSERT更改中的值,就好像该行是由现有更改插入,然后根据新更改进行更新一样。 |
插 | 删除 | 现有的INSERT从更改组中删除。未添加DELETE。 |
更新 | 插 | 新更改将被忽略。如果在将变更集添加到变更组之后立即记录了新的变更集,则不会发生这种情况。 |
更新 | 更新 | 现有的UPDATE保留在更改组中。对其进行了修改,以使随附的值就像该行通过现有更改进行了更新,然后又通过新更改进行了更新。 |
更新 | 删除 | 现有的UPDATE将被更改组中的新DELETE取代。 |
删除 | 插 | 如果新更改插入的行中的一个或多个列值与现有更改删除的行中的列值不同,则将现有DELETE替换为更改组中的UPDATE。否则,如果插入的行与删除的行完全相同,则简单地丢弃现有的DELETE。 |
删除 | 更新 | 新更改将被忽略。如果在将变更集添加到变更组之后立即记录了新的变更集,则不会发生这种情况。 |
删除 | 删除 | 新更改将被忽略。如果在将变更集添加到变更组之后立即记录了新的变更集,则不会发生这种情况。 |
如果新变更集包含对变更组中已经存在的表的变更,则该表的列数和主键列的位置必须一致。如果不是这种情况,则此函数将失败,并显示SQLITE_SCHEMA。如果输入变更集似乎已损坏并且检测到损坏,则返回SQLITE_CORRUPT。或者,如果在处理期间发生内存不足的情况,则此函数返回SQLITE_NOMEM。在所有情况下,如果发生错误,则更改组的最终内容的状态都是不确定的。
如果未发生错误,则返回SQLITE_OK。