/* * src/pl/plpython/plpy_procedure.h */ #ifndef PLPY_PROCEDURE_H #define PLPY_PROCEDURE_H #include "plpy_typeio.h" extern void init_procedure_caches(void); /* saved arguments for outer recursion level or set-returning function */ typedef struct PLySavedArgs { struct PLySavedArgs *next; /* linked-list pointer */ PyObject *args; /* "args" element of globals dict */ int nargs; /* length of namedargs array */ PyObject *namedargs[FLEXIBLE_ARRAY_MEMBER]; /* named args */ } PLySavedArgs; /* cached procedure data */ typedef struct PLyProcedure { MemoryContext mcxt; /* context holding this PLyProcedure and its * subsidiary data */ char *proname; /* SQL name of procedure */ char *pyname; /* Python name of procedure */ TransactionId fn_xmin; ItemPointerData fn_tid; bool fn_readonly; bool is_setof; /* true, if function returns result set */ bool is_procedure; PLyObToDatum result; /* Function result output conversion info */ PLyDatumToOb result_in; /* For converting input tuples in a trigger */ char *src; /* textual procedure code, after mangling */ char **argnames; /* Argument names */ PLyDatumToOb *args; /* Argument input conversion info */ int nargs; /* Number of elements in above arrays */ Oid langid; /* OID of plpython pg_language entry */ List *trftypes; /* OID list of transform types */ PyObject *code; /* compiled procedure code */ PyObject *statics; /* data saved across calls, local scope */ PyObject *globals; /* data saved across calls, global scope */ long calldepth; /* depth of recursive calls of function */ PLySavedArgs *argstack; /* stack of outer-level call arguments */ } PLyProcedure; /* the procedure cache key */ typedef struct PLyProcedureKey { Oid fn_oid; /* function OID */ Oid fn_rel; /* triggered-on relation or InvalidOid */ } PLyProcedureKey; /* the procedure cache entry */ typedef struct PLyProcedureEntry { PLyProcedureKey key; /* hash key */ PLyProcedure *proc; } PLyProcedureEntry; /* PLyProcedure manipulation */ extern char *PLy_procedure_name(PLyProcedure *proc); extern PLyProcedure *PLy_procedure_get(Oid fn_oid, Oid fn_rel, bool is_trigger); extern void PLy_procedure_compile(PLyProcedure *proc, const char *src); extern void PLy_procedure_delete(PLyProcedure *proc); #endif /* PLPY_PROCEDURE_H */