#author("2017-08-15T19:12:52+09:00","default:haikikyou","haikikyou")
#author("2017-08-16T21:19:59+09:00","default:haikikyou","haikikyou")
[[PostgreSQL/開発/フック]]

#contents

* フックの種類 [#e315fc6a]
* フック [#e315fc6a]

|~Hookインターフェース|~説明|h
|ExecutorStart_hook(QueryDesc *queryDesc, int flags)|Executorの開始時に呼ばれる。通常は、standard_ExecutorStart関数がプロセスを実行する。|
|ExecutorRun_hook(ScanDirection direction, uint64 count)|Executor実行時に呼ばれる。通常は、standard_ExecutorRun関数がプロセスを実行する。|
|ExecutorFinish_hook(QueryDesc *queryDesc)|最後のExecutorRunコールの後に呼ばれる。通常は、standard_ExecutorFinish関数がプロセスを処理する。|
|ExecutorEnd_hook(QueryDesc *queryDesc)|Executorの終了時に呼ばれる。通常は、standard_ExecutorEnd関数がプロセスを実行する。|
|ExecutorCheckPerms_hook(List *rangeTable, bool ereport_on_violation)|リレーションへのアクセス権限チェック時に呼ばれる。Row Level Securityとは別である。|

&size(12){&color(white,orange){ 参考 };}; [[execMain.c>https://doxygen.postgresql.org/execMain_8c.html]] - &size(11){&color(gray){on [[doxygen.postgresql.org>https://doxygen.postgresql.org]]};};
* サンプル [#a236c596]

&size(12){&color(white,#00afcc){ サンプル };};

''myext.c''

#geshi(c){{{
#include "postgres.h"
#include "fmgr.h"
#include "executor/executor.h"

PG_MODULE_MAGIC;

extern void _PG_init(void);

extern ExecutorStart_hook_type ExecutorStart_hook;
extern ExecutorRun_hook_type ExecutorRun_hook;
extern ExecutorFinish_hook_type ExecutorFinish_hook;
extern ExecutorEnd_hook_type ExecutorEnd_hook;


static void my_ExecutorStart(QueryDesc *queryDesc, int eflags);
static void my_ExecutorRun(QueryDesc *queryDesc,
                           ScanDirection direction, uint64 count);
static void my_ExecutorFinish(QueryDesc *queryDesc);
static void my_ExecutorEnd(QueryDesc *queryDesc);

void _PG_init(void)
{
  // Executor
  ExecutorStart_hook = my_ExecutorStart;
  ExecutorRun_hook = my_ExecutorRun;
  ExecutorFinish_hook = my_ExecutorFinish;
  ExecutorEnd_hook = my_ExecutorEnd;
}

static void my_ExecutorStart(QueryDesc *queryDesc, int eflags)
{
    elog(INFO, "my_ExecutorStart");
    standard_ExecutorStart(queryDesc, eflags);
}

static void my_ExecutorRun(QueryDesc *queryDesc,
                           ScanDirection direction, uint64 count)
{
  elog(INFO, "my_ExecutorRun");
  standard_ExecutorRun(queryDesc, direction, count);
}

static void my_ExecutorFinish(QueryDesc *queryDesc)
{
  elog(INFO, "my_ExecutorFinish");
  standard_ExecutorFinish(queryDesc);
}

static void my_ExecutorEnd(QueryDesc *queryDesc)
{
  elog(INFO, "my_ExecutorEnd");
  standard_ExecutorEnd(queryDesc);
}
}}}

''postgresql.conf''

#geshi{{{
shared_preload_libraries = 'my ext'
}}}

''実行例''

#geshi(sql){{{
$psql postgres
postgres=# \d
INFO:  my_ExecutorStart
INFO:  my_ExecutorRun
INFO:  my_ExecutorFinish
INFO:  my_ExecutorEnd
         List of relations
 Schema | Name | Type  |   Owner    
--------+------+-------+------------
 public | hoge | table | guest
(1 row)
}}}

* 参考リンク [#t5469fc0]

- [[execMain.c>https://doxygen.postgresql.org/execMain_8c.html]] - &size(11){&color(gray){on [[doxygen.postgresql.org>https://doxygen.postgresql.org]]};};
* コメント [#p5647484]

#comment



トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
目次
ダブルクリックで閉じるTOP | 閉じる
GO TO TOP