DMC 以外の HotSync コンジットが Ultra Light のアップロードとダウンロードのストリームを構築して読み込む方法

概要:この文書では、Palm で実行している Ultra Light アプリケーション用に DMC 以外のコンジットを使用するときに、アップロード・ストリームがいつどのように生成されるかを説明します。

Palm で実行している Ultra Light アプリケーション用に DMC 以外のコンジットを使用するときに、アップロード・ストリームがいつどのように生成されるかについては、しばしば誤解が生じることがあります。ここでは、アップロード・ストリームの生成について説明します。

最初に CustDB.prc を Palm にダウンロードしたときは、それが Palm に存在する唯一の CustDB 用の Palm データベースになっています。CustDB をはじめて起動し、ユーザ ID を入力すると、Palm 上に複数のデータベースが作成されます。これらのうちで最も重要なデータベースは、データ格納用データベースと同期データベースです。つまり、Ultra Light データベースは、複数の Palm データベースを使用します。

同期データベースは、HotSync 中にアップロードとダウンロードのストリームを格納するために使用されます。Palm では、アプリケーションを切り替えたときに、アプリケーションは実際には終了せず、フォーカスだけが切り替わります。Palm アプリケーションにフォーカスが切り替わると、PalmLaunch のコードが実行されます。別の Palm アプリケーションにフォーカスが切り替わると、PalmExit のコードが実行されます。CustDB のこれらのルーチン内で、m_Database.PalmExit と m_Database.PalmLaunch が呼び出されます。これらは、Ultra Light のランタイムを呼び出し、Palm 上の同期データベースでアップロードとダウンロードのストリームの読み込みと書き込みを行います。

すべてが正常に機能している場合は、一連のイベントが発生します。

CustDB の実行中に、ユーザが Palm の HotSync ボタンを押します。Palm でのコンテキストが HotSync アプリケーションに切り替わり、PalmExit のコードが実行されます。このコードは、ul_synch_info 構造体に情報を設定し、m_Database.PalmExit を呼び出します。

bool CDemoDB::PalmExit( void )
/****************************/
{
ul_synch_info info;

ULInitSynchInfo( &info );
if( m_ConduitStream == NULL ) {
info.stream = NULL;
info.stream_parms = NULL;
info.user_name = NULL;
info.version = NULL;
} else {
info.stream = m_ConduitStream;
info.stream_parms = m_SynchParms;
info.user_name = m_EmpIDStr;
info.version = SCRIPT_VERSION;
}// A Palm application never really exits. The UltraLite database
// connection is still valid. The GetOrderCursor is still open.
if( ! m_Database.PalmExit( &info ) ) {
return( false );
}

return( true );
}

m_database は、Ultra Light データベースを示すオブジェクトです。したがって、m_database.PalmExit は UL のランタイム・ライブラリに含まれています。m_database.PalmExit は、アップロード・ストリームを同期データベースに書き込みます。修正されたデータがない場合は、ストリームはこのリモートに対応するユーザ名が含まれる空白のメッセージになります。HotSync が Palm で実行されると、Palm に登録されている各コンジットがデータ・ストリームを PC 上の HotSync Manager に送信します。

CustDB 側では、次の処理が行われます。

1) 同期データベースで生成されたアップロード・ストリームを送信します。

2) Palm 上の HotSync が PC 上の HotSync Manager にストリームを送信した後は、アップロード・ストリームは同期データベースから消去されます。

3) PC 上の HotSync Manager がこのストリームを受信すると、dbhsync7.dll (この PC 上で CustDB に登録されているコンジット) にストリームを受け渡します。

4) Dbhsync7.dll は、このデータを Mobile Link Server に受け渡して処理します。

5) アップロード・ストリームが統合データベースに適用されると、Mobile Link Server はダウンロード・ストリームを生成し、dbhsync7.dll に戻します。

