フックが呼び出される直前に、dbmlsync は次の CREATE 文を使用してリモート・データベースに #hook_dict テーブルを作成します。テーブル名の前の # は、そのテーブルがテンポラリであることを意味します。
CREATE TABLE #hook_dict( name VARCHAR(128) NOT NULL UNIQUE, value VARCHAR(10240) NOT NULL) |
dbmlsync ユーティリティは #hook_dict テーブルを使用してフック関数に値を渡し、フック関数は #hook_dict テーブルを使用して dbmlsync に値を戻します。
各フックは、パラメータ値を受け取ります。パラメータ値の中には、新しい値を返すように変更できるものがあります。それ以外のものは、読み込み専用です。このテーブルの各ローには、1 つのパラメータの値があります。
たとえば、次の dbmlsync コマンド・ラインでは、sp_hook_dbmlsync_abort フックを呼び出す時点では、#hook_dict テーブルには次のようなローが含まれています。
dbmlsync -c 'dsn=MyDsn' -n pub1,pub2 -u MyUser |
#hook_dict ロー |
値 |
---|---|
publication_0 |
pub1 |
publication_1 |
pub2 |
MobiLink user |
MyUser |
Abort synchronization |
false |
アボート・フックを使用して、#hook_dict テーブルから値を取り出したり、その動作をカスタマイズしたりできます。たとえば、Mobile Link ユーザを取り出すには、次のように SELECT 文を使用します。
SELECT value FROM #hook_dict WHERE name = 'MobiLink user' |
In/out パラメータは、dbmlsync の動作をフックで修正することによって更新できます。たとえば、次のような文を使用してテーブルの abort synchronization ローを更新することで、同期のアボートをフックから dbmlsync に命令することができます。
UPDATE #hook_dict SET value='true' WHERE name='abort synchronization' |
各フックの記述には、#hook_dict テーブルのローがリストされます。
次のサンプル sp_hook_dbmlsync_delay プロシージャは、#hook_dict テーブルを使用して引数を受け渡す様子を示します。このプロシージャでは、Mobile Link システムのスケジュールされたダウン時間 (18:00 ~ 19:00) 以外にのみ同期を行います。
CREATE PROCEDURE sp_hook_dbmlsync_delay() BEGIN DECLARE delay_val integer; SET delay_val=DATEDIFF( second, CURRENT TIME, '19:00'); IF (delay_val>0 AND delay_val<3600) THEN UPDATE #hook_dict SET value=delay_val WHERE name='delay duration'; END IF; END |
次のプロシージャは、同期の開始時にリモート・データベース内で実行されます。現在の Mobile Link ユーザ名 (sp_hook_dbmlsync_begin イベントに使用可能なパラメータの 1 つ) を取り出して、SQL Anywhere のメッセージ・ウィンドウに出力します。
CREATE PROCEDURE sp_hook_dbmlsync_begin() BEGIN DECLARE syncdef VARCHAR(150); SELECT '>>>syncdef = ' || value INTO syncdef FROM #hook_dict WHERE name ='MobiLink user name'; MESSAGE syncdef TYPE INFO TO CONSOLE; END |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |