int sqlite3changeset_start( sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */ int nChangeset, /* Size of changeset blob in bytes */ void *pChangeset /* Pointer to blob containing changeset */ ); int sqlite3changeset_start_v2( sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */ int nChangeset, /* Size of changeset blob in bytes */ void *pChangeset, /* Pointer to blob containing changeset */ int flags /* SESSION_CHANGESETSTART_* flags */ );
Создайте iterator, используемый, чтобы пройти через содержание changeset. Если успешно, *pp указывает на обработчик iterator, и SQLITE_OK возвращен. Иначе, если ошибка происходит, *pp = 0 и код ошибки SQLite возвращен.
Следующие функции могут использоваться, чтобы продвинуть и запросить changeset iterator, созданный этой функцией:
Обязанность вызывающего в конечном счете разрушить iterator, передавая его sqlite3changeset_finalize(). Буфер, содержащий changeset (pChangeset), должен остаться действительным, пока iterator не будет разрушен.
Предположим, что changeset blob создан одной из функций sqlite3session_changeset(), sqlite3changeset_concat() или sqlite3changeset_invert(), все изменения в changeset, которые относятся к единственной таблице, группируются. Это означает, что, когда применение повторяет через changeset с использованием iterator, созданного этой функцией, все изменения, которые касаются единственной таблицы, посещают последовательно. Нет никакого шанса, что iterator посетит изменение для таблицы X, затем для Y и снова для X.
Поведение sqlite3changeset_start_v2() может быть изменено, передав комбинацию поддержанных флагов как 4-й параметр.
Обратите внимание на то, что sqlite3changeset_start_v2() API все еще экспериментален и поэтому подлежит изменению.