mirror of
https://github.com/postgres/postgres.git
synced 2025-06-14 18:42:34 +03:00
Add a feature for automatic initialization and finalization of dynamically
loaded libraries: call functions _PG_init() and _PG_fini() if the library defines such symbols. Hence we no longer need to specify an initialization function in preload_libraries: we can assume that the library used the _PG_init() convention, instead. This removes one source of pilot error in use of preloaded libraries. Original patch by Ralf Engelschall, preload_libraries changes by me.
This commit is contained in:
@ -1,7 +1,7 @@
|
||||
/**********************************************************************
|
||||
* plpython.c - python as a procedural language for PostgreSQL
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.84 2006/07/06 01:55:51 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.85 2006/08/08 19:15:09 tgl Exp $
|
||||
*
|
||||
*********************************************************************
|
||||
*/
|
||||
@ -155,11 +155,11 @@ typedef struct PLyResultObject
|
||||
/* function declarations */
|
||||
|
||||
/* Two exported functions: first is the magic telling Postgresql
|
||||
* what function call interface it implements. Second allows
|
||||
* preinitialization of the interpreter during postmaster startup.
|
||||
* what function call interface it implements. Second is for
|
||||
* initialization of the interpreter during library load.
|
||||
*/
|
||||
Datum plpython_call_handler(PG_FUNCTION_ARGS);
|
||||
void plpython_init(void);
|
||||
void _PG_init(void);
|
||||
|
||||
PG_FUNCTION_INFO_V1(plpython_call_handler);
|
||||
|
||||
@ -169,7 +169,6 @@ PG_FUNCTION_INFO_V1(plpython_call_handler);
|
||||
* of plpython_call_handler. initialize the python interpreter
|
||||
* and global data.
|
||||
*/
|
||||
static void PLy_init_all(void);
|
||||
static void PLy_init_interp(void);
|
||||
static void PLy_init_plpy(void);
|
||||
|
||||
@ -233,9 +232,6 @@ static PyObject *PLyLong_FromString(const char *);
|
||||
static PyObject *PLyString_FromString(const char *);
|
||||
|
||||
|
||||
/* global data */
|
||||
static bool PLy_first_call = true;
|
||||
|
||||
/*
|
||||
* Currently active plpython function
|
||||
*/
|
||||
@ -301,8 +297,6 @@ plpython_call_handler(PG_FUNCTION_ARGS)
|
||||
PLyProcedure *save_curr_proc;
|
||||
PLyProcedure *volatile proc = NULL;
|
||||
|
||||
PLy_init_all();
|
||||
|
||||
if (SPI_connect() != SPI_OK_CONNECT)
|
||||
elog(ERROR, "could not connect to SPI manager");
|
||||
|
||||
@ -2263,25 +2257,19 @@ PLy_spi_execute_fetch_result(SPITupleTable *tuptable, int rows, int status)
|
||||
*/
|
||||
|
||||
/*
|
||||
* plpython_init() - Initialize everything that can be
|
||||
* safely initialized during postmaster
|
||||
* startup.
|
||||
* _PG_init() - library load-time initialization
|
||||
*
|
||||
* DO NOT make this static --- it has to be callable by preload
|
||||
* DO NOT make this static nor change its name!
|
||||
*/
|
||||
void
|
||||
plpython_init(void)
|
||||
_PG_init(void)
|
||||
{
|
||||
static volatile bool init_active = false;
|
||||
/* Be sure we do initialization only once (should be redundant now) */
|
||||
static bool inited = false;
|
||||
|
||||
/* Do initialization only once */
|
||||
if (!PLy_first_call)
|
||||
if (inited)
|
||||
return;
|
||||
|
||||
if (init_active)
|
||||
elog(FATAL, "initialization of language module failed");
|
||||
init_active = true;
|
||||
|
||||
Py_Initialize();
|
||||
PLy_init_interp();
|
||||
PLy_init_plpy();
|
||||
@ -2291,20 +2279,7 @@ plpython_init(void)
|
||||
if (PLy_procedure_cache == NULL)
|
||||
PLy_elog(ERROR, "could not create procedure cache");
|
||||
|
||||
PLy_first_call = false;
|
||||
}
|
||||
|
||||
static void
|
||||
PLy_init_all(void)
|
||||
{
|
||||
/* Execute postmaster-startup safe initialization */
|
||||
if (PLy_first_call)
|
||||
plpython_init();
|
||||
|
||||
/*
|
||||
* Any other initialization that must be done each time a new backend
|
||||
* starts -- currently none
|
||||
*/
|
||||
inited = true;
|
||||
}
|
||||
|
||||
static void
|
||||
|
Reference in New Issue
Block a user