/*------------------------------------------------------------------------- * * fdwapi.h * API for foreign-data wrappers * * Copyright (c) 2010-2011, PostgreSQL Global Development Group * * src/include/foreign/fdwapi.h * *------------------------------------------------------------------------- */ #ifndef FDWAPI_H #define FDWAPI_H #include "nodes/execnodes.h" #include "nodes/relation.h" /* To avoid including explain.h here, reference ExplainState thus: */ struct ExplainState; /* * FdwPlan is the information returned to the planner by PlanForeignScan. */ typedef struct FdwPlan { NodeTag type; /* * Cost estimation info. The startup_cost is time before retrieving the * first row, so it should include costs of connecting to the remote host, * sending over the query, etc. Note that PlanForeignScan also ought to * set baserel->rows and baserel->width if it can produce any usable * estimates of those values. */ Cost startup_cost; /* cost expended before fetching any tuples */ Cost total_cost; /* total cost (assuming all tuples fetched) */ /* * FDW private data, which will be available at execution time. * * Note that everything in this list must be copiable by copyObject(). One * way to store an arbitrary blob of bytes is to represent it as a bytea * Const. Usually, though, you'll be better off choosing a representation * that can be dumped usefully by nodeToString(). */ List *fdw_private; } FdwPlan; /* * Callback function signatures --- see fdwhandler.sgml for more info. */ typedef FdwPlan *(*PlanForeignScan_function) (Oid foreigntableid, PlannerInfo *root, RelOptInfo *baserel); typedef void (*ExplainForeignScan_function) (ForeignScanState *node, struct ExplainState *es); typedef void (*BeginForeignScan_function) (ForeignScanState *node, int eflags); typedef TupleTableSlot *(*IterateForeignScan_function) (ForeignScanState *node); typedef void (*ReScanForeignScan_function) (ForeignScanState *node); typedef void (*EndForeignScan_function) (ForeignScanState *node); /* * FdwRoutine is the struct returned by a foreign-data wrapper's handler * function. It provides pointers to the callback functions needed by the * planner and executor. * * Currently, all functions must be supplied. Later there may be optional * additions. It's recommended that the handler initialize the struct with * makeNode(FdwRoutine) so that all fields are set to zero. */ typedef struct FdwRoutine { NodeTag type; PlanForeignScan_function PlanForeignScan; ExplainForeignScan_function ExplainForeignScan; BeginForeignScan_function BeginForeignScan; IterateForeignScan_function IterateForeignScan; ReScanForeignScan_function ReScanForeignScan; EndForeignScan_function EndForeignScan; } FdwRoutine; /* Functions in foreign/foreign.c */ extern FdwRoutine *GetFdwRoutine(Oid fdwhandler); extern FdwRoutine *GetFdwRoutineByRelId(Oid relid); #endif /* FDWAPI_H */