PostgreSQL/開発

概要

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

定義

マクロ

MappingUserName

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

列挙型

構造体

ForeignDataWrapper

番号データ型フィールド説明
1OidfdwidFDWのoid
2OidownerFDW所有者のoid
3char*fdwnameFDWの識別名
4Oidfdwhandlerhandler関数のoid,定義がない場合は0
5Oidfdwvalidatorvalidator関数のoid,定義がない場合は0
6List*optionsFDWオプションのリスト(DefElem)

ForeignServer

番号データ型フィールド説明
1Oidserveridサーバのoid
2OidfdwidFDWのoid
3Oidownerサーバ所有者のoid
4Oidservernameサーバ名
5Oidservertypeサーバタイプ
6Oidserverversionサーバのバージョン
7List*optionsサーバオプションのリスト(DefElem)

UserMapping

番号データ型フィールド説明
1Oiduseridローカルユーザのoid
2Oidserveridサーバのoid
3List*optionsUserMappingオプションのリスト(DefElem)

ForeignTable

番号データ型フィールド説明
1Oidrelidリレーションのoid
2Oidserveridサーバのoid
3List*optionsForeignTableオプションのリスト(DefElem)

関数

GetForeignServer

// 引数1:外部サーバのoid
// 戻り値:ForeignServer構造体のポインタ
extern ForeignServer *GetForeignServer(Oid serverid);
  • 外部サーバ情報を取得する

GetForeignServerByName

// 引数1:外部サーバの名前
// 引数2:falseの場合,外部サーバが見つからないとERRORになる
// 戻り値:ForeignServer構造体のポインタ
extern ForeignServer *GetForeignServerByName(const char *name , bool missing_ok);
  • 外部サーバ情報を識別名から取得する

GetUserMapping

// 引数1:ユーザのoid
// 引数2:外部サーバのoid
// 戻り値:UserMapping構造体のポインタ
extern UserMapping *GetUserMapping(Oid userid, Oid serverid);
  • User Mapping情報を取得する

GetForeignDataWrapper

// 引数1:Foreign Data Wrapperのoid
// 戻り値:ForeignDataWrapper構造体のポインタ
extern ForeignDataWrapper *GetForeignDataWrapper(Oid fdwid);
  • Foreign Data Wrapper情報を取得する

GetForeignDataWrapperByName

// 引数1:Foreign Data Wrapperの名前
// 引数2:falseの場合,Foreign Data Wrapperが見つからないとERRORになる
// 戻り値:ForeignDataWrapper構造体のポインタ
extern ForeignDataWrapper *GetForeignDataWrapperByName(const char *name, bool missing_ok);
  • Foreign Data Wrapper情報を識別名から取得する

GetForeignTable

// 引数1:テーブルのoid
// 戻り値:ForeignTable構造体のポインタ
extern ForeignTable *GetForeignTable(Oid relid);
  • 外部テーブル情報を取得する

GetForeignColumnOptions

// 引数1:テーブルのoid
// 引数2:属性の番号(1から始まる)
// 戻り値:DefElem型のリスト
extern List *GetForeignColumnOptions(Oid relid, AttrNumber attnum);
  • 外部テーブルの属性オプション情報を取得する
  • 戻り値は,untransformRelOptions()関数でDefElem型のリストとして返される

 参考  untransformRelOptions - on oxygen.postgresql.org

get_foreign_data_wrapper_oid

// 引数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

// 引数1:外部サーバの名前
// 引数2:falseの場合,外部サーバが見つからないとERRORになる
// 戻り値:ForeignServerのoid
extern Oid get_foreign_server_oid(const char *servername, bool missing_ok);
  • 外部サーバ情報を取得する
  • GetForeignServerByName()の内部で呼ばれる。

サンプルプログラム

#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));
    }
}

参考・関連

 関連 

コメント


[PR]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-02-04 (日) 13:34:36 (286d)
GO TO TOP