C

Suivez d'abord les instructions pour compiler et installer LiteSync à partir du code source ou utilisez les binaires précompilés pour votre plateforme. Vous pouvez commencer avec la version gratuite.


Code exemple

Le module litesync a la même API que la bibliothèque SQLite3

#include <sqlite3.h>

char *uri = "file:app.db?node=secondary&connect=tcp://server:port";

int main() {
  sqlite3 *db;
  sqlite3_open(uri, &db);  /* ouvre la base de données */

  /* vérifie si la base de données est prête */
  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);
  }

  /* maintenant nous pouvons utiliser la connexion à la base de données */
  ...
}

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;
}


Notification de Mise à Jour

Votre application peut être notifiée lorsque la base de données locale est mise à jour suite à une synchronisation avec des nœuds distants. La notification se fait via une fonction définie par l'utilisateur.

static void on_db_update(sqlite3_context *context, int argc, sqlite3_value **argv){
  char* changes = sqlite3_value_text(argv[0]);
  printf("mise à jour reçue: %s\n", changes);
}

sqlite3_create_function(db, "update_notification", 1, SQLITE_UTF8, NULL, &on_db_update, NULL, NULL);


Notification de Transaction

Votre application peut être notifiée lorsque les transactions locales sont synchronisées avec des nœuds distants. La notification se fait via une fonction définie par l'utilisateur. Si la valeur dans l'argument `result` n'est pas "OK", elle contient le message d'erreur.

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("Transaction synchronisée (%s): %s\n", result, sql);
}

sqlite3_create_function(db, "transaction_notification", 2, SQLITE_UTF8, NULL, &on_transaction_sync, NULL, NULL);


État de la Synchronisation

Votre application peut vérifier l'état de synchronisation de la base de données locale avec les nœuds distants.

char *json_str = sqlite3_query_value_str(db, "PRAGMA sync_status", NULL);
printf("état de synchronisation: %s\n", json_str);
sqlite3_free(json_str);


ATTENTION : Les fonctions de notification sont appelées par le thread worker. L'application ne doit PAS utiliser la connexion à la base de données dans les fonctions de notification et doit retourner aussi vite que possible ! L'application peut transférer la notification au thread principal avant de retourner.




Compilation

gcc -o app app.c -llitesync