int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pData);
將 pData (大小為 nData 位元組) 緩衝區中的所有變更集 (或修補程式集) 新增至變更群組。
如果緩衝區包含修補程式集,則對同一變更群組物件的所有先前呼叫此函數也必須指定修補程式集。或者,如果緩衝區包含變更集,則對此函數的先前呼叫也必須包含變更集。否則,會傳回 SQLITE_ERROR,且不會將任何變更新增至變更群組。
變更集和變更群組中的列會透過其 PRIMARY KEY 欄位中的值來識別。如果兩列具有相同的基礎金鑰,則變更集中的變更會被視為套用至與變更群組中已存在的變更相同的列。
變更群組中尚未出現的列變更會直接複製到其中。或者,如果新的變更集和變更群組都包含套用至單一列的變更,則變更群組的最終內容會根據每個變更的類型而定,如下所示
現有變更 | 新變更 | 輸出變更 |
---|---|---|
INSERT | INSERT | 新變更會被忽略。如果新變更集是在已新增至變更群組的變更集之後立即記錄的,則不會發生此情況。 |
INSERT | UPDATE | INSERT 變更會保留在變更群組中。INSERT 變更中的值會修改,就好像該列是由現有變更插入,然後根據新變更進行更新。 |
INSERT | DELETE | 現有的 INSERT 會從變更群組中移除。DELETE 不會被新增。 |
UPDATE | INSERT | 新變更會被忽略。如果新變更集是在已新增至變更群組的變更集之後立即記錄的,則不會發生此情況。 |
UPDATE | UPDATE | 現有的 UPDATE 會保留在變更群組中。它會經過修正,以便附帶值就像該列由現有變更更新一次,然後再由新變更更新一次。 |
UPDATE | DELETE | 現有的 UPDATE 會在變更群組中被新的 DELETE 取代。 |
DELETE | INSERT | 如果新變更插入的列值與現有變更刪除的列值有一個或多個不同,現有的 DELETE 會在變更群組中被 UPDATE 取代。否則,如果插入的列與刪除的列完全相同,現有的 DELETE 僅會被捨棄。 |
DELETE | UPDATE | 新變更會被忽略。如果新變更集是在已新增至變更群組的變更集之後立即記錄的,則不會發生此情況。 |
DELETE | DELETE | 新變更會被忽略。如果新變更集是在已新增至變更群組的變更集之後立即記錄的,則不會發生此情況。 |
如果新的變更集包含對變更群組中已存在的資料表的變更,則資料表的欄位數和主鍵欄位的順序必須一致。如果不是這樣,此函數會傳回 SQLITE_SCHEMA 失敗。除非變更群組物件已使用 sqlite3changegroup_schema() API 設定資料庫架構,否則可以合併欄位數不同的變更集,前提是它們在其他方面相容。
如果輸入的變更集似乎已損毀,且已偵測到損毀,則會傳回 SQLITE_CORRUPT。或者,如果在處理期間發生記憶體不足的狀況,此函數會傳回 SQLITE_NOMEM。
在所有情況下,如果發生錯誤,變更群組最終內容的狀態將未定義。如果沒有發生錯誤,則會傳回 SQLITE_OK。