#author("2017-05-15T19:34:42+09:00","default:haikikyou","haikikyou")
#author("2017-05-17T21:20:07+09:00","default:haikikyou","haikikyou")
[[PostgreSQL/開発]]

#contents

* 概要 [#idb9ba16]

- Foreign Data Wrapper,Foreign Server,User Mappingなどに関する機能

* 定義 [#s7258ab6]

** マクロ [#x4ebf6db]

*** MappingUserName [#s16c958f]

#geshi(c){{
MappingUserName(userid)
}}

- ユーザマッピングのユーザ名を取得するヘルパー
- useridが存在しない場合は,ERRORになる
- useridが不正値ならば"public"

** 列挙型 [#nb5fe86d]

** 構造体 [#q3734800]

*** ForeignDataWrapper [#cb3525bd]

|~番号|~データ型|~フィールド|~説明|h
|1|Oid|fdwid|FDWのoid|
|2|Oid|owner|FDW所有者のoid|
|3|char*|fdwname|FDWの識別名|
|4|Oid|fdwhandler|handler関数のoid,定義がない場合は0|
|5|Oid|fdwvalidator|validator関数のoid,定義がない場合は0|
|6|List*|options| FDWオプションのリスト(DefElem)|

*** ForeignServer [#x987b547]

|~番号|~データ型|~フィールド|~説明|h
|1|Oid|serverid|サーバのoid|
|2|Oid|fdwid|FDWのoid|
|3|Oid|owner|サーバ所有者のoid|
|4|Oid|servername|サーバ名|
|5|Oid|servertype|サーバタイプ|
|6|Oid|serverversion|サーバのバージョン|
|7|List*|options|サーバオプションのリスト(DefElem)|

*** UserMapping [#a0d1d30a]

|~番号|~データ型|~フィールド|~説明|h
|1|Oid|userid|ローカルユーザのoid|
|2|Oid|serverid|サーバのoid|
|3|List*|options|UserMappingオプションのリスト(DefElem)|

*** ForeignTable [#x348cb9c]

|~番号|~データ型|~フィールド|~説明|h
|1|Oid|relid|リレーションのoid|
|2|Oid|serverid|サーバのoid|
|3|List*|options| ForeignTableオプションのリスト(DefElem)|

** 関数 [#c80712f3]

*** GetForeignServer [#d959cf6a]
#geshi(c){{
// 引数1:外部サーバのoid
// 戻り値:ForeignServer構造体のポインタ
extern ForeignServer *GetForeignServer(Oid serverid);
}}

- 外部サーバ情報を取得する

*** GetForeignServerByName [#naaa6b9e]
#geshi(c){{
// 引数1:外部サーバの名前
// 引数2:falseの場合,外部サーバが見つからないとERRORになる
// 戻り値:ForeignServer構造体のポインタ
extern ForeignServer *GetForeignServerByName(const char *name , bool missing_ok);
}}

- 外部サーバ情報を識別名から取得する

*** GetUserMapping [#w779a8f2]
#geshi(c){{
// 引数1:ユーザのoid
// 引数2:外部サーバのoid
// 戻り値:UserMapping構造体のポインタ
extern UserMapping *GetUserMapping(Oid userid, Oid serverid);
}}

- User Mapping情報を取得する

*** GetForeignDataWrapper [#hfddbe64]
#geshi(c){{
// 引数1:Foreign Data Wrapperのoid
// 戻り値:ForeignDataWrapper構造体のポインタ
extern ForeignDataWrapper *GetForeignDataWrapper(Oid fdwid);
}}

- Foreign Data Wrapper情報を取得する

*** GetForeignDataWrapperByName [#b42a3bc6]
#geshi(c){{
// 引数1:Foreign Data Wrapperの名前
// 引数2:falseの場合,Foreign Data Wrapperが見つからないとERRORになる
// 戻り値:ForeignDataWrapper構造体のポインタ
extern ForeignDataWrapper *GetForeignDataWrapperByName(const char *name, bool missing_ok);
}}

- Foreign Data Wrapper情報を識別名から取得する

*** GetForeignTable [#cdb70c65]
#geshi(c){{
// 引数1:テーブルのoid
// 戻り値:ForeignTable構造体のポインタ
extern ForeignTable *GetForeignTable(Oid relid);
}}

- 外部テーブル情報を取得する

*** GetForeignColumnOptions [#l96e9e96]
#geshi(c){{
// 引数1:テーブルのoid
// 引数2:属性の番号(1から始まる)
// 戻り値:DefElem型のリスト
extern List *GetForeignColumnOptions(Oid relid, AttrNumber attnum);
}}

- 外部テーブルの属性オプション情報を取得する
- 戻り値は,untransformRelOptions()関数でDefElem型のリストとして返される

&size(12){&color(white,orange){ 参考 };}; [[untransformRelOptions >https://doxygen.postgresql.org/reloptions_8c.html#a478efa3854019a9513a7df00c95baf2a]] - on oxygen.postgresql.org
*** get_foreign_data_wrapper_oid [#q7d415eb]
#geshi(c){{
// 引数1:Foreign Data Wrapperの名前
// 引数2:falseの場合,Foreign Data Wrapperが見つからないとERRORになる
// 戻り値:Foreign Data Wrapperのoid
extern Oid get_foreign_data_wrapper_oid(const char *fdwname, bool missing_ok);
}}

- Foreign Data Wrapper情報を取得する
- GetForeignDataWrapperByName()の内部で呼ばれる。

*** get_foreign_server_oid [#s2871aa6]
#geshi(c){{
// 引数1:外部サーバの名前
// 引数2:falseの場合,外部サーバが見つからないとERRORになる
// 戻り値:ForeignServerのoid
extern Oid get_foreign_server_oid(const char *servername, bool missing_ok);
}}

- 外部サーバ情報を取得する
- GetForeignServerByName()の内部で呼ばれる。

* サンプルプログラム [#f88e2ab5]

#geshi(c){{
#include "foreign/foreign.h"
/*
[Sample]
  CREATE SERVER postgres_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'foo', dbname 'foodb', port '5432');
  CREATE USER MAPPING FOR PUBLIC SERVER postgres_server OPTIONS (...);
  CREATE FOREIGN TABLE T (....) SERVER postgres_server
      OPTIONS (table_name 'warehouse', schema_name 'sales');
 */

void display_options(Oid foreigntableid)
{
    ListCell *lc;

    // 外部テーブル情報取得
    ForeignTable *table = GetForeignTable(foreigntableid);
    foreach(lc, table->options)
    {
        DefElem *def = (DefElem*)lfirst(lc);
        elog(NOTICE, "%s = %s", def->defname, defGetString(def));
    }

    // server情報取得
    ForeignServer *server = GetForeignServer(table->serverid);
    elog(NOTICE, "servername = %s", server->servername);
    foreach(lc, server->options)
    {
        DefElem *def = (DefElem*)lfirst(lc);
        elog(NOTICE, "%s = %s", def->defname, defGetString(def));
    }

    // ForeignDataWrapper情報取得
    ForeignDataWrapper *wrapper = GetForeignDataWrapper(server->fdwid);
    elog(NOTICE, "fdwname = %s", wrapper->fdwname);
    foreach(lc, wrapper->options)
    {
        DefElem *def = (DefElem*)lfirst(lc);
        elog(NOTICE, "%s = %s", def->defname, defGetString(def));
    }

    // UserMapping情報取得
    UserMapping *mapping = GetUserMapping(wrapper->owner, server->serverid);
    elog(NOTICE, "serverid = %d, userid = %d", mapping->serverid, mapping->userid);
    foreach(lc, mapping->options)
    {
        DefElem *def = (DefElem*)lfirst(lc);
        elog(NOTICE, "%s = %s", def->defname, defGetString(def));
    }
}
}}
* 参考・関連 [#rf21d055]

- [[foreign.h>https://doxygen.postgresql.org/foreign_8h.html]] - on doxygen.postgresql.org
- [[foreign.c>https://doxygen.postgresql.org/foreign_8c.html]] - on doxygen.postgresql.org
- [[PostgreSQL 9.5.4文書 第54章 外部データラッパの作成>https://www.postgresql.jp/document/9.5/html/postgres-fdw.html]]

&size(12){&color(white,orange){ 関連 };};

#related
* コメント [#na437e9f]

#comment

PR

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