...

[DBMoto] スクリプト使用手順

by user

on
Category: Documents
149

views

Report

Comments

Transcript

[DBMoto] スクリプト使用手順
[DBMoto]
スクリプト使用手順
株式会社クライム
作成日: 2015/06/15(月)
更新日: 2015/06/15(月)
バージョン: 1.0
[DBMoto]スクリプト使用手順
目次
1 はじめに.................................................................................................................. 6
1.1 範囲................................................................................................................ 6
1.2 対象バージョン .................................................................................................... 6
1.3 スクリプト・関数・API のサポート範囲に関して ................................................................ 6
2 DBMoto のスクリプトで出来ること ................................................................................... 7
2.1 グローバルスクリプト .............................................................................................. 7
2.2 レプリケーションスクリプト ........................................................................................ 8
2.3 言語切替 .......................................................................................................... 9
3 グローバルスクリプト:イベント ...................................................................................... 10
3.1 GlobalEventsAttribute ................................................................................... 10
3.1.1 文法 ......................................................................................................... 10
3.1.2 パラメータ .................................................................................................... 10
3.2 Record_OnExecuteError ................................................................................ 11
3.2.1 文法 ......................................................................................................... 11
3.2.2 パラメータ .................................................................................................... 12
3.2.3 スクリプト例 .................................................................................................. 13
3.3 Replication_OnError ..................................................................................... 15
3.3.1 文法 ......................................................................................................... 15
3.3.2 パラメータ .................................................................................................... 16
3.3.3 スクリプト例 .................................................................................................. 17
3.4 ReplicationManager_onStart ......................................................................... 18
3.4.1 文法 ......................................................................................................... 18
3.4.2 パラメータ .................................................................................................... 18
3.4.3 スクリプト例 .................................................................................................. 19
3.5 ReplicationManager_onStop .......................................................................... 20
3.5.1 文法 ......................................................................................................... 20
3.5.2 パラメータ .................................................................................................... 20
3.5.3 スクリプト例 .................................................................................................. 20
4 グローバルスクリプト:関数 ......................................................................................... 22
4.1 AddLog (String,enmLogMessageType) ........................................................... 22
4.1.1 文法 ......................................................................................................... 22
4.1.2 パラメータ .................................................................................................... 22
4.1.3 スクリプト例 .................................................................................................. 22
4.2 AddLog (String, enmLogMessageType, Record, enmRecordImage) ............... 23
4.2.1 文法 ......................................................................................................... 23
4.2.2 パラメータ .................................................................................................... 23
4.2.3 スクリプト例 .................................................................................................. 23
4.3 SendMail (subject, body) .............................................................................. 24
4.3.1 文法 ......................................................................................................... 24
4.3.2 パラメータ .................................................................................................... 24
- 2-
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
4.3.3 スクリプト例 .................................................................................................. 24
4.4 SendMail (sSubject, sMessageBody, sSMTPServer, sSMTPPort, sRcptFrom,
sRcptTo, bAuthentication, sUser, sPassword, bUseSSL) ........................................ 25
4.4.1 文法 ......................................................................................................... 25
4.4.2 パラメータ .................................................................................................... 25
4.4.3 スクリプト例 .................................................................................................. 25
4.5 GetRecordInfo(Record, enmRecordImage) .................................................... 26
4.5.1 文法 ......................................................................................................... 26
4.5.2 パラメータ .................................................................................................... 26
4.5.3 スクリプト例 .................................................................................................. 27
4.6 GetReceiversInUse ....................................................................................... 28
4.6.1 文法 ......................................................................................................... 28
4.6.2 パラメータ .................................................................................................... 28
4.6.3 スクリプト例 .................................................................................................. 28
4.6.4 その他 ........................................................................................................ 29
5 レプリケーションスクリプト:イベント ................................................................................ 30
5.1 LogReader_onPrepareMirroring .................................................................... 30
5.1.1 文法 ......................................................................................................... 30
5.1.2 パラメータ .................................................................................................... 30
5.1.3 スクリプト例 .................................................................................................. 30
5.2 LogReader_onBeforeMirroring ...................................................................... 31
5.2.1 文法 ......................................................................................................... 31
5.2.2 パラメータ .................................................................................................... 31
5.2.3 スクリプト例 .................................................................................................. 31
5.3 LogReader_onAfterMirroring ......................................................................... 32
5.3.1 文法 ......................................................................................................... 32
5.3.2 パラメータ .................................................................................................... 32
5.3.3 スクリプト例 .................................................................................................. 32
5.4 LogReader_onReceiverChanged .................................................................... 33
5.4.1 文法 ......................................................................................................... 33
5.4.2 パラメータ .................................................................................................... 33
5.4.3 文法 ......................................................................................................... 33
5.5 Record_onBeforeMapping ............................................................................. 34
5.5.1 文法 ......................................................................................................... 34
5.5.2 パラメータ .................................................................................................... 34
5.5.3 スクリプト例 .................................................................................................. 34
5.6 Record_onAfterMapping ............................................................................... 36
5.6.1 文法 ......................................................................................................... 36
5.6.2 パラメータ .................................................................................................... 36
5.6.3 スクリプト実例 ............................................................................................... 36
5.7 Record_onBeforeExecute .............................................................................. 37
5.7.1 文法 ......................................................................................................... 37
- 3-
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
5.7.2 パラメータ .................................................................................................... 37
5.7.3 スクリプト例 .................................................................................................. 38
5.8 Record_onAfterExecute ................................................................................ 39
5.8.1 文法 ......................................................................................................... 39
5.8.2 パラメータ .................................................................................................... 39
5.8.3 スクリプト例 .................................................................................................. 39
5.9 Refresh_onBeforeTruncate ............................................................................ 40
5.9.1 文法 ......................................................................................................... 40
5.9.2 パラメータ .................................................................................................... 40
5.9.3 スクリプト例 .................................................................................................. 40
5.10 Refresh_onAfterTruncate ............................................................................ 41
5.10.1 文法........................................................................................................ 41
5.10.2 パラメータ ................................................................................................... 41
5.10.3 スクリプト例................................................................................................. 41
5.11 Refresh_onPrepareRefresh ......................................................................... 42
5.11.1 文法........................................................................................................ 42
5.11.2 パラメータ ................................................................................................... 42
5.11.3 スクリプト例................................................................................................. 42
5.12 Refresh_onBeforeRefresh ........................................................................... 44
5.12.1 文法........................................................................................................ 44
5.12.2 パラメータ ................................................................................................... 44
5.12.3 スクリプト例................................................................................................. 45
5.13 Refresh_onAfterRefresh .............................................................................. 45
5.13.1 文法........................................................................................................ 45
5.13.2 パラメータ ................................................................................................... 45
5.13.3 スクリプト例................................................................................................. 45
5.14 Replication_onConflict ................................................................................ 46
5.14.1 文法........................................................................................................ 46
5.14.2 パラメータ ................................................................................................... 46
5.14.3 スクリプト例................................................................................................. 46
6 レプリケーションスクリプト:プロパティ .............................................................................. 47
6.1 SourceConnection ......................................................................................... 47
6.1.1 同期用ロックスクリプト例 .................................................................................... 47
6.1.2 文法 ......................................................................................................... 49
6.1.3 スクリプト例 .................................................................................................. 49
6.2 InternalSourceConnection............................................................................. 50
6.2.1 文法 ......................................................................................................... 50
6.2.2 スクリプト例 .................................................................................................. 50
6.3 SourceConnectionName ................................................................................ 52
6.3.1 文法 ......................................................................................................... 52
6.4 SourceTableName ......................................................................................... 52
6.4.1 文法 ......................................................................................................... 52
- 4-
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
6.5 TargetConnection.......................................................................................... 53
6.5.1 文法 ......................................................................................................... 53
6.5.2 スクリプト例 .................................................................................................. 53
6.6 InternalTargetConnection ............................................................................. 54
6.6.1 文法 ......................................................................................................... 54
6.6.2 スクリプト例 .................................................................................................. 54
6.7 TargetConnectionName ................................................................................. 54
6.7.1 文法 ......................................................................................................... 54
6.8 TargetTableName .......................................................................................... 55
6.8.1 文法 ......................................................................................................... 55
6.9 GroupName .................................................................................................. 55
6.9.1 文法 ......................................................................................................... 55
6.10 ReplicationName......................................................................................... 55
6.10.1 文法........................................................................................................ 55
7 更新履歴 .............................................................................................................. 56
- 5-
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
1 はじめに

本ドキュメントに記載されたイラスト、写真、文章の一部またはすべてを無断で複製、転載することを禁止します。

