Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » Ultra Light - C/C++ プログラミング » アプリケーション開発 » Embedded SQL を使用したアプリケーションの開発 » アプリケーションへの同期の追加 » 同期のモニタとキャンセル

 

同期ステータス情報の処理

同期をモニタするコールバック関数は、ul_synch_status 構造体をパラメータとして取ります。詳細については、ul_synch_status 構造体を参照してください。

ul_synch_status 構造体には次のようなメンバが含まれます。

struct ul_synch_status {
    struct {
       ul_u_long   bytes;
       ul_u_long   inserts;
       ul_u_long   updates;
       ul_u_long   deletes;
     }               sent;
    struct {
       ul_u_long   bytes;
       ul_u_long   inserts;
       ul_u_long   updates;
       ul_u_long   deletes;
     }               received;
    p_ul_synch_info  info;
    ul_synch_state   state;
    ul_u_short       db_tableCount;
    ul_u_short       table_id;
    char             table_name[];
    ul_wchar         table_name_w2[];
    ul_u_short       sync_table_count;
    ul_u_short       sync_table_index;
    ul_sync_state    state;
    ul_bool          stop;
    ul_u_short       flags;
    ul_void *        user_data;
    SQLCA *          sqlca;
}
  • sent.inserts   これまでにアップロードされた挿入済みローの数。

  • sent.updates   これまでにアップロードされた更新済みローの数。

  • sent.deletes   これまでにアップロードされた削除済みローの数。

  • sent.bytes   これまでにアップロードされたバイト数。

  • received.inserts   これまでにダウンロードされた挿入済みローの数。

  • received.updates   これまでにダウンロードされた更新済みローの数。

  • received.deletes   これまでにダウンロードされた削除済みローの数。

  • received.bytes   これまでにダウンロードされたバイト数。

  • info   ul_synch_info 構造体へのポインタ。ul_synch_info_a 構造体を参照してください。

  • db_tableCount   データベース内のテーブルの数を返します。

  • table_id   現在アップロードまたはダウンロードされているテーブルの番号 (1 から始まります)。同期されないテーブルがある場合には、この番号で値がスキップされることがあります。また、番号が必ず増加するとはかぎりません。

  • table_name[]   現在のテーブルの名前。

  • table_name_w2[]   現在のテーブルの名前 (ワイド文字バージョン)。このフィールドには、Windows (デスクトップまたは Mobile) 環境の場合のみ値が入ります。

  • sync_table_count   同期中のテーブルの数を返します。

  • sync_table_index   アップロードまたはダウンロードされているテーブルの番号。1 から始まり sync_table_count の値で終わります。同期されていないテーブルがある場合には、この番号で値がスキップされることがあります。

  • state   以下のステータスのいずれかを表します。

    • UL_SYNCH_STATE_STARTING   同期処理はまだ行われていません。

    • UL_SYNCH_STATE_CONNECTING   同期ストリームは構築されていますが、まだ開かれていません。

    • UL_SYNCH_STATE_SENDING_HEADER   同期ストリームが開かれ、ヘッダが送信されようとしています。

    • UL_SYNCH_STATE_SENDING_TABLE   テーブルが送信されています。

    • UL_SYNCH_STATE_SENDING_DATA   スキーマ情報またはデータが送信されています。

    • UL_SYNCH_STATE_FINISHING_UPLOAD   アップロード処理が完了し、コミットが実行されています。

    • UL_SYNCH_STATE_RECEIVING_UPLOAD_ACK   アップロード完了の確認を受信しています。

    • UL_SYNCH_STATE_RECEIVING_TABLE   テーブルを受信しています。

    • UL_SYNCH_STATE_RECEIVING_DATA   スキーマ情報またはデータを受信しています。

    • UL_SYNCH_STATE_COMMITTING_DOWNLOAD   ダウンロード処理が完了し、コミットが実行されています。

    • UL_SYNCH_STATE_SENDING_DOWNLOAD_ACK   ダウンロード完了の確認が送信されています。

    • UL_SYNCH_STATE_DISCONNECTING   同期ストリームが閉じられようとしています。

    • UL_SYNCH_STATE_DONE   同期は正常に完了しました。

    • UL_SYNCH_STATE_ERROR   同期は完了しましたが、エラーが発生しました。

    • UL_SYNCH_STATE_ROLLING_BACK_DOWNLOAD   ダウンロード中にエラーが発生し、ダウンロードがロールバックされています。

      同期処理の詳細については、同期処理を参照してください。

  • stop   同期を中断するには、このメンバを true に設定します。SQL 例外の SQLE_INTERRUPTED が設定され、通信エラーが発生したかのように同期が停止します。observer は、適切なクリーンアップを実行するように、常に DONE または ERROR のステータスで呼び出されます。

  • flags   現在の状態に関連する追加情報を示す、現在の同期フラグを返します。

  • user_data   引数として ULRegisterSynchronizationCallback 関数に渡されるユーザ・データ・オブジェクトを返します。

  • sqlca   接続のアクティブな SQLCA へのポインタ。

次の例は、ごく簡単な observer 関数を示しています。

extern void __stdcall ObserverFunc(
    p_ul_synch_status status )
{
    switch( status->state ) {
        case UL_SYNCH_STATE_STARTING:
        printf( "Starting\n");
        break;
        case UL_SYNCH_STATE_CONNECTING:
            printf( "Connecting\n"  );
            break;
        case UL_SYNCH_STATE_SENDING_HEADER:
            printf( "Sending Header\n" );
            break;
        case UL_SYNCH_STATE_SENDING_TABLE:
            printf( "Sending Table %d of %d\n",
                    status->tableIndex + 1,
                    status->tableCount );
            break;
        case UL_SYNCH_RECEIVING_UPLOAD_ACK:
            printf( "Receiving Upload Ack\n" );
            break;
        case UL_SYNCH_STATE_RECEIVING_TABLE:
            printf( "Receiving Table %d of %d\n",
                    status->tableIndex + 1,
                    status->tableCount );
            break;
        case UL_SYNCH_STATE_SENDING_DOWNLOAD_ACK:
            printf( "Sending Download Ack\n" );
            break;
        case UL_SYNCH_STATE_DISCONNECTING:
            printf( "Disconnecting\n" );
            break;
        case UL_SYNCH_STATE_DONE:
            printf( "Done\n" );
            break;
        break;
...

この observer 関数では、2 つのテーブルが同期されたときに次のような出力が生成されます。

Starting
Connecting
Sending Header
Sending Table 1 of 2
Sending Table 2 of 2
Receiving Upload Ack
Receiving Table 1 of 2
Receiving Table 2 of 2
Sending Download Ack
Disconnecting
Done
CustDB の例

observer 関数の例は CustDB サンプル・アプリケーションに含まれています。CustDB を使った実装では、同期の進捗状況を示すウィンドウが表示されます。ユーザはそのウィンドウで同期をキャンセルすることができます。ユーザ・インタフェース・コンポーネントは observer 関数のプラットフォームを指定します。

CustDB サンプル・コードは samples-dir\UltraLite\CustDB ディレクトリにあります。observer 関数は CustDB ディレクトリのプラットフォーム固有のサブディレクトリに含まれています。