Процесс синхронизации на клиенте проходит в несколько этапов:
- UPLOAD — загрузка данных на сервер. Передача данных происходит при помощи mobile-transfer-package и transfer-file
- SYNC — запуск синхронизации на сервере см.sync-transfer
- DOWNLOAD — загрузка данных с сервера
- PROCESSING — обработка полученного пакета
- REMOVE — удаление временных данных
Дополнительные поля для записей
Для корректной обработки данных у каждой записи есть дополнительные «скрытые» поля:
- __type: string — тип операции: create, update, delete
- __sync: boolean — по умолчанию false. Была ли запись до этого синхронизирована
- __tid: any — внутренний идентификатор транзакции
- __key: string — имя первичного ключа
- __auto_increment: boolean — первичный ключ генерируется автоматически сервером или нет. Если этот параметр установлен как true, то при сохранении данных в БД первичный ключ созданный на клиенте не будет использоваться
Примечание.Синхронизация происходит только у тех записей чей параметр __sync = false
Выполнение синхронизации
...
cmp.start(dbName, [...], options);
...
, где
- dbName: string — имя БД для которой выполняется синхронизация
- […] — блок данных, см. ниже
- options: any — дополнительные опции
Блок данных:
Представляет из себя объект в котором хранится информация:
- какие таблицы нужно синхронизировать
- какие и в каком виде данные получить от сервера
- какие вложения нужно получить
Пример:
...
cmp.start(dbName, [{
name: 'audits'
}, {
name: 'audit_keys', // нужно получить данные от этой таблицы, при этом их синхронизируя
select: {
select: 'id,code,message,description',
filter: [{
property: "code",
value: "CE0"
}]
}
}, {
name: '__attachmets',
items: [
'/answer.txt'
]
}], {
...
Дополнительные опции:
- persist: boolean — если установить параметр true, то для обработки файлов будет использовать механизм Persistent Storage
- buffer: number — размер пакета передаваемого на сервер. По умолчанию равен 1024*1024 (1 Мб)
- user: string — имя пользователя (применяется в зависимости от реализации)
- appVersion: string — версия приложения (применяется в зависимости от реализации)
- step: function — функция обратного вызова. Возвращается при смене этапа (шага) синхронизации
step: function (message, data) { console.log(message); },
- status: function — функция обратного вызова. Возвращается статус (процесс) синхронизации
status: function (message, data) { if (data.error) { console.error(message); } else { console.log(message); } }
- callback: function — функция обратного вызова. Завершение выполнения синхронизации
callback: function (result) { if(result.success == true) { } }
Формат блоков пакета *.bkp
{
items: { // данные для добавления, обновления, удаления
table1: [...],
table2: [...]
},
select: { // блок выборки данных из БД
table1: {
select: 'id, name, date', // список поле для выборки
filter: [{ // фильтр
property: 'code',
value: '0'
}] // можно также передавать сортировку см. http://docs.appcode.pw/docs?project=postgresql-rpc-dbcontext&file=/modules/postgresql-query-creator.js
}
},
append: {}, // синтаксис аналогичен select
attachments: ['/readme.txt', '/pic.jpg'] // получение файлов ОТ сервера, передача осуществляется другим механизмом
}
items
Объект для хранения списка таблиц у которых есть не синхронизированные записи.
...
audits: [{
id: '1',
action_code: 'CE0',
action_message: 'аудит теста',
action_date: new Date(),
app_name: '',
app_version: '',
user_name: '',
region: '',
__type: 'create',
__sync: false,
__tid: '',
__auto_increment: true,
__key: 'id'
}]
...
select и append
Выборка данных из БД. append отличается от select тем, что:
- при обработке select записи и таблицы удаляются (truncate) и полученные результаты select добавляются
- при обработке append удаление записей не происходит