77 * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
88 * Portions Copyright (c) 1994, Regents of the University of California
99 *
10- * $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.3 2006/12/24 00:29:19 tgl Exp $
10+ * $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.4 2006/12/24 00:57:48 tgl Exp $
1111 *
1212 *-------------------------------------------------------------------------
1313 */
4242#ifdef USE_LIBXML
4343
4444#define PG_XML_DEFAULT_URI "dummy.xml"
45- #define XML_ERRBUF_SIZE 200
4645
4746
4847static void xml_init (void );
@@ -60,8 +59,7 @@ static xmlDocPtr xml_parse(text *data, int opts, bool is_document);
6059/* Global variables */
6160/* taken from contrib/xml2 */
6261/* FIXME: DO NOT USE global vars !!! */
63- char * xml_errbuf ;/* per line error buffer */
64- char * xml_errmsg = NULL ;/* overall error message */
62+ static char * xml_errmsg = NULL ;/* overall error message */
6563
6664#endif /* USE_LIBXML */
6765
@@ -376,8 +374,6 @@ xml_init(void)
376374/* do not flood PG's logfile with libxml error messages - reset error handler*/
377375xmlSetGenericErrorFunc (NULL ,xml_errorHandler );
378376xml_errmsg = NULL ;
379- xml_errbuf = palloc (XML_ERRBUF_SIZE );
380- memset (xml_errbuf ,0 ,XML_ERRBUF_SIZE );
381377}
382378
383379
@@ -563,6 +559,7 @@ xml_ereport(int level, char *msg, void *ctxt)
563559{
564560ereport (DEBUG1 , (errmsg ("%s" ,xml_errmsg )));
565561pfree (xml_errmsg );
562+ xml_errmsg = NULL ;
566563}
567564
568565if (ctxt != NULL )
@@ -605,23 +602,26 @@ xml_ereport(int level, char *msg, void *ctxt)
605602static void
606603xml_errorHandler (void * ctxt ,const char * msg ,...)
607604{
605+ char xml_errbuf [256 ];
608606va_list args ;
609607
608+ /* Format this message ... */
610609va_start (args ,msg );
611- vsnprintf (xml_errbuf ,XML_ERRBUF_SIZE ,msg ,args );
610+ vsnprintf (xml_errbuf ,sizeof ( xml_errbuf ) - 1 ,msg ,args );
612611va_end (args );
613- /* Now copy the argument across */
612+ xml_errbuf [sizeof (xml_errbuf )- 1 ]= '\0' ;
613+
614+ /* ... and append to xml_errbuf */
614615if (xml_errmsg == NULL )
615616xml_errmsg = pstrdup (xml_errbuf );
616617else
617618{
618619int32 xsize = strlen (xml_errmsg );
619620
620- xml_errmsg = repalloc (xml_errmsg , ( size_t ) ( xsize + strlen ( xml_errbuf ) + 1 ));
621- strncpy ( & xml_errmsg [ xsize - 1 ], xml_errbuf , strlen (xml_errbuf ));
622- xml_errmsg [xsize + strlen ( xml_errbuf ) - 1 ]= '\0' ;
621+ xml_errmsg = repalloc (xml_errmsg ,
622+ ( size_t ) ( xsize + strlen (xml_errbuf ) + 1 ));
623+ strcpy ( & xml_errmsg [xsize - 1 ], xml_errbuf ) ;
623624}
624- memset (xml_errbuf ,0 ,XML_ERRBUF_SIZE );
625625}
626626
627627
@@ -800,13 +800,15 @@ xml_ereport_by_code(int level, char *msg, int code)
800800break ;
801801default :
802802det = "Unregistered error (libxml error code: %d)" ;
803- ereport (DEBUG1 , (errmsg ("Check out \"libxml/xmlerror.h\" and bring errcode \"%d\" processing to \"xml.c\"." ,code )));
803+ ereport (DEBUG1 ,
804+ (errmsg_internal ("Check out \"libxml/xmlerror.h\" and bring errcode \"%d\" processing to \"xml.c\"." ,code )));
804805 }
805806
806807if (xml_errmsg != NULL )
807808{
808809ereport (DEBUG1 , (errmsg ("%s" ,xml_errmsg )));
809810pfree (xml_errmsg );
811+ xml_errmsg = NULL ;
810812}
811813
812814ereport (level , (errmsg (msg ),errdetail (det ,code )));
@@ -820,21 +822,17 @@ xml_ereport_by_code(int level, char *msg, int code)
820822static pg_wchar
821823sqlchar_to_unicode (char * s )
822824{
823- int save_enc ;
824- pg_wchar ret ;
825825char * utf8string ;
826+ pg_wchar ret [2 ];/* need space for trailing zero */
826827
827828utf8string = (char * )pg_do_encoding_conversion ((unsignedchar * )s ,
828829pg_mblen (s ),
829830GetDatabaseEncoding (),
830831PG_UTF8 );
831832
832- save_enc = GetDatabaseEncoding ();
833- SetDatabaseEncoding (PG_UTF8 );
834- pg_mb2wchar_with_len (utf8string ,& ret ,pg_mblen (s ));
835- SetDatabaseEncoding (save_enc );
833+ pg_encoding_mb2wchar_with_len (PG_UTF8 ,utf8string ,ret ,pg_mblen (s ));
836834
837- return ret ;
835+ return ret [ 0 ] ;
838836}
839837
840838