@ -1,7 +1,7 @@
/**********************************************************************
* plpython . c - python as a procedural language for PostgreSQL
*
* $ PostgreSQL : pgsql / src / pl / plpython / plpython . c , v 1.126 2009 / 08 / 25 08 : 14 : 42 petere Exp $
* $ PostgreSQL : pgsql / src / pl / plpython / plpython . c , v 1.127 2009 / 08 / 25 12 : 44 : 59 petere Exp $
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/
@ -339,6 +339,20 @@ plpython_error_callback(void *arg)
errcontext ( " PL/Python function \" %s \" " , PLy_procedure_name ( PLy_curr_procedure ) ) ;
}
static void
plpython_trigger_error_callback ( void * arg )
{
if ( PLy_curr_procedure )
errcontext ( " while modifying trigger row " ) ;
}
static void
plpython_return_error_callback ( void * arg )
{
if ( PLy_curr_procedure )
errcontext ( " while creating return value " ) ;
}
Datum
plpython_call_handler ( PG_FUNCTION_ARGS )
{
@ -506,6 +520,11 @@ PLy_modify_tuple(PLyProcedure *proc, PyObject *pltd, TriggerData *tdata,
Datum * volatile modvalues ;
char * volatile modnulls ;
TupleDesc tupdesc ;
ErrorContextCallback plerrcontext ;
plerrcontext . callback = plpython_trigger_error_callback ;
plerrcontext . previous = error_context_stack ;
error_context_stack = & plerrcontext ;
plntup = plkeys = platt = plval = plstr = NULL ;
modattrs = NULL ;
@ -563,7 +582,7 @@ PLy_modify_tuple(PLyProcedure *proc, PyObject *pltd, TriggerData *tdata,
{
plstr = PyObject_Str ( plval ) ;
if ( ! plstr )
PLy_elog ( ERROR , " could not compute string representation of Python object, while modifying trigger row " ) ;
PLy_elog ( ERROR , " could not create string representation of Python object " ) ;
src = PyString_AsString ( plstr ) ;
modvalues [ i ] =
@ -620,6 +639,8 @@ PLy_modify_tuple(PLyProcedure *proc, PyObject *pltd, TriggerData *tdata,
pfree ( modvalues ) ;
pfree ( modnulls ) ;
error_context_stack = plerrcontext . previous ;
return rtup ;
}
@ -811,6 +832,7 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure *proc)
PyObject * volatile plrv = NULL ;
PyObject * volatile plrv_so = NULL ;
char * plrv_sc ;
ErrorContextCallback plerrcontext ;
PG_TRY ( ) ;
{
@ -901,6 +923,10 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure *proc)
}
}
plerrcontext . callback = plpython_return_error_callback ;
plerrcontext . previous = error_context_stack ;
error_context_stack = & plerrcontext ;
/*
* If the function is declared to return void , the Python return value
* must be None . For void - returning functions , we also treat a None
@ -959,7 +985,7 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure *proc)
fcinfo - > isnull = false ;
plrv_so = PyObject_Str ( plrv ) ;
if ( ! plrv_so )
PLy_elog ( ERROR , " could not create string representation of Python object, while creating return value " ) ;
PLy_elog ( ERROR , " could not create string representation of Python object " ) ;
plrv_sc = PyString_AsString ( plrv_so ) ;
rv = InputFunctionCall ( & proc - > result . out . d . typfunc ,
plrv_sc ,
@ -977,6 +1003,8 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure *proc)
}
PG_END_TRY ( ) ;
error_context_stack = plerrcontext . previous ;
Py_XDECREF ( plargs ) ;
Py_DECREF ( plrv ) ;
Py_XDECREF ( plrv_so ) ;