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