Spec-Zone.ru › SQLite

Перебазирование наборов изменений

typedef struct sqlite3_rebaser sqlite3_rebaser;

Важно: Этот интерфейс экспериментальный и может быть изменён без предварительного уведомления.

Предположим, есть сайт, который хранит базу данных в состоянии S0. Затем производятся изменения, которые перемещают эту базу данных в состояние S1 и записывается набор изменений (локальный набор изменений). После этого с другого сайта принимается набор изменений, основанный на состоянии S0 (удаленный набор изменений), и применяется к базе данных. База данных затем находится в состоянии (S1+"удаленный"), где точное состояние зависит от принятых решений по разрешению конфликтов (OMIT или REPLACE) во время применения «удаленного» набора изменений. Перебазирование набора изменений — это обновление набора изменений с учётом этих решений по разрешению конфликтов, чтобы не приходилось решать одни и те же конфликты в других частях сети.

Например, если и локальный, и удалённый наборы изменений содержат INSERT одного и того же ключа в «CREATE TABLE t1(a PRIMARY KEY, b)»:

локальный: INSERT INTO t1 VALUES(1, 'v1'); удалённый: INSERT INTO t1 VALUES(1, 'v2');

и разрешение конфликта — REPLACE, то изменение INSERT удаляется из локального набора изменений (оно было перезаписано). Или, если разрешение конфликта было «OMIT», то локальный набор изменений изменяется, чтобы содержать:

UPDATE t1 SET b = 'v2' WHERE a=1;

Изменения в локальном наборе изменений перебазируются следующим образом:

Локальный INSERT
Он может конфликтовать только с удалённым INSERT. Если разрешение конфликта было OMIT, то добавьте изменение UPDATE в перебазированный набор изменений. Или, если разрешение конфликта было REPLACE, ничего не добавляйте в перебазированный набор изменений.

Локальный DELETE
Он может конфликтовать с удалённым UPDATE или DELETE. В обоих случаях единственным возможным разрешением является OMIT. Если удалённая операция была DELETE, то не добавляйте никаких изменений в перебазированный набор изменений. Если удалённая операция была UPDATE, то поля old.* изменения обновляются, чтобы отразить новые значения new.* в UPDATE.

Локальный UPDATE
Он может конфликтовать с удалённым UPDATE или DELETE. Если он конфликтует с DELETE, и разрешение конфликта было OMIT, то обновление изменяется на INSERT. Любые неопределённые значения в новом записях new.* из изменения обновления заполняются значениями old.* из конфликтующего DELETE. Или, если разрешение конфликта было REPLACE, изменение UPDATE просто пропускается из перебазированного набора изменений.

Если конфликт с удалённым UPDATE, и разрешение OMIT, то значения old.* перебазируются, используя значения new.* в удалённом изменении. Или, если разрешение REPLACE, то изменение копируется в перебазированный набор изменений с удалением обновлённых столбцов, также обновлённых конфликтующим удалённым UPDATE. Если это означает, что столбцы не будут обновлены, изменение пропускается.

Локальное изменение может быть перебазировано против нескольких удаленных изменений одновременно. Если один и тот же ключ изменяется несколькими удаленными наборами изменений, они объединяются следующим образом перед перебазированием локального набора изменений:

  • Если было одно или более разрешений REPLACE для ключа, оно перебазируется в соответствии с REPLACE.

  • Если разрешений REPLACE для ключа не было, тогда локальный набор изменений перебазируется в соответствии с самым последним разрешением OMIT.

Обратите внимание, что разрешения конфликтов из нескольких удалённых наборов изменений объединяются на основе каждого поля, а не на основе каждой строки. Это означает, что в случае нескольких удалённых операций UPDATE некоторые поля одного локального изменения могут быть перебазированы для REPLACE, а другие — для OMIT.

Для перебазирования локального набора изменений, сначала необходимо применить удалённый набор изменений к локальной базе данных с помощью sqlite3changeset_apply_v2() и получить буфер информации о перебазировании. Затем:

  1. Создается объект sqlite3_rebaser с помощью вызова sqlite3rebaser_create().
  2. Новый объект настраивается с помощью буфера перебазирования, полученного из sqlite3changeset_apply_v2(), вызывая sqlite3rebaser_configure(). Если локальный набор изменений необходимо перебазировать против нескольких удалённых наборов изменений, то sqlite3rebaser_configure() должен вызываться несколько раз в том же порядке, в котором вызывались несколько sqlite3changeset_apply_v2().
  3. Каждый локальный набор изменений перебазируется с помощью вызова sqlite3rebaser_rebase().
  4. Объект sqlite3_rebaser удаляется с помощью вызова sqlite3rebaser_delete().

См. также списки объектов, констант и функций.

SQLite is in the Public Domain.
https://sqlite.org/session/rebaser.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API