mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-14 18:37:03 +08:00
This replaces the former global variable PLy_curr_procedure, and provides a place to stash per-call-level information. In particular we create a per-call-level scratch memory context. For the moment, the scratch context is just used to avoid leaking memory from datatype output function calls in PLyDict_FromTuple. There probably will be more use-cases in future. Although this is a fix for a pre-existing memory leakage bug, it seems sufficiently invasive to not want to back-patch; it feels better as part of the major rearrangement of plpython code that we've already done as part of 9.2. Jan Urbański
49 lines
1.4 KiB
C
49 lines
1.4 KiB
C
/*
|
|
* src/pl/plpython/plpy_procedure.h
|
|
*/
|
|
|
|
#ifndef PLPY_PROCEDURE_H
|
|
#define PLPY_PROCEDURE_H
|
|
|
|
#include "plpy_typeio.h"
|
|
|
|
|
|
extern void init_procedure_caches(void);
|
|
|
|
|
|
/* cached procedure data */
|
|
typedef struct PLyProcedure
|
|
{
|
|
char *proname; /* SQL name of procedure */
|
|
char *pyname; /* Python name of procedure */
|
|
TransactionId fn_xmin;
|
|
ItemPointerData fn_tid;
|
|
bool fn_readonly;
|
|
PLyTypeInfo result; /* also used to store info for trigger tuple
|
|
* type */
|
|
bool is_setof; /* true, if procedure returns result set */
|
|
PyObject *setof; /* contents of result set. */
|
|
char *src; /* textual procedure code, after mangling */
|
|
char **argnames; /* Argument names */
|
|
PLyTypeInfo args[FUNC_MAX_ARGS];
|
|
int nargs;
|
|
PyObject *code; /* compiled procedure code */
|
|
PyObject *statics; /* data saved across calls, local scope */
|
|
PyObject *globals; /* data saved across calls, global scope */
|
|
} PLyProcedure;
|
|
|
|
/* the procedure cache entry */
|
|
typedef struct PLyProcedureEntry
|
|
{
|
|
Oid fn_oid; /* hash key */
|
|
PLyProcedure *proc;
|
|
} PLyProcedureEntry;
|
|
|
|
/* PLyProcedure manipulation */
|
|
extern char *PLy_procedure_name(PLyProcedure *proc);
|
|
extern PLyProcedure *PLy_procedure_get(Oid fn_oid, bool is_trigger);
|
|
extern void PLy_procedure_compile(PLyProcedure *proc, const char *src);
|
|
extern void PLy_procedure_delete(PLyProcedure *proc);
|
|
|
|
#endif /* PLPY_PROCEDURE_H */
|