int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pData);
Добавьте все изменения в changeset (или patchset) в буфере pData (размеом nData байт) к changegroup.
Если буфер содержит patchset, то все предшествующие обращения к этой функции на том же самом объекте changegroup, должно быть, также определили patchsets. Или, если буфер содержит changeset, должны быть более ранние обращения к этой функции. Иначе SQLITE_ERROR возвращен, и никакие изменения не добавляются к changegroup.
Строки в changeset и changegroup определяются значениями в их колонках PRIMARY KEY. Изменение в changeset, как полагают, относится к той же самой строке, как изменение, уже существующее в changegroup, если у этих двух строк есть тот же самый первичный ключ.
Изменения строк, которые уже не появляются в changegroup, просто копируются в него. Или, если новый changeset и changegroup содержат изменения, которые относятся к единственной строке, заключительное содержание changegroup зависит от типа каждого изменения, следующим образом:
Существующее изменение | Новое изменение | Изменение на выходе |
---|---|---|
INSERT | INSERT | Новое изменение проигнорировано. Этот случай не происходит, если новый changeset был немедленно зарегистрирован после changesets, уже добавленного к changegroup. |
INSERT | UPDATE | Изменение INSERT остается в changegroup. Значения в изменении INSERT изменяются, как будто строка была вставлена существующим изменением и затем обновлена согласно новому изменению. |
INSERT | DELETE | Существующий INSERT удален из changegroup. DELETE не добавляется. |
UPDATE | INSERT | Новое изменение проигнорировано. Этот случай не происходит, если новый changeset был немедленно зарегистрирован после changeset, уже добавленного к changegroup. |
UPDATE | UPDATE | Существующий UPDATE остается в changegroup. Это исправлено так, чтобы сопровождающие значения состояли в том, как будто строка была обновлена однажды существующим изменением, а затем еще и новым изменением. |
UPDATE | DELETE | Существующий UPDATE заменяется новым DELETE в changegroup. |
DELETE | INSERT | Если одно или больше значений столбцов в строке, вставленной новым изменением, отличаются от таких же в строке, удаленной существующим изменением, существующий DELETE заменяется UPDATE в changegroup. Иначе, если вставленная строка это точно то же самое как удаленная, от существующего DELETE просто отказываются. |
DELETE | UPDATE | Новое изменение проигнорировано. Этот случай не происходит, если новый changeset был немедленно зарегистрирован после changeset, уже добавленного к changegroup. |
DELETE | DELETE | Новое изменение проигнорировано. Этот случай не происходит, если новый changeset был немедленно зарегистрирован после changeset, добавленного к changegroup. |
Если новый changeset содержит изменения, которые уже присутствуют в changegroup, то количество колонок и положение колонок первичного ключа для таблицы должны быть последовательными. Если дело обстоит не так, эта функция терпит неудачу с SQLITE_SCHEMA. Кроме того, если объект changegroup формировался со схемой базы данных, используя sqlite3changegroup_schema() API, возможно объединить changeset с различными числами колонок для единственной таблицы при условии, что они в других отношениях совместимы.
Во всех случаях, если ошибка происходит, статус заключительного содержания changegroup не определен. Если никакая ошибка не происходит, SQLITE_OK возвращен.
Если вход changeset, кажется, поврежден, SQLITE_CORRUPT возвращен. Или, если переполнение памяти происходит во время обработки, эта функция возвращает SQLITE_NOMEM.