C
Сначала следуйте инструкциям по компиляции и установке LiteSync из исходного кода или используйте предварительно скомпилированные бинарные файлы для вашей платформы. Вы можете начать с бесплатной версии.
Пример кода
Модуль litesync имеет тот же API, что и библиотека SQLite3
#include <sqlite3.h>
char *uri = "file:app.db?node=secondary&connect=tcp://server:port";
int main() {
sqlite3 *db;
sqlite3_open(uri, &db); /* открываем базу данных */
/* проверяем, готова ли база данных */
while(1){
char *json_str = sqlite3_query_value_str(db, "PRAGMA sync_status", NULL);
bool db_is_ready = strstr(json_str, "\"db_is_ready\": true") > 0;
sqlite3_free(json_str);
if (db_is_ready) break;
sleep_ms(250);
}
/* теперь мы можем использовать соединение с базой данных */
...
}
char * sqlite3_query_value_str(sqlite3 *db, char *sql, char **ppErrMsg) {
char *ptr = NULL;
sqlite3_stmt *stmt;
int rc;
if (ppErrMsg) *ppErrMsg = NULL;
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if (rc != SQLITE_OK) {
if (ppErrMsg) *ppErrMsg = sqlite3_strdup(sqlite3_errmsg(db));
return NULL;
}
if (sqlite3_step(stmt) == SQLITE_ROW) {
char *text = (char *)sqlite3_column_text(stmt, 0);
if (text) {
ptr = sqlite3_strdup(text);
}
}
sqlite3_finalize(stmt);
return ptr;
}
Уведомление об обновлении
Ваше приложение может получать уведомления, когда локальная база данных обновляется из-за синхронизации с удаленными узлами. Уведомление осуществляется через пользовательскую функцию.
static void on_db_update(sqlite3_context *context, int argc, sqlite3_value **argv){
char* changes = sqlite3_value_text(argv[0]);
printf("получено обновление: %s\n", changes);
}
sqlite3_create_function(db, "update_notification", 1, SQLITE_UTF8, NULL, &on_db_update, NULL, NULL);
Уведомление о транзакции
Ваше приложение может получать уведомления, когда локальные транзакции синхронизируются с удаленными узлами. Уведомление осуществляется через пользовательскую функцию. Если значение в аргументе `result` не "OK", то оно содержит сообщение об ошибке.
static void on_transaction_sync(sqlite3_context *context, int argc, sqlite3_value **argv){
char* sql = sqlite3_value_text(argv[0]);
char* result = sqlite3_value_text(argv[1]);
printf("Транзакция синхронизирована (%s): %s\n", result, sql);
}
sqlite3_create_function(db, "transaction_notification", 2, SQLITE_UTF8, NULL, &on_transaction_sync, NULL, NULL);
Статус синхронизации
Ваше приложение может проверять статус синхронизации локальной базы данных с удаленными узлами.
char *json_str = sqlite3_query_value_str(db, "PRAGMA sync_status", NULL);
printf("статус синхронизации: %s\n", json_str);
sqlite3_free(json_str);
ВНИМАНИЕ: Функции уведомления вызываются рабочим потоком. Приложение НЕ ДОЛЖНО использовать соединение с базой данных внутри функций уведомления, и оно должно возвращать управление как можно быстрее! Приложение может передать уведомление в основной поток перед возвратом.
Сборка
gcc -o app app.c -llitesync