6) Dbhsync7.dll は、このダウンロード・ストリームを HotSync Manager に受け渡します。HotSync Manager は、このストリームを Palm に受け渡します。Palm では、このストリームが CustDB 用の同期データベースに書き込まれます。

CustDB にフォーカスが戻ると、PalmLaunch のコードが実行されます。このコードは、m_Database.PalmLaunch を実行します。Ultra Light ランタイムに含まれるこのメソッドは、ダウンロード・ストリームを読み込み、データ格納用データベースに適用します。

7) ダウンロード・ストリームの適用後は、そのストリームは同期データベースから削除されます。同期データベースは、Palm 上で CustDB がアクティブなアプリケーションであるときは、通常は空白になっています。

Palm から HotSync を起動したときに Mobile Link Server が実行中でない場合を考えます。

PalmExit の実行時に、アップロード・ストリームが Palm 上の同期データベースに書き込まれ、最終的に PC 上で実行中の dbhsync7.dll に受け渡されます。ただし、Mobile Link Server が実行されていない、ネットワークが機能していないなどの理由で、dbhsync7.dll が Mobile Link Server を検出できないとします。Dbhsync7.dll は、アップロード・ストリームを処理できないためこれを放棄し、ダウンロード・ストリームを生成します。この場合のダウンロード・ストリームは、Mobile Link Server に接続できないことを示すエラー・メッセージになります。dbhsync7.dll がアップロード・ストリームを放棄していても、アップロード・ストリームの適用に成功したかどうかの確認はダウンロード・ストリームには含まれていないため、次に Palm でアップロード・ストリームが生成されるときにアップロード・ストリームが再送信されます。このストリームは、HotSync Manager に受け渡され、Palm 上の CustDB 用同期データベースに書き込まれます。次に CustDB をアクティブにすると、ダウンロード・ストリームの処理が行われますが、ダウンロード・ストリームはなく、エラー・メッセージだけが存在します。CDemoDB::PalmLaunch のコードは、非常に単純です。

UL_PALM_LAUNCH_RET CDemoDB::PalmLaunch( void )
/********************************************/
{
ul_synch_info info;

ULInitSynchInfo( &info );
info.stream = m_ConduitStream;

return( m_Database.PalmLaunch( &info ) );

}

アプリケーション (CDemoDB) 用の PalmLaunch は、単に Ultra Light のランタイム・ライブラリ内の PalmLaunch を呼び出します。これは、OK ボタン付きのエラー・メッセージを Palm に通知し、false を返します。このとき、同期データベース内のダウンロード・ストリームの消去も行います。つまり、CDemoDB::PalmLaunch のリターン・コードも false になり、アプリケーションは起動しません。

したがって、CDemoDB::PalmExit は呼び出されません。CDemoDB::PalmExit が呼び出されないため、m_Database.PalmExit(&info) が呼び出されず、同期データベースはこの時点では空白になります。

このときに HotSync を Palm で実行すると、CustDB 用のアップロード・ストリームは存在していません。PC 上の HotSync Manager には CustDB 用のアップロード・ストリームが受け渡されないため、dbhsync7.dll には何の情報も受け渡されません。したがって、Mobile Link Server は要求を受信しません。Mobile Link Server が実行中で、リモート側で変更があったとしても、アップロード・ストリームが生成されていないため、同期要求は Mobile Link Server に到達しません。

これは、設計に即した動作です。

問題があるとすれば、CustDB の例での CDemoDB::PalmLaunch が行うエラー処理が単純すぎる点です。これは、アップロード・ストリームを同期データベースに書き込まずにアプリケーションを終了するという、CustDB アプリケーションの設計上の理由によるものです。クライアントがエラーを簡単に見落とすことがないように、クライアントがアプリケーションを再起動する必要がある設計になっています。これは、アプリケーションでのエラー処理としては最適の方法ではないかもしれませんが、設計上の理由によるもので、バグではありません。