RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Small. Fast. Reliable.
Choose any three.

Session Module C Interface

Перебазирование changesets

typedef struct sqlite3_rebaser sqlite3_rebaser;

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

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

Например, если местные и отдаленные changesets содержат INSERT того же самого ключа на "CREATE TABLE t1(a PRIMARY KEY, b)":

local: INSERT INTO t1 VALUES(1, 'v1'); remote: INSERT INTO t1 VALUES(1, 'v2');

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

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

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

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

Local DELETE
Это может находиться в противоречии с удаленным обновлением или DELETE. В обоих случаях единственная возможная резолюция это OMIT. Если удаленной операцией был DELETE, то не добавляйте изменение в changeset. Если удаленной операцией был UPDATE, то поля old.* изменения обновляются, чтобы отразить значения new.* в UPDATE.

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

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

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

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

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

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

Чтобы повторно основывать местный changeset, отдаленный changeset должен сначала быть применен к локальной базе данных, используя sqlite3changeset_apply_v2() и буфер захваченной информации. Тогда:

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