7.3.3 ダウンロードストリーム
download_cursor
download_cursorは、ダウンロードストリームを作り出すスクリプトである。ここに書かれたSQL文が統合データベース上で実行され、その結果セットがリモートデータベースに返信される(図7.12)。
先の例では、次のようにproductテーブルの全行を取得するSQL文になっている。よって、同期時には、productテーブル全体がリモートデータベースに返信される。
SELECT product_id, quantity FROM product
同期クライアントは、受信した行とリモートデータベース上の行とを(主キーで)比較し、既存の行があれば受信した行で更新し、なければ受信した行を追加する。
カラムによる絞り込み
download_cursorの結果セットにあるカラムだけがダウンロードされる。例ではもともと2つしかカラムがなかったので判別しづらかったが、たとえば、統合データベースのproductテーブルが4つのカラムを持っていて、リモートデータベースのものよりも多いとすると、次のようになる。
- 統合データベース ―― product_id, quantity, product_name, price
- リモートデータベース ―― product_id, quantity
これらを同期するためのdownload_cursorスクリプトのSQLは、次のものでよい。
SELECT product_id, quantity FROM product
行による絞り込み
SELECT文でWHERE条件を追加して、特定のデータだけをダウンロード対象としてもよい。たとえば、在庫数の小さなものだけダウンロードしたいならば、以下のようにする。
SELECT product_id, quantity FROM product WHERE quantity < 100
7.3.4 ダウンロード時のプレースホルダ
アップロード時のスクリプトでは、アップロードされるデータをプレースホルダとして指定できた。一方、ダウンロード時のスクリプトにもプレースホルダがあり、Mobile Linkの機能によって定められた値に置換される。
ダウンロード時のスクリプトでは、3つのプレースホルダが利用可能だ(表7.2)。
プレースホルダの順番 | 内容 |
1番目 | 前回同期成功時刻(ダウンロード時刻) |
2番目 | Mobile Linkユーザ名 |
3番目 | 同期テーブル名 |
Mobile Linkユーザ名を利用する例を見ていこう。ここで各リモートデータベースは、自身のMobile Linkユーザに関連するデータのみを持つとする(※2)。Mobile Linkユーザ名で条件付けすることで、テーブルすべてのデータではなく、リモートデータベース(=Mobile Linkユーザ)ごとに必要なデータを絞り込める。たとえば、統合データベース上に顧客テーブルがあり、Mobile Linkユーザごとに顧客が分かれているとする(図7.11)。
download_cursorスクリプトは、次のようになる。
SELECT CustomerID, CustomerName FROM Customer WHERE ? IS NOT NULL --1つ目のプレースホルダ:最終同期時刻 AND mluser = ? --2つ目のプレースホルダ:Mobile Link ユーザ名
この例では最終同期時刻の値は利用しないのだが、プレースホルダは表の順番通りに置換されるため、2番目の同期ユーザ名を利用するには、1番目のプレースホルダも書いておく必要がある。そこで、NULLと比較するダミーの条件を置いた。
7.3.5 Javaや.NETによる同期ロジック
本書では同期ロジックとしてSQL文やストアドプロシージャを使用するが、Javaや.NETでも同期ロジックを記述できる。Javaや.NETで書く利点としては、言語が持つライブラリを利用して複雑なロジックを構築できる点だ。本書ではコーディングに触れないが、「7.4.6 同期ユーザのカスタマイズ認証」で、外部システムと連携する設定例を紹介する。