無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

37.3. C言語によるイベントトリガ関数の書き方

本節ではトリガ関数とのインタフェースについて低レベルな詳細を説明します。 この情報はC言語でトリガ関数を作成する時にのみ必要です。 高レベルな言語で作成すれば、こうした詳細は代わりに扱ってもらえます。 たいていの場合、Cでトリガを作成する前に手続き言語を使用することを検討すべきです。 各手続き言語の文書で、その言語を使用したトリガ言語の作成方法を説明します。

トリガ関数は "version 1" 関数マネージャインタフェースを使わなくてはいけません。

関数がイベントトリガマネージャから呼び出される時は、通常の引数が渡されるのではなく、 EventTriggerData 構造体を指す "context" ポインタが渡されます。 C関数は、イベントトリガマネージャから呼び出されたのかどうかを以下のマクロを実行することで検査することができます。

CALLED_AS_EVENT_TRIGGER(fcinfo)

これは以下に展開されます。

((fcinfo)->context != NULL && IsA((fcinfo)->context, EventTriggerData))

もしこれが真を返す場合、 fcinfo->context EventTriggerData * 型にキャストし、指された EventTriggerData 構造体を使用することは安全です。 その関数は、 TriggerData 構造体やそれが指すどのようなデータも変更しては いけません

struct EventTriggerData commands/event_trigger.h の中で定義されています。

typedef struct EventTriggerData
{
    NodeTag     type;
    const char *event;      /* イベント名 */
    Node       *parsetree;  /* 解析ツリー */
    const char *tag;        /* コマンドタグ */

} EventTriggerData;

メンバは下記のように定義されています。

type

常に T_Event_TriggerData です。

event

その関数が呼び出されたイベント、 "ddl_command_start" "ddl_command_end" "sql_drop" のうちの1つを記述します。 これらのイベントの内容は、 項37.1 を参照してください。

parsetree

コマンドの解析ツリーへのポインタです。詳細はPostgreSQLのソースコードを確認してください。解析ツリーの構造は予告なく変更されることがあります。

tag

イベントトリガの実行対象となるイベントに関連するコマンドタグです。たとえば、 "CREATE FUNCTION" です。

イベントトリガ関数は NULL ポインタ(SQLのNULLでは ありません 。したがって、 isNull は真にはなりません)を返さなければなりません。


powered by SEO.CUG.NET