Добавление набора изменений в группу изменений
Добавьте все изменения в наборе изменений (или наборе исправлений) в буфере pData (размер nData байтов) в группу изменений.
Если буфер содержит набор исправлений, то все предыдущие вызовы этой функции для того же объекта группы изменений также должны были указать наборы исправлений. Или, если буфер содержит набор изменений, так же должны были быть и предыдущие вызовы этой функции. В противном случае возвращается SQLITE_ERROR, и к группе изменений не добавляются никакие изменения.
Строки в наборе изменений и группе изменений идентифицируются значениями в столбцах их первичного ключа. Изменение в наборе изменений считается применимым к той же строке, что и изменение, уже присутствующее в группе изменений, если у этих двух строк одинаковый первичный ключ.
Изменения в строках, которые еще не появлялись в группе изменений, просто копируются в неё. Или, если и новый набор изменений, и группа изменений содержат изменения, которые применяются к одной строке, окончательное содержимое группы изменений зависит от типа каждого изменения, как следует:
| Существующее изменение | Новое изменение | Результирующее изменение |
|---|---|---|
| Вставка | Вставка | Новое изменение игнорируется. Этот случай не возникает, если новый набор изменений был записан непосредственно после наборов изменений, уже добавленных в группу изменений. |
| Вставка | Обновление | Изменение вставки остаётся в группе изменений. Значения в изменении вставки изменяются так, как будто строка была вставлена существующим изменением, а затем обновлена в соответствии с новым изменением. |
| Вставка | Удаление | Существующая вставка удаляется из группы изменений. Удаление не добавляется. |
| Обновление | Вставка | Новое изменение игнорируется. Этот случай не возникает, если новый набор изменений был записан непосредственно после наборов изменений, уже добавленных в группу изменений. |
| Обновление | Обновление | Существующее обновление остаётся в группе изменений. Оно изменяется так, что сопровождающие значения будут такими, как будто строка была обновлена один раз существующим изменением, а затем ещё раз новым изменением. |
| Обновление | Удаление | Существующее обновление заменяется новым удалением в группе изменений. |
| Удаление | Вставка | Если одно или несколько значений столбцов в строке, вставленной новым изменением, отличаются от значений в строке, удаленной существующим изменением, существующее удаление заменяется обновлением в группе изменений. В противном случае, если вставленная строка идентична удалённой строке, существующее удаление просто отбрасывается. |
| Удаление | Обновление | Новое изменение игнорируется. Этот случай не возникает, если новый набор изменений был записан непосредственно после наборов изменений, уже добавленных в группу изменений. |
| Удаление | Удаление | Новое изменение игнорируется. Этот случай не возникает, если новый набор изменений был записан непосредственно после наборов изменений, уже добавленных в группу изменений. |
Если новый набор изменений содержит изменения в таблице, которая уже присутствует в группе изменений, то количество столбцов и положение столбцов первичного ключа для таблицы должны быть согласованы. Если это не так, эта функция завершается с ошибкой SQLITE_SCHEMA. За исключением случаев, когда объект группы изменений был сконфигурирован со схемой базы данных с помощью API sqlite3changegroup_schema(), тогда возможно объединять наборы изменений с разным количеством столбцов для одной таблицы, при условии, что они в остальном совместимы.
Если входной набор изменений, кажется, повреждён, и повреждение обнаружено, возвращается SQLITE_CORRUPT. Или, если во время обработки возникает ситуация недостатка памяти, функция возвращает SQLITE_NOMEM.
Во всех случаях, если произошла ошибка, состояние окончательного содержимого группы изменений не определено. Если ошибка не произошла, возвращается SQLITE_OK.
См. также списки Объектов, Констант и Функций.
SQLite is in the Public Domain.
https://sqlite.org/session/sqlite3changegroup_add.html