aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/foreign/foreign.c36
-rw-r--r--src/include/foreign/foreign.h10
2 files changed, 44 insertions, 2 deletions
diff --git a/src/backend/foreign/foreign.c b/src/backend/foreign/foreign.c
index 989a58ad78b..79661526a3a 100644
--- a/src/backend/foreign/foreign.c
+++ b/src/backend/foreign/foreign.c
@@ -34,6 +34,18 @@
ForeignDataWrapper *
GetForeignDataWrapper(Oid fdwid)
{
+ return GetForeignDataWrapperExtended(fdwid, 0);
+}
+
+
+/*
+ * GetForeignDataWrapperExtended - look up the foreign-data wrapper
+ * by OID. If flags uses FDW_MISSING_OK, return NULL if the object cannot
+ * be found instead of raising an error.
+ */
+ForeignDataWrapper *
+GetForeignDataWrapperExtended(Oid fdwid, bits16 flags)
+{
Form_pg_foreign_data_wrapper fdwform;
ForeignDataWrapper *fdw;
Datum datum;
@@ -43,7 +55,11 @@ GetForeignDataWrapper(Oid fdwid)
tp = SearchSysCache1(FOREIGNDATAWRAPPEROID, ObjectIdGetDatum(fdwid));
if (!HeapTupleIsValid(tp))
- elog(ERROR, "cache lookup failed for foreign-data wrapper %u", fdwid);
+ {
+ if ((flags & FDW_MISSING_OK) == 0)
+ elog(ERROR, "cache lookup failed for foreign-data wrapper %u", fdwid);
+ return NULL;
+ }
fdwform = (Form_pg_foreign_data_wrapper) GETSTRUCT(tp);
@@ -92,6 +108,18 @@ GetForeignDataWrapperByName(const char *fdwname, bool missing_ok)
ForeignServer *
GetForeignServer(Oid serverid)
{
+ return GetForeignServerExtended(serverid, 0);
+}
+
+
+/*
+ * GetForeignServerExtended - look up the foreign server definition. If
+ * flags uses FSV_MISSING_OK, return NULL if the object cannot be found
+ * instead of raising an error.
+ */
+ForeignServer *
+GetForeignServerExtended(Oid serverid, bits16 flags)
+{
Form_pg_foreign_server serverform;
ForeignServer *server;
HeapTuple tp;
@@ -101,7 +129,11 @@ GetForeignServer(Oid serverid)
tp = SearchSysCache1(FOREIGNSERVEROID, ObjectIdGetDatum(serverid));
if (!HeapTupleIsValid(tp))
- elog(ERROR, "cache lookup failed for foreign server %u", serverid);
+ {
+ if ((flags & FSV_MISSING_OK) == 0)
+ elog(ERROR, "cache lookup failed for foreign server %u", serverid);
+ return NULL;
+ }
serverform = (Form_pg_foreign_server) GETSTRUCT(tp);
diff --git a/src/include/foreign/foreign.h b/src/include/foreign/foreign.h
index 3ca12e64d27..a7129b5fcb2 100644
--- a/src/include/foreign/foreign.h
+++ b/src/include/foreign/foreign.h
@@ -68,11 +68,21 @@ typedef struct ForeignTable
List *options; /* ftoptions as DefElem list */
} ForeignTable;
+/* Flags for GetForeignServerExtended */
+#define FSV_MISSING_OK 0x01
+
+/* Flags for GetForeignDataWrapperExtended */
+#define FDW_MISSING_OK 0x01
+
extern ForeignServer *GetForeignServer(Oid serverid);
+extern ForeignServer *GetForeignServerExtended(Oid serverid,
+ bits16 flags);
extern ForeignServer *GetForeignServerByName(const char *name, bool missing_ok);
extern UserMapping *GetUserMapping(Oid userid, Oid serverid);
extern ForeignDataWrapper *GetForeignDataWrapper(Oid fdwid);
+extern ForeignDataWrapper *GetForeignDataWrapperExtended(Oid fdwid,
+ bits16 flags);
extern ForeignDataWrapper *GetForeignDataWrapperByName(const char *name,
bool missing_ok);
extern ForeignTable *GetForeignTable(Oid relid);