本ドキュメントは製品を購入されたお客様、評価版をご使用のお客様向けに株式会社クライムが提供しております。
1.1 範囲
本ドキュメントは、DBMoto にて C#や VB のスクリプト使用手順について記載しております。
スクリプトを使用することで通常のレプリケーション以外にも様々なカスタマイズが可能となります。
1.2 対象バージョン
本ドキュメントは、以下の製品のバージョンに対応しております。

DBMoto 8 以降
1.3 スクリプト・関数・API のサポート範囲に関して
スクリプト・関数・API はレプリケーションや設定運用の補助的な機能として提供しています。これらはお客様責任にてご
使用いただきますようお願いいたします。サポートに関しては下記の通りとなります。
<サポート対象>
○実現可否の調査
○サンプルの提供
<サポート範囲外>
×コーディング方法
×動作・パフォーマンス検証
- 6-
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
2 DBMoto のスクリプトで出来ること
DBMoto は標準でのレプリケーションに加え、スクリプトを使用することでさらに柔軟なレプリケーションを行ったり、設定運
用を補助することが可能です。
2.1 グローバルスクリプト
DBMoto 起動や停止、エラーの通知など全体に関係する部分へのスクリプトの適用や 2、3 で作成するような関数をグ
ローバルスクリプトに記述しておくことで共有の関数として利用することも可能です。

ログの記述に関する追加スクリプト

メール送信に関するスクリプト

IBM DB2 for i(AS/400)をソースとして使用している場合のレシーバ使用確認

各エラー発生時の追加スクリプト

レプリケーションマネージャ起動・停止に関する追加スクリプト

ソース、ターゲット間の自動マッピングの独自スクリプト

レプリケーション対象外のデータベースからの値取得

共通関数の作成
グローバルスクリプト画面は下記の手順で起動可能です。
1. メタデータエクスプローラ内のグローバルスクリプトアイコンをクリックします。
2. グローバルスクリプトの編集画面が開きます。
- 7-
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
2.2 レプリケーションスクリプト
各レプリケーション内で発生するイベントに対してスクリプトを記述できます。

リフレッシュ時のイベント:レコード削除前後、リフレッシュ前後等

ログ読み込みのイベント:待機状態、ログ読み込み前後、ログに変更があった場合

レプリケーション対象のレコードに関するイベント:レコード対応付け前後、レプリケーション実施前後

