- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2017-08-15T19:12:52+09:00","default:haikikyou","haikikyou")
#author("2017-08-17T20:22:16+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とは別である。|
|void ExecutorStart_hook(QueryDesc *queryDesc, int flags)|Executorの開始時に呼ばれる。通常は、standard_ExecutorStart関数がプロセスを実行する。|
|void ExecutorRun_hook(ScanDirection direction, uint64 count)|Executor実行時に呼ばれる。通常は、standard_ExecutorRun関数がプロセスを実行する。|
|void ExecutorFinish_hook(QueryDesc *queryDesc)|最後のExecutorRunコールの後に呼ばれる。通常は、standard_ExecutorFinish関数がプロセスを処理する。|
|void ExecutorEnd_hook(QueryDesc *queryDesc)|Executorの終了時に呼ばれる。通常は、standard_ExecutorEnd関数がプロセスを実行する。|
|bool 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,#800080){ 実験 };};
''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]
* コメント [#p5647484]
- [[execMain.c>https://doxygen.postgresql.org/execMain_8c.html]] - &size(11){&color(gray){on [[doxygen.postgresql.org>https://doxygen.postgresql.org]]};};
#comment