* GetFdwRoutineByServerId - look up the handler of the foreign-data wrapper * for the given foreign server, and retrieve its FdwRoutine struct. */
| 628 | * for the given foreign server, and retrieve its FdwRoutine struct. |
| 629 | */ |
| 630 | FdwRoutine * |
| 631 | GetFdwRoutineByServerId(Oid serverid) |
| 632 | { |
| 633 | HeapTuple tp; |
| 634 | Form_pg_foreign_data_wrapper fdwform; |
| 635 | Form_pg_foreign_server serverform; |
| 636 | Oid fdwid; |
| 637 | Oid fdwhandler; |
| 638 | |
| 639 | /* Get foreign-data wrapper OID for the server. */ |
| 640 | tp = SearchSysCache1(FOREIGNSERVEROID, ObjectIdGetDatum(serverid)); |
| 641 | if (!HeapTupleIsValid(tp)) |
| 642 | elog(ERROR, "cache lookup failed for foreign server %u", serverid); |
| 643 | serverform = (Form_pg_foreign_server) GETSTRUCT(tp); |
| 644 | fdwid = serverform->srvfdw; |
| 645 | ReleaseSysCache(tp); |
| 646 | |
| 647 | /* Get handler function OID for the FDW. */ |
| 648 | tp = SearchSysCache1(FOREIGNDATAWRAPPEROID, ObjectIdGetDatum(fdwid)); |
| 649 | if (!HeapTupleIsValid(tp)) |
| 650 | elog(ERROR, "cache lookup failed for foreign-data wrapper %u", fdwid); |
| 651 | fdwform = (Form_pg_foreign_data_wrapper) GETSTRUCT(tp); |
| 652 | fdwhandler = fdwform->fdwhandler; |
| 653 | |
| 654 | /* Complain if FDW has been set to NO HANDLER. */ |
| 655 | if (!OidIsValid(fdwhandler)) |
| 656 | ereport(ERROR, |
| 657 | (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), |
| 658 | errmsg("foreign-data wrapper \"%s\" has no handler", |
| 659 | NameStr(fdwform->fdwname)))); |
| 660 | |
| 661 | ReleaseSysCache(tp); |
| 662 | |
| 663 | /* And finally, call the handler function. */ |
| 664 | return GetFdwRoutine(fdwhandler); |
| 665 | } |
| 666 | |
| 667 | |
| 668 | /* |
no test coverage detected