レプリケーション時のイベント:レプリケーション内でのエラー、コンフリクト(衝突)発生前後
レプリケーションスクリプト画面は下記の手順で起動可能です。
1. レプリケーション名を右クリックし、「プロパティ」を選択します。
2. 「スクリプトを使用」にチェックを入れ、「スクリプト」ボタンをクリックします。
- 8-
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
3. レプリケーションスクリプトの編集画面が開きます。
2.3 言語切替
DBMoto のスクリプトや関数は C#と VB に対応しております。
デフォルトでは C#ですが VB へ切り替えることも可能です。
ただし、同一メタデータ内にて C#と VB を共存させることはできません。
言語はグローバルスクリプト、レプリケーションスクリプト、及び関数すべてにおいて共通となります。
言語切替はグローバルスクリプトの編集画面にて行えます。
- 9-
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
3 グローバルスクリプト:イベント
レプリケーション中に発生したイベントに対するスクリプトを、複数のレプリケーションに適用したい場合は、グローバルスクリ
プトの GlobalEvents クラスに対象となるイベントハンドラを設定する必要があります。
イベントハンドラを作れば、レプリケーションごとに当該スクリプトを都度埋め込まずに、ハンドラ関数を呼び出すだけで簡
単に同じ結果をもたらします。
すべてのイベントハンドラには、GlobalEventsAttribute という属性セクションを持っている必要があります。
3.1 GlobalEventsAttribute
イベント名と補助文字列という 2 つのパラメータを持った属性です。
この属性は Record_OnExecuteError と Replication_OnError イベント用のエラーハンドラを定義したときに常に
宣言している必要があります。
3.1.1 文法
<GlobalEventsAttribute("Record_OnExecuteError", "Define a general event for the event
OnExecuteError")>
3.1.2 パラメータ
パラメータ 1:
必須です。イベント名を含んだ文字列で、値はハンドルされているイベントの名前と一致させる必要があります。
パラメータ 2:
必須です。イベントハンドラへの説明文またはヘルプメッセージを含む文字列です。この文字列は DBMoto では現在使
用されていませんが、以前のバージョンとの互換性維持が理由でパラメータは必須となっているため、最低でも空白文字
列" "を入力する必要があります。
- 10 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
3.2 Record_OnExecuteError
このイベントは、単一のレコード操作時にエラーが発生したときに実行されます。
INSERT や、DELETE、UPDATE といったターゲットデータベースへの操作時に発生する Writer イベントです。
bRetryExecute オプションを使うことで、操作が失敗したときにレコード上で実施していた操作をリトライするように設定
できます。
例えば、単一のレコードインサートがタイムアウトエラーで失敗したときに、bRetryExecute を True に設定し、iSleep
の値とイテレーションパラメータを設定することで、操作を再実行して成功させるようにできます。
このパラメータを使ってレコード操作を再実施した回数にかかわらず、このレプリケーションイベント
Record_onBeforeExecute が生成されるのは1度のみであることに注意してください。また、レプリケーションイベント
Record_onAfterExecute はレコード操作に成功したときのみに1度生成され、レコード操作に失敗したときはまった
く生成されないことに注意してください。
GlobalEventsAttribute の最初のパラメータはイベント名”Record_OnExecuteError”を表している必要がありま
す。
3.2.1 文法
VB.NET
<GlobalEventsAttribute("Record_OnExecuteError", "Define a general event for the event
OnExecuteError")>
Public Shared Sub MyErrorHandler (ByVal sReplOrGroupName As String,
ByVal recTarget As DBMotoPublic.IRecord,
ByVal e As Exception,
ByRef bRetryExecute As Boolean,
ByRef iSleep As Integer,
ByVal iIteration As Integer)
Note: 関数名'MyErrorHandler'は変更可能です。
C#
[GlobalEventsAttribute("Record_OnExecuteError", "Define a general event for the event
OnExecuteError")]
public static void MyErrorHandler(string sReplOrGroupName, DBMotoPublic.IRecord recTarget,
Exception e, ref bool bRetryExecute, ref int iSleep, int iIteration)
- 11 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
3.2.2 パラメータ
パラメータ名
型
説明
sReplOrGroupName
String
読み込みのみ。イベントが生成されたグループまたはレプリケーシ
ョン名。
recTarget
IRecord
読み込みのみ。エラーが生成された箇所のターゲットレコードを
表すオブジェクト。IRecord インターフェースにて利用可能なメソ
ッドを使い、レコードの特定の情報にアクセスできます。
e
Exception
読み込みのみ。このエラーの VB .NET 例外オブジェクト。
bRetryExecute
Boolean
デフォルトの値は false。
このパラメータを true に設定すると、DBMoto ログ上でエラーが
記録される前に再度ターゲットレコード操作を行います。
例えば、単一のレコードインサートがタイムアウトエラーで失敗し
たときに、bRetryExecute を true に設定し、iSleep パラメー
タの値を設定することで、操作を再実行して成功させるようにで
きます。
スクリプト例ではこのパラメータの使用方法を示しています。
このパラメータを使ってレコード操作を再実施した回数にかかわら
ず、レプリケーションイベント Record_OnBeforeExecute が
生成されるのは1度のみであることに注意してください。また、レ
プリケーションイベント Record_OnAfterExecute はレコード
操作に成功したときのみに1度生成され、レコード操作に失敗
したときはまったく生成されないことに注意してください。
iSleep
Integer
bRetryExecute が true のとき、このパラメータを使うことで操
作の再実行を行う前の遅延値を指定できます。単位はミリ秒で
す。デフォルト値は 0 です。下記サンプルでこのパラメータの使用
方法が確認できます。
iteration
Integer
読み込みのみ。bRetryExecute パラメータとの併用で使用さ
れます。これは、ターゲットレコード操作が試みられた回数を記
録しています。
開始の値は 0 です。ターゲットレコード操作が最初に試みられた
とき、この値は 1 に設定されます。
イベントハンドラは bRetryExecute が false になるまで操作の
繰り返しを継続します。スクリプト例ではエラーによる無限ループ
を回避する方法を示しています。
- 12 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
3.2.3 スクリプト例
VB.NET
<GlobalEventsAttribute("Record_OnExecuteError", "Define a general event for the event
EventName")> _
Public Shared Sub MyErrorHandler (ByVal sReplOrGroupName As String,
ByVal recTarget As DBMotoPublic.IRecord,
ByVal e As Exception,
ByRef bRetryExecute As Boolean,
ByRef iSleep As Integer,
ByVal iIteration As Integer)
Dim s As String
s = s + "-- Called MyErrorHandler to catch the error in replication or group '" +
sReplOrGroupName + "'" + Environment.NewLine
s = s + "-- Exception: " + e.ToString() + Environment.NewLine
s = s + "-- Iteration: " + iIteration.ToString()
bRetryExecute = False
If iIteration >= 3 Then
bRetryExecute = False
s = s + " - No Retry"
Else
bRetryExecute = True
iSleep = 3000
s = s + " - Try Again after " + (iSleep/1000).ToString() + " seconds."
End If
IGlobalScript.AddLog (s, 1)
End Sub
- 13 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
C#
public class GlobalEvents : IGlobalEvents
{
/// <param name="sReplOrGroupName"></param>
/// <param name="recTarget"></param>
/// <param name="e"></param>
/// <param name="bRetryExecute"></param>
/// <param name="iSleep"></param>
/// <param name="iIteration"></param>
[GlobalEventsAttribute("Record_OnExecuteError", "Define a general event for the event
EventName")]
public void MyErrorHandler(String sReplOrGroupName, DBMotoPublic.IRecord recTarget,
Exception e, ref Boolean bRetryExecute, ref int iSleep, int iIteration)
{
String s = null;
s = s + "-- Called MyErrorHandler to catch the error in replication or group '" +
sReplOrGroupName + "'" + Environment.NewLine;
s = s + "-- Exception: " + e.ToString() + Environment.NewLine;
s = s + "-- Iteration: " + iIteration.ToString();
bRetryExecute = false;
if (iIteration >= 3)
{
bRetryExecute = false;
s = s + " - No Retry";
}
else
{
bRetryExecute = true;
iSleep = 3000;
s = s + " - Try Again after " + (iSleep / 1000).ToString() + " seconds.";
IGlobalScript.AddLog(s, 1);
}
}
- 14 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
3.3 Replication_OnError
このイベントはレプリケーションでエラーが起きたときに発生します。
レプリケーション操作の最後に、エラーや警告アイコンとして DBMoto Replication Monitor で表示されたエラーであ
ればこのイベントを生成します。
このイベントは、エラー発生の瞬間ではなく、リフレッシュの最後やミラーリングインターバルの最後に発生します。
GlobalEventsAttribute の最初のパラメータはイベント名”Replication_OnError”を表している必要があります。
3.3.1 文法
VB.NET
<GlobalEventsAttribute("Replication_OnError", "Define a general event for the event
Replication_OnError")>
Public Shared Sub MyErrorHandler (ByVal sReplOrGroupName As String, ByVal sMessage As
String,
ByVal
bWillDisable
As
Boolean,
ByVal
eReplStatus
As
enmReplStatus)
Note: 関数名'MyErrorHandler'は変更可能です。
C#
[GlobalEventsAttribute("Record_OnExecuteError", "Define a general event for the event
Replication_OnError")]
public
static
void
MyErrorHandler(string
sReplOrGroupName,
string
sMessage,
bool
bWillDisable, enmReplStatus eReplStatus)
- 15 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
3.3.2 パラメータ
パラメータ名
型
説明
sReplOrGroupName
String
読み込みのみ。イベントが生成されたグループまたはレプリ
ケーション名。
sMessage
String
読み込みのみ。エラーメッセージまたは例外スタック。
bWillDisable
Boolean
読み込みのみ。
True だと、エラー発生時にレプリケーションを無効にしま
す。
eReplStatus
enmReplStatus
読み込みのみ。イベントが enmReplStatus 列挙子を
使用して呼びされたとき、レプリケーションステータスを示し
ます。
取りうる値は以下の通りです。

ErrorAndContinue
レプリケーション中にエラーが発生したが、レプリケーショ
ンは継続可能な場合に表示されます。
たとえば、ターゲットテーブルにレコードが見つからず、タ
ーゲットレコードの削除に失敗したときです。
この場合、DBMoto はエラーをログに報告しますが次
のレコードを継続して処理します。

Error
エラーが生成され、レプリケーションが停止しています。
レプリケーションは次のインターバルで再度実行されま
す。
このタイプのエラーの例としては、ソースまたはターゲット
データベースへの接続が破損した場合です。
このような場合、DBMoto はレプリケーションを継続で
きず、リカバリモードに入ります。

Success
こ の イ ベ ン ト で は 使 わ れ ま せ ん 。 こ の
Replication_OnError が呼ばれるときは、レプリケー
ションは常にエラー状態だからです。
- 16 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
3.3.3 スクリプト例
VB.NET
<GlobalEventsAttribute("Replication_OnError", "General event for the event OnError")> _
Public Shared Sub MyGlobalEvent (ByVal sReplicationName As String, ByVal sMessage As
String,
ByVal bWillBeDisabled As Boolean, ByVal eReplStatus As enmReplStatus)
Dim s As String
s = DateTime.Now.ToString() + Environment.NewLine + Environment.NewLine
s = s + "Error in replication '" + sReplicationName + "'" + Environment.NewLine +
Environment.NewLine
s = s + "Replication Status: " + eReplStatus.ToString() + Environment.NewLine +
Environment.NewLine
s = s + sMessage + Environment.NewLine + Environment.NewLine
If bWillBeDisabled Then
s = s + "The replication will be disabled." + Environment.NewLine + Environment.NewLine
End If
s = s + "-----------------------------------------------------------------" + Environment.NewLine
s = s + " This is an automatic message generated by the DBMoto script"
+
Environment.NewLine
s = s + "-----------------------------------------------------------------" + Environment.NewLine
IGlobalScript.SendMail ("DBMoto Error", s)
End Sub
C#
/// <param name="sReplicationName"></param>
/// <param name="sMessage"></param>
/// <param name="bWillBeDisabled"></param>
/// <param name="eReplStatus"></param>
[GlobalEventsAttribute("Replication_OnError", "General event for the event OnError")]
public
void
MyGlobalEvent(String
sReplicationName,
String
sMessage,
Boolean
bWillBeDisabled, enmReplStatus eReplStatus)
{
String s = null;
s = DateTime.Now.ToString() + Environment.NewLine + Environment.NewLine;
s = s + "Error in replication '" + sReplicationName + "'" + Environment.NewLine +
Environment.NewLine;
s = s + "Replication Status: " + eReplStatus.ToString() + Environment.NewLine +
Environment.NewLine;
s = s + sMessage + Environment.NewLine + Environment.NewLine;
if (bWillBeDisabled)
{
- 17 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
s
=
s
+
"The
replication
will
be
disabled."
+
Environment.NewLine
+
Environment.NewLine;
}
s = s + "---------------------------------------------" + Environment.NewLine;
s = s + " This automatic message is generated by the DBMoto script" +
Environment.NewLine;
s = s + "---------------------------------------------" + Environment.NewLine;
IGlobalScript.SendMail("DBMoto Error", s);
}
3.4 ReplicationManager_onStart
このイベントは Data Replicator が開始されたときに発生します。DBMoto ログに通知メッセージを追加するときや、管
理者に e メールを送信するときに使用できます。
イベント用のハンドラを書き込むには、クラスヘッダ"Public Class GlobalEvents : Inherits IGlobalEvents"の内
側にカーソルを配置し、以下の例を使いハンドラを定義できます。
GlobalEventsAttribute の最初のパラメータはイベント名"ReplicationManager_OnStart"を表します。
3.4.1 文法
VB.NET
<GlobalEventsAttribute("ReplicationManager_OnStart",
"Standard
event
for
the
event
for
the
event
OnStart")> _
Public Shared Sub OnStart ()
C# 文法
[GlobalEventsAttribute("ReplicationManager_OnStart",
"Standard
event
OnStart")]
public static void OnStart()
3.4.2 パラメータ
ありません。
- 18 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
3.4.3 スクリプト例
VB.NET
<GlobalEventsAttribute("ReplicationManager_OnStart",
"Standard
event
for
the
event
OnStart")> _
Public Shared Sub OnStart ()
Dim s As String
s = s + "-- Message from DBMoto - START"
s = s + "-----------------------------------------------------------------" + Environment.NewLine
s = s + "-
This is an automatic message generated by the DBMoto script
-" +
Environment.NewLine
s
=
s
+
Environment.NewLine
"-----------------------------------------------------------------"
+
IGlobalScript.SendMail ("DBMoto Replication Manager Message",
s)
End Sub
C#
[GlobalEventsAttribute("ReplicationManager_OnStart",
"Standard
event
for
the
event
OnStart")]
public void OnStart()
{
String s = null;
s = s + "-- Message from DBMoto - START";
s = s + "-------------------------------------------------------" + Environment.NewLine;
s = s + "-
This is an automatic message generated by the DBMoto script
-" +
Environment.NewLine;
s = s + "-------------------------------------------------------" + Environment.NewLine;
IGlobalScript.SendMail("DBMoto Replication Manager Message", s);
}
- 19 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
3.5 ReplicationManager_onStop
このイベントは Data Replicator が開始されたときに発生します。DBMoto ログに通知メッセージを追加するときや、管
理者に e メールを送信するときに使用できます。
イベント用のハンドラを書き込むには、クラスヘッダ"Public Class GlobalEvents : Inherits IGlobalEvents"の内
側にカーソルを配置し、以下の例を使いハンドラを定義できます。
GlobalEventsAttribute の最初のパラメータはイベント名"ReplicationManager_OnStop"を表します。
3.5.1 文法
VB.NET
<GlobalEventsAttribute("ReplicationManager_OnStop",
"Standard
event
for
the
event
OnStop")> _
Public Shared Sub OnStop ()
C#
[GlobalEventsAttribute("ReplicationManager_OnStop", "Standard event for the event OnStop")]
public static void OnStop()
3.5.2 パラメータ
ありません。
3.5.3 スクリプト例
VB.NET
<GlobalEventsAttribute("ReplicationManager_OnStop",
"Standard
event
for
the
event
OnStop")> _
Public Shared Sub OnStop ()
Dim s As String
s = s + "-- Message from DBMoto - STOP"
s = s + "---------------------------------------------------------" + Environment.NewLine
s = s + "-
This is an automatic message generated by the DBMoto script
-" +
Environment.NewLine
s = s + "--------------------------------------------------------" + Environment.NewLine
IGlobalScript.SendMail ("DBMoto Replication Manager Message", s)
End Sub
- 20 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
C#
[GlobalEventsAttribute("ReplicationManager_OnStop", "Standard event for the event OnStop")]
public void OnStop()
{
String s = null;
s = s + "-- Message from DBMoto - STOP";
s = s + "--------------------------------------------------------" + Environment.NewLine;
s = s + "-
This is an automatic message generated by the DBMoto script
-" +
Environment.NewLine;
s = s + "---------------------------------------------------------" + Environment.NewLine;
IGlobalScript.SendMail("DBMoto Replication Manager Message", s);
}
- 21 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
4 グローバルスクリプト:関数
グローバルスクリプトで使用する DBMoto グローバル関数を以下で説明します。もしこれらの関数をグローバルスクリプト
イベントで使用したい場合、IGlobalScript クラスで呼び出してください。(例:IGlobalScript.AddLog)
4.1 AddLog (String,enmLogMessageType)
注意:この機能は AddLog (str As String,eType As Integer)の置き換えとなります。
任意のログメッセージを DBMoto ログファイル上に記します。
4.1.1 文法
VB.NET
Public Shared Sub AddLog (str As String, eType As enmLogMessageType)
C#
public static void AddLog(string str, enmLogMessageType eType)
4.1.2 パラメータ
Str = ログに残すメッセージ
eType = 次の値をとります。情報=0, 警告 = 1 ,エラー = 2
4.1.3 スクリプト例
VB.NET
AddLog ("The current record has been inserted", 0)
C#
AddLog("The current record has been inserted", 0)
- 22 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
4.2 AddLog (String, enmLogMessageType, Record, enmRecordImage)
注意:この機能は AddLog (String,Int,Record,enmRecordImage)の置き換えとなります。
任意のレコード情報を含むログメッセージを DBMoto ログファイル上に記します。
4.2.1 文法
VB.NET
Public Shared Sub AddLog (str As String, eType As enmLogMessageType, record As
DBMotoPublic.IRecord, eRecordImage As enmRecordImage)
C#
public static void AddLog(string str, enmLogMessageType eType, DBMotoPublic.IRecord record,
enmRecordImage eRecordImage)
4.2.2 パラメータ
Str = ログに残すメッセージ
eType = 次の値をとります。情報=0, 警告 = 1 ,エラー = 2
record = メッセージと同時に書かれる IRecord オブジェクト
eRecordImage = レコードプリントの型用の enmRecordImage が必要です。レコードイメージは、INSERT 操作
のときには、操作後のレコードの値を、それ以外では操作前のレコードの値を使用します。パラメータは 1,2,4 の値をとり
ます。
1 = キーバリュー – プライマリキーカラムの値のみを記します。
2 = イメージ- レコードの全体のイメージを記します。
4 = ログ情報 – ログ情報を記します。(トランザクション ID, トランザクションタイムスタンプ)
4.2.3 スクリプト例
VB.NET
Public Overrides Sub Record_onAfterMapping(recSource As IRecord, recTarget As IRecord,
ByRef AbortRecord As Boolean)
Dim S as String
AddLog("The current record has been inserted", 0, recSource, 4)
End Sub
- 23 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
4.3 SendMail (subject, body)
Data Replication オプションダイアログのメールタブにて設定した SMTP サーバを使用してメールを送信します。
4.3.1 文法
VB.NET
Public Shared Sub SendMail (sSubject As String, sMessageBody As String)
C#
public static void SendMail(string sSubject, string sMessageBody)
4.3.2 パラメータ
sSubject = メールの件名
sMessageBody = メール本文
sRcptTo = 追加での受信者アドレス
4.3.3 スクリプト例
VB.NET
SendMail ("Message from DBMoto", "An error occurred that requires intervention by the
system administrator.", "[email protected]")
C#
SendMail("Message from DBMoto", "An error occurred that requires intervention by the system
administrator.", "[email protected]")
- 24 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
4.4 SendMail (sSubject, sMessageBody, sSMTPServer, sSMTPPort, sRcptFrom, sRcptTo,
bAuthentication, sUser, sPassword, bUseSSL)
関数が呼び出されたとき、設定されたパラメータを使ってメールを送付します。
パラメータが使用できないとき、Data Replicator オプションダイアログにおけるメール設定が代わりに使用されます。
4.4.1 文法
VB.NET
Public Shared Sub SendMail (sSubject As String, sMessageBody As String, sSMTPServer As
String, sRcptFrom As String, sRcptTo As String)
C#
public static void SendMail(string sSubject, string sMessageBody, string sSMTPServer, string
sRcptFrom, string sRcptTo)
4.4.2 パラメータ
sSubject = メールの件名
sMessageBody = メールの本文
sSMTPServer = メール送信に使用する SMTP サーバ
sSMTPPort = メール送信に使用する SMTP サーバのポート
sRcptFrom = 送信元として表示するメールアドレス
sRcptTo = 送信先のメールアドレス
bAuthentication = 認証情報が必要であれば True にします。
sUser = bAuthentication が True のとき、ユーザ ID を入力します。
sPassword = bAuthentication が True のとき、パスワードを入力します。
bUseSSL = メール暗号化に SSL を使用するとき、True にします。
4.4.3 スクリプト例
VB.NET
SendMail ("Message from DBMoto", "An error occurred that requires intervention by the
system
administrator.",
"www.smtp.com",
"DBMoto
Notification
Agent",
"[email protected]")
C#
SendMail("Message from DBMoto", "An error occurred that requires intervention by the system
administrator.", "www.smtp.com", "DBMoto Notification Agent", "[email protected]")
- 25 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
4.5 GetRecordInfo(Record, enmRecordImage)
レコードについてフォーマットされた情報を含む文字列を返します。
4.5.1 文法
VB.NET
Public Shared Function GetRecordInfo (record As DBMotoPublic.IRecord, eRecordImage As
enmRecordImage) As String
C#
public
static
string
GetRecordInfo(DBMotoPublic.IRecord
record,
enmRecordImage
eRecordImage)
4.5.2 パラメータ
record = メッセージとともに記録される IRecord オブジェクト
eRecordImage = レコードプリントの型用の enmRecordImage が必要です。レコードイメージは、INSERT 操作
のときには、操作後のレコードの値を、それ以外では操作前のレコードの値を使用します。パラメータは 1,2,4 の値をとり
ます。
1 = キーバリュー – プライマリキーカラムの値のみを記します。
2 = イメージ- レコードの全体のイメージを記します。
4 = ログ情報 – ログ情報を記します。(トランザクション ID, トランザクションタイムスタンプ)
- 26 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
4.5.3 スクリプト例
VB.NET
Imports Microsoft.VisualBasic
Imports DBMotoPublic
Imports DBMotoScript
Imports DBRS.GlobalScript
Namespace DBRS
Public Class ReplicationScript : Inherits IReplicationScript
Public Overrides Sub Record_onAfterMapping(recSource As IRecord, recTarget As
IRecord,
ByRef AbortRecord As Boolean)
Dim S as String = GetRecordInfo(recSource, enmRecordImage.KeyValues)
AddLog("The current record has been inserted: " + S, 0)
End Sub
End Class
End Namespace
C#
using System;
using System.Data;
using DBMotoPublic;
using DBMotoScript;
namespace DBRS
{
public class ReplicationScript : IReplicationScript
{
public
override
void
Record_onAfterMapping(DBMotoPublic.IRecord
recSource,
DBMotoPublic.IRecord recTarget, ref bool AbortRecord)
{
string s = GlobalScript.GetRecordInfo(recSource, enmRecordImage.KeyValues);
GlobalScript.AddLog("The current record has been inserted: " + s, 0);
}
}
}
- 27 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
4.6 GetReceiversInUse
DBMoto 接続においてレプリケーションにより ReceiversInfo オブジェクトとして使用されるレシーバの一覧を返します。
ReceiverInfo クラスの定義は以下の通りです。この機能を使う上で、より詳しい情報は Writing a Script to
Determine Receiver Use.をご覧ください。
4.6.1 文法
VB.NET
Public Shared Function GetReceiversInUse (ConnectionName As String, IsSource As Boolean,
OnlyActiveReplications As Boolean) As ReceiverInfo()
C#
public static ReceiverInfo[] GetReceiversInUse(string ConnectionName, bool IsSource, bool
OnlyActiveReplications)
4.6.2 パラメータ
ConnectionName = 使用中のレシーバ情報を取得する、IBM DB2 for i 接続の名前
IsSource = ConnectionName がソース接続を参照しているときは True、その他は False。
OnlyActiveReplications = True であれば、有効なレプリケーションで使われているレシーバのみを取得し、無効な
レプリケーションのものは無視します。
4.6.3 スクリプト例
VB.NET
Imports Microsoft.VisualBasic
Imports DBMotoPublic
Imports DBMotoScript
Imports DBRS.GlobalScript
Imports System.Data
Namespace DBRS
Public Class ReplicationScript : Inherits IReplicationScript
Public Overrides Sub LogReader_onBeforeMirroring(bSource as Boolean)
Dim arrReceivers As ReceiverInfo() = GetReceiversInUse ("AS400", True, True)
Dim recInfo As ReceiverInfo
For Each recInfo in arrReceivers
AddLog("Receiver in use: " + recInfo.JournalLibrary + "." + recInfo.JournalName
+ "/"
+ recInfo.ReceiverLibrary + "." + recInfo.ReceiverName, 0)
- 28 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
Next
End Sub
End Class
End Namespace
C#
using System;
using System.Data;
using DBMotoPublic;
using DBMotoScript;
namespace DBRS
{
public class ReplicationScript : IReplicationScript
{
public override void LogReader_onBeforeMirroring(bool bSource)
{
ReceiverInfo[] arrReceivers = GlobalScript.GetReceiversInUse("AS400", true, true);
foreach (ReceiverInfo recInfo in arrReceivers)
{
GlobalScript.AddLog("Receiver in use: " + recInfo.JournalLibrary + "." +
recInfo.JournalName + "/" + recInfo.ReceiverLibrary + "." + recInfo.ReceiverName, 0);
}
}
}
}
4.6.4 その他
この関数は ReceiverInfo 型の値を戻します。クラス定義は以下の通りです。
Public Class ReceiverInfo
Public JournalLibrary As String
Public JournalName As String
Public ReceiverLibrary As String
Public ReceiverName As String
End Class
- 29 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
5 レプリケーションスクリプト:イベント
5.1 LogReader_onPrepareMirroring
このイベントはミラーリング操作が行われる前に発生します。ミラーリングのキャンセルや、ミラーリング開始時刻の記録とい
った操作が可能となります。
5.1.1 文法
VB.NET
Public Overrides Sub LogReader_onPrepareMirroring(ByRef CancelMirroring As Boolean)
C#
public override void LogReader_onPrepareMirroring(ref bool CancelMirroring)
5.1.2 パラメータ
CancelMirroring : イベントを発火させたミラーリング操作をキャンセルさせることができるフラグ。デフォルト値は False
です。True に設定するとミラーリングをキャンセルできる。
5.1.3 スクリプト例
VB.NET
Public Overrides Sub LogReader_onPrepareMirroring(ByRef CancelMirroring As Boolean)
Dim bNeedCancel As Boolean
' TODO:
' ミラーリングをキャンセルする必要のあるレコードに適用する条件を入力します。
' そして条件一致時に bNeedCancel 変数に対し True を代入してください。
If bNeedCancel Then
CancelMirroring = True
End If
End Sub
C#
public override void LogReader_onPrepareMirroring(ref bool CancelMirroring)
{
bool bNeedCancel = false;
// TODO:
// ミラーリングをキャンセルする必要のあるレコードに適用する条件を入力します。
// そして条件一致時に bNeedCancel 変数に対し True を代入してください。
if (bNeedCancel) {
- 30 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
CancelMirroring = true;
}
}
5.2 LogReader_onBeforeMirroring
このイベントはデータベーストランザクションログにアクセスしている、ミラーリングまたはシンクロナイゼーションレプリケーション
を定義したときに利用可能です。
イベントはトランザクションログを読み込む直前に発生します。
5.2.1 文法
VB.NET
Public Overrides Sub LogReader_onBeforeMirroring (ByVal bSource As Boolean)
C#
public override void LogReader_onBeforeMirroring(bool bSource)
5.2.2 パラメータ
bSource : True に設定したとき、イベントはソース接続に関連します。False に設定したとき、イベントはターゲット接
続と関連します。
5.2.3 スクリプト例
VB.NET
Public Overrides Sub LogReader_onBeforeMirroring(bSource As Boolean)
AddLog("BeforeMirroring", 0)
End Sub
C#
public override void LogReader_onBeforeMirroring(bool bSource)
{
GlobalScript.AddLog("BeforeMirroring", 0);
}
- 31 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
5.3 LogReader_onAfterMirroring
このイベントはデータベーストランザクションログにアクセスしている、ミラーリングまたはシンクロナイゼーションンレプリケーショ
ンを定義したときに利用可能です。
イベントはトランザクションログを読み込んだ直後に発生します。
5.3.1 文法
VB.NET
Public Overrides Sub LogReader_onAfterMirroring (ByVal bSource As Boolean)
C#
public override void LogReader_onAfterMirroring(bool bSource)
5.3.2 パラメータ
bSource : True に設定したとき、イベントはソース接続に関連します。False に設定したとき、イベントはターゲットと結
びつきます。
5.3.3 スクリプト例
VB.NET
Public Overrides Sub LogReader_onAfterMirroring(bSource As Boolean)
AddLog("AfterMirroring", 0)
End Sub
C#
public override void LogReader_onAfterMirroring(bool bSource)
{
GlobalScript.AddLog("AfterMirroring", 0);
}
- 32 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
5.4 LogReader_onReceiverChanged
このイベントは、DB2 ジャーナルにアクセスする、DB2/400 からのミラーリングまたはシンクロナイゼーションレプリケーション
を定義したときのみに利用可能です。
イベントは iSeries レシーバが変わったときに発生します。
このイベントは、古いレシーバの削除にも使用できます。しかしながら、これは同じジャーナルを共有する1つ以上のレプリ
ケーションを持つ場合に特に慎重に使われるべきです。
ほかのレプリケーションがまだ使用していて、レプリケーションが変わったときはレシーバを削除できません。
ベストアプローチは、iSeries で、古いレシーバを削除するように設定することです。
例えばレシーバのうち最新2つのみを残すように設定します。
5.4.1 文法
VB.NET
Public Overrides Sub LogReader_onReceiverChanged (sOldRecvLib As String, sOldRecvName
As String, sNewRecvLib As String, sNewRecvName As String)
C#
public override void LogReader_onReceiverChanged(string sOldRecvLib, string sOldRecvName,
string sNewRecvLib, string sNewRecvName)
5.4.2 パラメータ
sOldRecvLib: 古いレシーバライブラリ名
sOldRecvName: 古いレシーバ名
sNewRecvLib:新しいレシーバライブラリ名
sNewRecvName: 新しいレシーバ名
5.4.3 文法
VB.NET
Public Overrides Sub LogReader_onReceiverChanged(sOldRecvLib As String, sOldRecvName As
String, sNewRecvLib As String, sNewRecvName As String)
AddLog("Receiver Changed: OLD = " + sOldRecvLib+"/"+sOldRecvName+"
NEW =
"+sNewRecvLib+"/"+sNewRecvName , 0)
End Sub
C#
public override void LogReader_onReceiverChanged(string sOldRecvLib, string sOldRecvName,
string sNewRecvLib, string sNewRecvName)
{
- 33 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
GlobalScript.AddLog("Receiver Changed: OLD = " + sOldRecvLib + "/" + sOldRecvName +
" NEW = " + sNewRecvLib + "/" + sNewRecvName, 0);
}
5.5 Record_onBeforeMapping
イベントは、ソーステーブルカラム上でマッピングを適用する直前に発生します。
5.5.1 文法
VB.NET
Public Overrides Sub Record_onBeforeMapping (recSource As IRecord, ByRef AbortRecord As
Boolean)
C#
public override void Record_onBeforeMapping(IRecord recSource, ref bool AbortRecord)
5.5.2 パラメータ
recSource : 行おうとした操作タイプ(UPDATE,INSERT,DELETE)を含む、ソースレコードデータへのアクセスを
提供する IRecord オブジェクト。
AbortRecord: デフォルトでは、この値は False に設定されています。True を設定すると、レコードはレプリケーション
中にスキップされます。
5.5.3 スクリプト例
VB.NET
' INSERT されたレコードが COMPANYNAME が「TEST」のときに、そのレプリケーションをスキップします。
Public Overrides Sub Record_onBeforeMapping(recSource As IRecord, ByRef AbortRecord As
Boolean)
Dim obj As Object
If recSource.OperationType = enmOperationType.Insert Then
obj = recSource.GetValueAfter("COMPANYNAME")
If obj Is Nothing OR IsDBNull(obj) Then
Return
End If
If obj.ToString() = "TEST" Then
AbortRecord = True
End If
End If
End Sub
- 34 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
C#
// INSERT されたレコードが COMPANYNAME が「TEST」のときに、そのレプリケーションをスキップします。
public override void Record_onBeforeMapping(IRecord recSource, ref bool AbortRecord)
{
object obj = null;
if (recSource.OperationType == enmOperationType.Insert) {
obj = recSource.GetValueAfter("COMPANYNAME");
if (obj == null | Information.IsDBNull(obj)) {
return;
}
if (obj.ToString() == "TEST") {
AbortRecord = true;
}
}
}
- 35 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
5.6 Record_onAfterMapping
イベントは、ソーステーブルカラム上でマッピングを適用した直後に発生します。
5.6.1 文法
VB.NET
Public Overrides Sub Record_onAfterMapping (recSource As IRecord, recTarget As IRecord,
ByRef AbortRecord As Boolean)
C#
public override void Record_onAfterMapping(IRecord recSource, IRecord recTarget, ref bool
AbortRecord)
5.6.2 パラメータ
recSource : 行おうとした操作タイプ(UPDATE,INSERT,DELETE)を含む、ソースレコードデータへのアクセスを
提供する IRecord オブジェクト。
recTarget : 行おうとした操作タイプ(UPDATE,INSERT,DELETE)を含む、ターゲットレコードデータへのアクセス
を提供する IRecord オブジェクト。
AbortRecord: デフォルトでは、この値は False に設定されています。True を設定すると、レコードはレプリケーション
中にスキップされます。
5.6.3 スクリプト実例
VB.NET
' INSERT されたレコードのゼロ番目のカラムを、大文字にしてレプリケーションします。
Public Overrides Sub Record_onAfterMapping(recSource As IRecord, recTarget As IRecord,
ByRef AbortRecord As Boolean)
If recSource.OperationType = enmOperationType.Insert Then
if Not recTarget.GetValueAfter(0) Is Nothing Then
recTarget.SetValueAfter(0, recTarget.GetValueAfter(0).ToUpper)
End if
End If
End Sub
C#
// INSERT されたレコードのゼロ番目のカラムを、大文字にしてレプリケーションします。
public override void Record_onAfterMapping(IRecord recSource, IRecord recTarget, ref bool
AbortRecord)
{
if (recSource.OperationType == enmOperationType.Insert) {
- 36 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
if ((recTarget.GetValueAfter(0) != null)) {
recTarget.SetValueAfter(0, recTarget.GetValueAfter(0).ToUpper);
}
}
}
5.7 Record_onBeforeExecute
イベントは、ターゲット側において実行されたレコードへの変更の直前に発生します。このイベントと
Record_onAfterExecute はソースレコードへの値にアクセスできません。
したがって、ソースの値を使った操作を行いたい場合は、LogReader_onAfterMirroring イベントを代わりに使用しま
す。
レプリケーションの実行フェーズと関連付けられるイベントは、レプリケーションのマッピングフェーズと関連付けられるイベント
とは異なるスレッドを使って実行されます。
イベントを、レコードの実際のレプリケーション時間に可能な限り近づけて実行したい場合は、この
Record_onBeforeExecute か、Record_onAfterExecute を使います。
5.7.1 文法
VB.NET
Public Overrides Sub Record_onBeforeExecute (recTarget As IRecord, AbortRecord As Boolean)
C#
public override void Record_onBeforeExecute(IRecord recTarget, bool AbortRecord)
5.7.2 パラメータ
recTarget : 行おうとした操作タイプ(UPDATE,INSERT,DELETE)を含む、ターゲットレコードデータへのアクセス
を提供する IRecord オブジェクト。
AbortRecord: デフォルトでは、この値は False に設定されています。True を設定すると、レコードはレプリケーション
中にスキップされます。
- 37 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
5.7.3 スクリプト例
VB.NET
' INSERT または UPDATE されたレコードの、ゼロ番目のカラムの新しい値が「TEST」のときに、そのレプリケーションをス
キップします。
Public Overrides Sub Record_onBeforeExecute(recTarget As IRecord, ByRef AbortRecord As
Boolean)
Dim obj As Object
If recSource.OperationType = enmOperationType.Insert Or recSource.OperationType =
enmOperationType.Update Then
obj = recTarget.GetValueAfter(0)
if obj Is Nothing OR IsDBNull(obj) Then
return
End if
if obj.ToString() = "TEST" Then
AbortRecord = True
End if
End If
End Sub
C#
// INSERT または UPDATE されたレコードの、ゼロ番目のカラムの新しい値が「TEST」のときに、そのレプリケーションを
スキップします。
public override void Record_onBeforeExecute(IRecord recTarget, ref bool AbortRecord)
{
object obj = null;
if (recSource.OperationType == enmOperationType.Insert | recSource.OperationType ==
enmOperationType.Update) {
obj = recTarget.GetValueAfter(0);
if (obj == null | Information.IsDBNull(obj)) {
return;
}
if (obj.ToString() == "TEST") {
AbortRecord = true;
}
}
}
- 38 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
5.8 Record_onAfterExecute
イベントは、ターゲット側において実行されたレコードへの変更の直後に発生します。このイベントと
Record_onBeforeExecute はソースレコードへの値にアクセスできません。
したがって、ソースの値を使った操作を行いたい場合は、Record_onAfterMapping イベントを代わりに使用します。
レプリケーションの実行フェーズと関連付けられるイベントは、レプリケーションのマッピングフェーズと関連付けられるイベント
とは異なるスレッドを使って実行されます。
イベントを、レコードの実際のレプリケーション時間に可能な限り近づけて実行したい場合は、
Record_onBeforeExecute か、この Record_onAfterExecute を使います。
このイベントは、レコード操作が成功したときのみに生成され、操作が失敗したときはまったく生成されません。
5.8.1 文法
VB.NET
Public Overrides Sub Record_onAfterExecute (recTarget As IRecord, Failed As Boolean)
C#
public override void Record_onAfterExecute(IRecord recTarget, bool Failed)
5.8.2 パラメータ
recTarget : 行おうとした操作タイプ(UPDATE,INSERT,DELETE)を含む、ターゲットレコードデータへのアクセス
を提供する IRecord オブジェクト。
Failed: 読み取りのみの入力パラメータ。True のとき、レコード操作は失敗しています。
5.8.3 スクリプト例
VB.NET
Public Overrides Sub Record_onAfterExecute(recTarget As IRecord, Failed As Boolean)
If Not Failed Then
AddLog("Replication of single record succeeded", 0)
Else
AddLog("Replication of single record failed", 2)
End If
End Sub
C#
public override void Record_onAfterExecute(DBMotoPublic.IRecord recTarget, bool Failed)
{
if (!(Failed))
{
- 39 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
GlobalScript.AddLog("Replication of single record succeeded", 0);
}
else
{
GlobalScript.AddLog("Replication of single record failed", 2);
}
}
5.9 Refresh_onBeforeTruncate
イベントは、ターゲットテーブルのトランケート操作の直前に生成されます。
変数値 CancelTruncate を True に設定したとき、トランケート操作は行われません。
5.9.1 文法
VB.NET
Public Overrides Sub Refresh_onBeforeTruncate (ByRef CancelTruncate As Boolean, ByRef Filter
As System.String)
C#
public override void Refresh_onBeforeTruncate(ref bool CancelTruncate, ref System.String
Filter)
5.9.2 パラメータ
CancelTruncate: トランケーションをキャンセルするかどうかを表します。
Filter: トランケートされるレコードを決定するためのフィルタとして使用される、SQL WHERE 条件句を含む文字列。
5.9.3 スクリプト例
VB.NET
Public Overrides Sub Refresh_onBeforeTruncate(ByRef CancelTruncate As Boolean, ByRef Filter
As System.String)
AddLog("Refresh_onBefore Started", 0)
Filter = " ID < 10 "
AddLog("Refresh_onBeforeTruncate Finished", 0)
End Sub
- 40 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
C#
public override void Refresh_onBeforeTruncate(ref bool CancelTruncate, ref System.String
Filter)
{
AddLog("Refresh_onBefore Started", 0);
Filter = " ID < 10 ";
AddLog("Refresh_onBeforeTruncate Finished", 0);
}
5.10 Refresh_onAfterTruncate
ターゲットテーブルのトランケーション操作の直前に生成されます。
5.10.1 文法
VB.NET
Public Overrides Sub Refresh_onAfterTruncate ()
C#
public override void Refresh_onAfterTruncate()
5.10.2 パラメータ
ありません。
5.10.3 スクリプト例
VB.NET
Public Overrides Sub Refresh_onAfterTruncate()
AddLog("Truncate Finished", 0)
End Sub
C#
public override void Refresh_onAfterTruncate()
{
GlobalScript.AddLog("Truncate Finished", 0);
}
- 41 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
5.11 Refresh_onPrepareRefresh
WHERE 条件句によるフィルタをリフレッシュ操作前に実行します。
これは、レプリケーションプロパティにおいて提供されるフィルタの代わりとなり、リフレッシュが実施されるたびフィルタを変更
する機能を提供します。
5.11.1 文法
VB.NET
Public Overrides Sub Refresh_onPrepareRefresh(ByRef CancelRefresh As System.Boolean,
ByRef Filter As System.String)
C#
public override void Refresh_onPrepareRefresh(ref bool CancelRefresh, ref System.String
Filter)
5.11.2 パラメータ
Filter: トランケートされるレコードを決定するためのフィルタとして使用される、SQL WHERE 条件句を含む文字列。
CancelRefresh: イベントを発生させたリフレッシュ操作をキャンセルできるフラグ。デフォルト値は False。リフレッシュの
キャンセルには True に設定する必要があります。
5.11.3 スクリプト例
この例は、Refresh_onPrepareRefresh イベントを使用することにより、増分リフレッシュを設定する方法を示します。
注意:このサンプルはデータ挿入のみで動作します。更新や削除では、増分リフレッシュを使ったレプリケーションが正しく
動作しません。
1.以下のソーステーブルを作成します。
ID integer (incremental)
Name varchar(20)
2.リフレッシュモードで、繰り返し実行させるようにスケジュールしたレプリケーションを作成します。
3.以下のスクリプトを定義します。
- 42 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
VB.NET
Namespace DBRS
Public Class ReplicationScript : Inherits IReplicationScript
' 最後に INSERT された ID を記録するため、m_LastID 変数を作成します。
Public m_LastID As Long
Public Overrides Sub Refresh_onBeforeTruncate(ByRef CancelTruncate As Boolean)
' 初回のみターゲットテーブルをトランケートします。
If m_LastID > 0 Then
CancelTruncate = True
End If
End Sub
Public Overrides Sub Record_onAfterExecute(recTarget As IRecord)
' 最後に INSERT された ID を記録します。
If recTarget.OperationType = enmOperationType.Insert Then
m_LastID = recTarget.GetValueAfter("ID")
End If
End Sub
Public Overrides Sub Refresh_onPrepareRefresh(ByRef Filter As String)
' 次のリフレッシュ時のフィルタを用意します。
If m_LastID > 0 Then
Filter = "ID > " + m_LastID.ToString()
End If
End Sub
End Class
End Namespace
C#
using System;
using System.Data;
using DBMotoPublic;
using DBMotoScript;
namespace DBRS
{
public class ReplicationScript : IReplicationScript
{
long m_LastID = 0; //最後に INSERT された ID を記録するため、m_LastID 変数を作成します。
public override void Refresh_onBeforeTruncate(ref bool CancelTruncate)
{
// 初回のみターゲットテーブルをトランケートします。
- 43 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
if (m_LastID > 0)
{
CancelTruncate = true;
}
}
public override void Record_onAfterExecute(DBMotoPublic.IRecord recTarget, bool Failed)
{
// 最後に INSERT された ID を記録します。
if (recTarget.OperationType == enmOperationType.Insert)
{
m_LastID = (long) recTarget.GetValueAfter("ID");
}
}
public override void Refresh_onPrepareRefresh(ref bool CancelRefresh, ref string Filter)
{
// 次のリフレッシュ時のフィルタを用意します。
if (m_LastID > 0)
{
Filter = "ID > " + m_LastID.ToString();
}
}
}
}
5.12 Refresh_onBeforeRefresh
リフレッシュ開始直前に発生するイベント。
5.12.1 文法
VB.NET
Public Overrides Sub Refresh_onBeforeRefresh ()
C#
public override void Refresh_onBeforeRefresh()
5.12.2 パラメータ
ありません。
- 44 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
5.12.3 スクリプト例
VB.NET
Public Overrides Sub Refresh_onBeforeRefresh()
AddLog("Refresh Started", 0)
End Sub
C#
public override void Refresh_onBeforeRefresh()
{
GlobalScript.AddLog("Refresh Started", 0);
}
5.13 Refresh_onAfterRefresh
リフレッシュ実行後に発生するイベント。
5.13.1 文法
VB.NET
Public Overrides Sub Refresh_onAfterRefresh ()
C#
public override void Refresh_onAfterRefresh()
5.13.2 パラメータ
ありません。
5.13.3 スクリプト例
VB.NET
Public Overrides Sub Refresh_onAfterRefresh()
AddLog("Refresh Finished", 0)
End Sub
C#
public override void Refresh_onAfterRefresh()
{
GlobalScript.AddLog("Refresh Finished", 0);
}
- 45 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
5.14 Replication_onConflict
このイベントは、シンクロナイゼーション中にレコード上で衝突が発生したときに生成されます。
衝突は、両方のソース・ターゲットデータベースで UPDATE/DELETE/INSERT が同時に同じレコードに行われたときに
発生します。
衝突を起こした 2 つのレコードはイベントにパラメータとして引き渡されます。イベント関数はインサートされるレコードを返
すことにより、衝突を解決する必要があります。
返されるレコードはソースレコードにすることも、ターゲットレコードにすることも、2つのレコードの値をマージしたレコードに
することも可能です。
5.14.1 文法
VB.NET
Public Overrides Function Replication_onConflict (ByRef recSource As IRecord, ByRef recTarget
As IRecord) As IRecord
C#
public override IRecord Replication_onConflict(IRecord recSource, IRecord recTarget)
5.14.2 パラメータ
recSource: ソース接続で設定されたテーブルのレコード
recTarget: ターゲット接続で設定されたテーブルのレコード
返り値:イベント関数を実行した後にインサートされるレコード
5.14.3 スクリプト例
VB.NET
Public Overrides Function Replication_onConflict(recSource As IRecord, recTarget As IRecord)
As IRecord
AddLog("Conflict", 1)
End Function
C#
public override IRecord Replication_onConflict(IRecord recSource, IRecord recTarget)
{
GlobalScript.AddLog("Conflict", 1);
}
- 46 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
6 レプリケーションスクリプト:プロパティ
レプリケーションスクリプトにおける関数で使用するプロパティの一覧です。
6.1 SourceConnection
ソーステーブルへの接続を返します。リファレンスダイアログでアセンブリ’System.Data.dll’への参照が必要となります。
DBMoto は接続の開閉を扱っていますが、接続をロックしなければならないような特定の条件(DBMoto でスレッドが
使用中であるため)もあります。
もし、同時レプリケーションで、1つ以上の読み込みイベントまたは1つ以上の書き込みイベントを使う場合、それらのイ
ベントは接続オブジェクトを使用します。
接続オブジェクトは、異なるスレッド内部の同じオブジェクトの利用を避けるために同期を行う必要があります。
オブジェクトを同期するため、VB.NET において SyncLock コマンドを、C#では lock コマンドを使います。
6.1.1 同期用ロックスクリプト例
VB.NET SyncLock
Dim conn as IDbConnection = Nothing
Dim cmd as IDbCommand = Nothing
Dim reader as IDataReader = Nothing
Try
conn = SourceConnection
SyncLock(conn)
cmd = conn.CreateCommand
cmd.CommandText = "select count(*) from MARCO.dbo.EMP50"
reader = cmd.ExecuteReader
Dim iNumRecords = -1
If reader.Read Then
iNumRecords = reader.GetInt32(0)
End If
AddLog("Reader - Record in EMPNO: " & iNumRecords.ToString, 0)
End SyncLock
Catch ex As Exception
AddLog("Exception in Record_onAfterMapping: " & ex.ToString,0)
Finally
if (not reader is Nothing) Then
reader.Close
End If
- 47 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
if (not cmd is Nothing) Then
cmd.Dispose
End If
End Try
C# lock
public override void Record_onBeforeMapping(DBMotoPublic.IRecord recSource, ref bool
AbortRecord)
{
IDbConnection conn = null;
IDbCommand cmd = null;
IDataReader reader = null;
try
{
conn = SourceConnection;
lock ((conn))
{
cmd = conn.CreateCommand();
cmd.CommandText = "select count(*) from HITDB.dbo.EMP50";
reader = cmd.ExecuteReader();
int iNumRecords = -1;
if (reader.Read())
{
iNumRecords = reader.GetInt32(0);
}
GlobalScript.AddLog("Reader - Record in EMPNO: " + iNumRecords.ToString(), 0);
}
}
catch (Exception ex)
{
GlobalScript.AddLog("Exception in Record_onAfterMapping: " + ex.ToString(), 0);
}
finally
{
if (((reader != null)))
{
reader.Close();
}
if (((cmd != null)))
{
cmd.Dispose();
}
- 48 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
}
}
6.1.2 文法
VB.NET
Public SourceConnection As System.Data.IDbConnection
C#
public System.Data.IDbConnection SourceConnection;
6.1.3 スクリプト例
VB.NET
Public Overrides Sub Record_onBeforeMapping(recSource As IRecord, ByRef AbortRecord As
Boolean)
AddLog("SC connstring = " + SourceConnection.ConnectionString ,0)
AddLog("SC timeout = " + SourceConnection.ConnectionTimeout.ToString() ,0)
AddLog("SC db = " + SourceConnection.Database ,0)
AddLog("SC state = " + SourceConnection.State.ToString() ,0)
End Sub
C#
public override void Record_onBeforeMapping(IRecord recSource, ref bool AbortRecord)
{
GlobalScript.AddLog("SC connstring = " + SourceConnection.ConnectionString, 0);
GlobalScript.AddLog("SC timeout = " + SourceConnection.ConnectionTimeout.ToString(), 0);
GlobalScript.AddLog("SC db = " + SourceConnection.Database, 0);
GlobalScript.AddLog("SC state = " + SourceConnection.State.ToString(), 0);
}
- 49 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
6.2 InternalSourceConnection
ソースとターゲットデータベースへの接続に、DBMoto 内部で使用されている.NET 接続を返します。これは、Data
Replicator エンジンにより使用されている接続オブジェクトの複製を返す SourceConnection とは異なります。
このプロパティは、エンジンにより使用されている接続と同じ接続を使い、実行する必要がある文のときに便利です。
警告: 不適切な使用はレプリケーションの成功を危うくするのでこのプロパティを使うときは注意が必要です。
この接続を使用して実行されたスクリプトにより生成されたエラーは Data Replicator の動作とレプリケーションプロセス
に影響を与えます。
例えば、接続がスクリプトにより閉じられた場合、エンジンは停止します。通常であれば SourceConnection プロパティ
を使えば十分です。
6.2.1 文法
VB.Net
Public InternalSourceConnection As System.Data.IDbConnection
C#
public System.Data.IDbConnection InternalSourceConnection;
6.2.2 スクリプト例
この例において使用されているレプリケーションは、ソースデータベースは IBM System i、ターゲットデータベースは
Microsoft SQL Server 2005 です。
ソーステーブルは、SQL Server 2005 で Int 型 Identity のフィールドにマッピングされる、数値型フィールドを含みま
す。
この Int 型 Identity フィールドは、自動採番フィールドです。そのため、下のスクリプトを使用しない場合、ターゲットテー
ブルで Int 型 Indentity フィールドにマッピングされるソーステーブルのフィールドはレプリケーションされません。
以下のスクリプトを使えば、ソースフィールドのデータは、ターゲットフィールドに適切にレプリケーションされます。
VB.NET
Public Overrides Sub Refresh_onBeforeRefresh()
Dim conn as IDbConnection = Nothing
Dim cmd as IDbCommand = Nothing
Dim reader as IDataReader = Nothing
Try
conn = InternalTargetConnection
cmd = conn.CreateCommand
cmd.CommandText = "SET IDENTITY_INSERT SAMPLE.dbo.TarEmp ON"
- 50 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
reader = cmd.ExecuteReader
Catch ex As Exception
AddLog("Exception in Internal Target Connection: " & ex.ToString,0)
Finally
if (not reader is Nothing) Then
reader.Close
End If
if (not cmd is Nothing) Then
cmd.Dispose
End If
End Try
End Sub
C#
public override void Refresh_onBeforeRefresh()
{
IDbConnection conn = null;
IDbCommand cmd = null;
IDataReader reader = null;
try {
conn = InternalTargetConnection;
cmd = conn.CreateCommand;
cmd.CommandText = "SET IDENTITY_INSERT SAMPLE.dbo.TarEmp ON";
reader = cmd.ExecuteReader;
} catch (Exception ex) {
GlobalScript.AddLog("Exception in Internal Target Connection: " + ex.ToString, 0);
} finally {
if (((reader != null))) {
reader.Close();
}
if (((cmd != null))) {
cmd.Dispose();
}
}
}
- 51 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
6.3 SourceConnectionName
指定されたソース接続の DBMoto における名前を返します。
6.3.1 文法
VB.NET
Public SourceConnectionName As String
C#
public string SourceConnectionName;
6.4 SourceTableName
レプリケーションで使用されているソーステーブルの名前を返します。
6.4.1 文法
VB.NET
Public SourceTableName As String
C#
public string SourceConnectionName;
- 52 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
6.5 TargetConnection
ターゲットテーブルへの接続を返します。リファレンスダイアログでアセンブリ’System.Data.dll’への参照が必要となります。
DBMoto は接続の開閉を扱っていますが、接続をロックしなければならないような特定の条件(DBMoto でスレッドが
使用中であるため)もあります。詳細は SourceConnection プロパティをご覧ください。
6.5.1 文法
VB.NET
Public TargetConnection As System.Data.IDbConnection
C#
public System.Data.IDbConnection TargetConnection;
6.5.2 スクリプト例
VB.NET
Public Overrides Sub Record_onBeforeMapping(recSource As IRecord, ByRef AbortRecord As
Boolean)
AddLog("TC connstring = " + TargetConnection.ConnectionString ,0)
AddLog("TC timeout = " + TargetConnection.ConnectionTimeout.ToString() ,0)
AddLog("TC db = " + TargetConnection.Database ,0)
AddLog("TC state = " + TargetConnection.State.ToString() ,0)
End Sub
C#
public override void Record_onBeforeMapping(IRecord recSource, ref bool AbortRecord)
{
GlobalScript.AddLog("TC connstring = " + TargetConnection.ConnectionString, 0);
GlobalScript.AddLog("TC timeout = " + TargetConnection.ConnectionTimeout.ToString(), 0);
GlobalScript.AddLog("TC db = " + TargetConnection.Database, 0);
GlobalScript.AddLog("TC state = " + TargetConnection.State.ToString(), 0);
}
- 53 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
6.6 InternalTargetConnection
ソースとターゲットデータベースへの接続に、DBMoto 内部で使用されている.NET 接続を返します。これは、Data
Replicator エンジンにより使用されている接続オブジェクトの複製を返す TargetConnection とは異なります。
このプロパティは、エンジンにより使用されている接続と同じ接続を使い、実行する必要がある文のときに便利です。
警告: 不適切な使用はレプリケーションの成功を危うくするのでこのプロパティを使うときは注意が必要です。
この接続を使用して実行されたスクリプトにより生成されたエラーは Data Replicator の動作とレプリケーションプロセス
に影響を与えます。
例えば、接続がスクリプトにより閉じられた場合、エンジンは停止します。通常であれば TargetConnection プロパティ
を使えば十分です。
6.6.1 文法
VB.Net
Public InternalTargetConnection As System.Data.IDbConnection
C#
public System.Data.IDbConnection InternalTargetConnection;
6.6.2 スクリプト例
TargetConnection に準じます。
6.7 TargetConnectionName
指定されたターゲット接続の DBMoto における名前を返します。
6.7.1 文法
VB.NET
Public TargetConnectionName As String
C#
public string TargetConnectionName;
- 54 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
6.8 TargetTableName
レプリケーションで使用されているターゲットテーブルの名前を返します。
6.8.1 文法
VB.NET
Public TargetTableName As String
C#
public string TargetTableName;
6.9 GroupName
レプリケーションがグループに属している場合、そのグループの名前。
6.9.1 文法
VB.NET
Public GroupName As String
C#
public string GroupName;
6.10 ReplicationName
レプリケーションの名前。
6.10.1 文法
VB.NET
Public ReplicationName As String
C#
public string ReplicationName;
- 55 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
[DBMoto]スクリプト使用手順
7 更新履歴
版
1.0
修正日
2015/06/12(金)
修正者
S.O
内容
初版
- 56 -
Copyright(C) 2015 Climb.Inc. All Rights Reserved.
Fly UP