Add catalog lookup function for pg_foreign_table. fdw_catalog_lookup
authorShigeru Hanada <[email protected]>
Tue, 18 Jan 2011 10:51:34 +0000 (19:51 +0900)
committerShigeru Hanada <[email protected]>
Tue, 8 Feb 2011 08:47:49 +0000 (17:47 +0900)
src/backend/foreign/foreign.c
src/include/foreign/foreign.h

index 9a0f847f93ccfe3b6b43f4bdac0238763051fe50..6cfddf317a7391895bbf2a968778657ca77aa222 100644 (file)
@@ -16,6 +16,7 @@
 #include "catalog/namespace.h"
 #include "catalog/pg_foreign_data_wrapper.h"
 #include "catalog/pg_foreign_server.h"
+#include "catalog/pg_foreign_table.h"
 #include "catalog/pg_type.h"
 #include "catalog/pg_user_mapping.h"
 #include "foreign/foreign.h"
@@ -249,6 +250,45 @@ GetUserMapping(Oid userid, Oid serverid)
 }
 
 
+/*
+ * GetForeignTable - look up the foreign table definition by relation oid.
+ */
+ForeignTable *
+GetForeignTable(Oid relid)
+{
+   Form_pg_foreign_table tableform;
+   ForeignTable *ft;
+   HeapTuple   tp;
+   Datum       datum;
+   bool        isnull;
+
+   tp = SearchSysCache(FOREIGNTABLEREL,
+                       ObjectIdGetDatum(relid),
+                       0, 0, 0);
+
+   if (!HeapTupleIsValid(tp))
+       elog(ERROR, "cache lookup failed for foreign table %u", relid);
+
+   tableform = (Form_pg_foreign_table) GETSTRUCT(tp);
+
+   ft = palloc(sizeof(ForeignTable));
+   ft->relid = relid;
+   ft->serverid = tableform->ftserver;
+
+   /* Extract the ftoptions */
+   datum = SysCacheGetAttr(FOREIGNTABLEREL,
+                           tp,
+                           Anum_pg_foreign_table_ftoptions,
+                           &isnull);
+
+   /* untransformRelOptions does exactly what we want - avoid duplication */
+   ft->options = untransformRelOptions(datum);
+   ReleaseSysCache(tp);
+
+   return ft;
+}
+
+
 /*
  * deflist_to_tuplestore - Helper function to convert DefElem list to
  * tuplestore usable in SRF.
index 2d1495cfe133e079d1ee03500c7c335c367bbd8d..f3037a442a376a2a8f1bd71f9bde9bef2a998a03 100644 (file)
@@ -59,6 +59,12 @@ typedef struct UserMapping
    List       *options;        /* useoptions as DefElem list */
 } UserMapping;
 
+typedef struct ForeignTable
+{
+   Oid         relid;          /* relation Oid */
+   Oid         serverid;       /* server Oid */
+   List       *options;        /* ftoptions as DefElem list */
+} ForeignTable;
 
 extern ForeignServer *GetForeignServer(Oid serverid);
 extern ForeignServer *GetForeignServerByName(const char *name, bool missing_ok);
@@ -68,5 +74,6 @@ extern ForeignDataWrapper *GetForeignDataWrapper(Oid fdwid);
 extern ForeignDataWrapper *GetForeignDataWrapperByName(const char *name,
                            bool missing_ok);
 extern Oid GetForeignDataWrapperOidByName(const char *name, bool missing_ok);
+extern ForeignTable *GetForeignTable(Oid relid);
 
 #endif   /* FOREIGN_H */