C言語

まず、ソースコードからのコンパイルとインストールの手順に従うか、お使いのプラットフォーム用のプリコンパイル済みバイナリを使用してください。無料版から始めることができます。


サンプルコード

litesyncモジュールは、SQLite3ライブラリと同じAPIを持っています

#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