11/**********************************************************************
22 * plpython.c - python as a procedural language for PostgreSQL
33 *
4- *$PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.104 2007/11/15 21:14:46 momjian Exp $
4+ *$PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.105 2007/11/23 01:46:34 alvherre Exp $
55 *
66 *********************************************************************
77 */
@@ -210,11 +210,8 @@ static char *PLy_procedure_name(PLyProcedure *);
210210/* some utility functions */
211211static void PLy_elog (int ,const char * ,...);
212212static char * PLy_traceback (int * );
213- static char * PLy_vprintf (const char * fmt ,va_list ap );
214- static char * PLy_printf (const char * fmt ,...);
215213
216214static void * PLy_malloc (size_t );
217- static void * PLy_realloc (void * ,size_t );
218215static char * PLy_strdup (const char * );
219216static void PLy_free (void * );
220217
@@ -2900,35 +2897,44 @@ PLy_exception_set(PyObject * exc, const char *fmt,...)
29002897static void
29012898PLy_elog (int elevel ,const char * fmt ,...)
29022899{
2903- va_list ap ;
2904- char * xmsg ,
2905- * emsg ;
2900+ char * xmsg ;
29062901int xlevel ;
2902+ StringInfoData emsg ;
29072903
29082904xmsg = PLy_traceback (& xlevel );
29092905
2910- va_start (ap ,fmt );
2911- emsg = PLy_vprintf (fmt ,ap );
2912- va_end (ap );
2906+ initStringInfo (& emsg );
2907+ for (;;)
2908+ {
2909+ va_list ap ;
2910+ bool success ;
2911+
2912+ va_start (ap ,fmt );
2913+ success = appendStringInfoVA (& emsg ,fmt ,ap );
2914+ va_end (ap );
2915+ if (success )
2916+ break ;
2917+ enlargeStringInfo (& emsg ,emsg .maxlen );
2918+ }
29132919
29142920PG_TRY ();
29152921{
29162922ereport (elevel ,
2917- (errmsg ("plpython: %s" ,emsg ),
2923+ (errmsg ("plpython: %s" ,emsg . data ),
29182924 (xmsg ) ?errdetail ("%s" ,xmsg ) :0 ));
29192925}
29202926PG_CATCH ();
29212927{
2922- PLy_free (emsg );
2928+ pfree (emsg . data );
29232929if (xmsg )
2924- PLy_free (xmsg );
2930+ pfree (xmsg );
29252931PG_RE_THROW ();
29262932}
29272933PG_END_TRY ();
29282934
2929- PLy_free (emsg );
2935+ pfree (emsg . data );
29302936if (xmsg )
2931- PLy_free (xmsg );
2937+ pfree (xmsg );
29322938}
29332939
29342940static char *
@@ -2940,8 +2946,8 @@ PLy_traceback(int *xlevel)
29402946PyObject * eob ,
29412947* vob = NULL ;
29422948char * vstr ,
2943- * estr ,
2944- * xstr = NULL ;
2949+ * estr ;
2950+ StringInfoData xstr ;
29452951
29462952/*
29472953 * get the current exception
@@ -2973,7 +2979,8 @@ PLy_traceback(int *xlevel)
29732979 * Assert() be more appropriate?
29742980 */
29752981estr = eob ?PyString_AsString (eob ) :"Unknown Exception" ;
2976- xstr = PLy_printf ("%s: %s" ,estr ,vstr );
2982+ initStringInfo (& xstr );
2983+ appendStringInfo (& xstr ,"%s: %s" ,estr ,vstr );
29772984
29782985Py_DECREF (eob );
29792986Py_XDECREF (vob );
@@ -2990,49 +2997,7 @@ PLy_traceback(int *xlevel)
29902997* xlevel = ERROR ;
29912998
29922999Py_DECREF (e );
2993- return xstr ;
2994- }
2995-
2996- static char *
2997- PLy_printf (const char * fmt ,...)
2998- {
2999- va_list ap ;
3000- char * emsg ;
3001-
3002- va_start (ap ,fmt );
3003- emsg = PLy_vprintf (fmt ,ap );
3004- va_end (ap );
3005- return emsg ;
3006- }
3007-
3008- static char *
3009- PLy_vprintf (const char * fmt ,va_list ap )
3010- {
3011- size_t blen ;
3012- int bchar ,
3013- tries = 2 ;
3014- char * buf ;
3015-
3016- blen = strlen (fmt )* 2 ;
3017- if (blen < 256 )
3018- blen = 256 ;
3019- buf = PLy_malloc (blen * sizeof (char ));
3020-
3021- while (1 )
3022- {
3023- bchar = vsnprintf (buf ,blen ,fmt ,ap );
3024- if (bchar > 0 && bchar < blen )
3025- return buf ;
3026- if (tries -- <=0 )
3027- break ;
3028- if (blen > 0 )
3029- blen = bchar + 1 ;
3030- else
3031- blen *=2 ;
3032- buf = PLy_realloc (buf ,blen );
3033- }
3034- PLy_free (buf );
3035- return NULL ;
3000+ return xstr .data ;
30363001}
30373002
30383003/* python module code */
@@ -3050,18 +3015,6 @@ PLy_malloc(size_t bytes)
30503015return ptr ;
30513016}
30523017
3053- static void *
3054- PLy_realloc (void * optr ,size_t bytes )
3055- {
3056- void * nptr = realloc (optr ,bytes );
3057-
3058- if (nptr == NULL )
3059- ereport (FATAL ,
3060- (errcode (ERRCODE_OUT_OF_MEMORY ),
3061- errmsg ("out of memory" )));
3062- return nptr ;
3063- }
3064-
30653018static char *
30663019PLy_strdup (const char * str )
30673020{