Alvaro Herrera wrote:

> Now, the obvious big problem I have with this patch is that I have to
> pass plpgsql's locale path to bindtextdomain(), but I'm not seeing any
> decent way to do that ... ideas?

I think the best way to do this is to stash the library path being
loaded where _PG_init can find it.  It is a bit ugly but not beyond
belief.

Would anybody object to this?

-- 
Alvaro Herrera                                http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.
Index: src/backend/utils/error/elog.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/utils/error/elog.c,v
retrieving revision 1.206
diff -c -p -r1.206 elog.c
*** src/backend/utils/error/elog.c	1 Sep 2008 20:42:45 -0000	1.206
--- src/backend/utils/error/elog.c	8 Oct 2008 20:20:19 -0000
*************** static void write_csvlog(ErrorData *edat
*** 160,166 ****
   */
  bool
  errstart(int elevel, const char *filename, int lineno,
! 		 const char *funcname)
  {
  	ErrorData  *edata;
  	bool		output_to_server;
--- 160,166 ----
   */
  bool
  errstart(int elevel, const char *filename, int lineno,
! 		 const char *domain, const char *funcname)
  {
  	ErrorData  *edata;
  	bool		output_to_server;
*************** errstart(int elevel, const char *filenam
*** 290,295 ****
--- 290,296 ----
  	edata->filename = filename;
  	edata->lineno = lineno;
  	edata->funcname = funcname;
+ 	edata->domain = domain;
  	/* Select default errcode based on elevel */
  	if (elevel >= ERROR)
  		edata->sqlerrcode = ERRCODE_INTERNAL_ERROR;
*************** errcode_for_socket_access(void)
*** 611,617 ****
  		char		   *fmtbuf; \
  		StringInfoData	buf; \
  		/* Internationalize the error format string */ \
! 		fmt = _(fmt); \
  		/* Expand %m in format string */ \
  		fmtbuf = expand_fmt_string(fmt, edata); \
  		initStringInfo(&buf); \
--- 612,618 ----
  		char		   *fmtbuf; \
  		StringInfoData	buf; \
  		/* Internationalize the error format string */ \
! 		fmt = dgettext(edata->domain, fmt); \
  		/* Expand %m in format string */ \
  		fmtbuf = expand_fmt_string(fmt, edata); \
  		initStringInfo(&buf); \
*************** elog_finish(int elevel, const char *fmt,
*** 982,988 ****
  	 */
  	errordata_stack_depth--;
  	errno = edata->saved_errno;
! 	if (!errstart(elevel, edata->filename, edata->lineno, edata->funcname))
  		return;					/* nothing to do */
  
  	/*
--- 983,989 ----
  	 */
  	errordata_stack_depth--;
  	errno = edata->saved_errno;
! 	if (!errstart(elevel, edata->filename, edata->lineno, NULL, edata->funcname))
  		return;					/* nothing to do */
  
  	/*
Index: src/backend/utils/fmgr/dfmgr.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/utils/fmgr/dfmgr.c,v
retrieving revision 1.97
diff -c -p -r1.97 dfmgr.c
*** src/backend/utils/fmgr/dfmgr.c	3 Sep 2008 22:34:50 -0000	1.97
--- src/backend/utils/fmgr/dfmgr.c	8 Oct 2008 22:01:37 -0000
*************** static DynamicFileList *file_tail = NULL
*** 71,76 ****
--- 71,80 ----
  
  char	   *Dynamic_library_path;
  
+ /* for _PG_init: the path of the library being loaded */
+ char	   *loading_library_path;
+ 
+ 
  static void *internal_load_library(const char *libname);
  static void incompatible_module_error(const char *libname,
  									const Pg_magic_struct *module_magic_data);
*************** internal_load_library(const char *libnam
*** 276,281 ****
--- 280,288 ----
  				   errhint("Extension libraries are required to use the PG_MODULE_MAGIC macro.")));
  		}
  
+ 		/* make the library path available to _PG_init */
+ 		loading_library_path = file_scanner->filename;
+ 
  		/*
  		 * If the library has a _PG_init() function, call it.
  		 */
*************** internal_load_library(const char *libnam
*** 283,288 ****
--- 290,297 ----
  		if (PG_init)
  			(*PG_init) ();
  
+ 		loading_library_path = NULL;
+ 
  		/* OK to link it into list */
  		if (file_list == NULL)
  			file_list = file_scanner;
Index: src/include/miscadmin.h
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/include/miscadmin.h,v
retrieving revision 1.202
diff -c -p -r1.202 miscadmin.h
*** src/include/miscadmin.h	23 Apr 2008 13:44:59 -0000	1.202
--- src/include/miscadmin.h	8 Oct 2008 21:54:32 -0000
*************** extern void process_local_preload_librar
*** 334,337 ****
--- 334,340 ----
  extern bool BackupInProgress(void);
  extern void CancelBackup(void);
  
+ /* utils/dfmgr.c */
+ extern char *loading_library_path;
+ 
  #endif   /* MISCADMIN_H */
Index: src/include/utils/elog.h
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/include/utils/elog.h,v
retrieving revision 1.94
diff -c -p -r1.94 elog.h
*** src/include/utils/elog.h	1 Sep 2008 20:42:45 -0000	1.94
--- src/include/utils/elog.h	8 Oct 2008 21:57:31 -0000
***************
*** 92,105 ****
   * ERRCODE_INTERNAL_ERROR if elevel is ERROR or more, ERRCODE_WARNING
   * if elevel is WARNING, or ERRCODE_SUCCESSFUL_COMPLETION if elevel is
   * NOTICE or below.
   *----------
   */
! #define ereport(elevel, rest)  \
! 	(errstart(elevel, __FILE__, __LINE__, PG_FUNCNAME_MACRO) ? \
  	 (errfinish rest) : (void) 0)
  
  extern bool errstart(int elevel, const char *filename, int lineno,
! 		 const char *funcname);
  extern void errfinish(int dummy,...);
  
  extern int	errcode(int sqlerrcode);
--- 92,113 ----
   * ERRCODE_INTERNAL_ERROR if elevel is ERROR or more, ERRCODE_WARNING
   * if elevel is WARNING, or ERRCODE_SUCCESSFUL_COMPLETION if elevel is
   * NOTICE or below.
+  *
+  * ereport_domain() allows a message domain to be specified, for modules that
+  * wish to use a different message catalog from the backend's.  Modules can
+  * either use ereport_domain() directly, or preferrably they can just override
+  * the ereport() macro definition with their own domain.
   *----------
   */
! #define ereport_domain(elevel, domain, rest)	\
! 	(errstart(elevel, __FILE__, __LINE__, domain, PG_FUNCNAME_MACRO) ? \
  	 (errfinish rest) : (void) 0)
  
+ #define ereport(level, rest)	\
+ 	ereport_domain(level, "postgres", rest)
+ 
  extern bool errstart(int elevel, const char *filename, int lineno,
! 		 const char *domain, const char *funcname);
  extern void errfinish(int dummy,...);
  
  extern int	errcode(int sqlerrcode);
*************** typedef struct ErrorData
*** 270,275 ****
--- 278,284 ----
  	int			lineno;			/* __LINE__ of ereport() call */
  	const char *funcname;		/* __func__ of ereport() call */
  	int			sqlerrcode;		/* encoded ERRSTATE */
+ 	const char *domain;			/* message domain, NULL if default */
  	char	   *message;		/* primary error message */
  	char	   *detail;			/* detail error message */
  	char	   *detail_log;		/* detail error message for server log only */
Index: src/pl/plpgsql/src/gram.y
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/pl/plpgsql/src/gram.y,v
retrieving revision 1.115
diff -c -p -r1.115 gram.y
*** src/pl/plpgsql/src/gram.y	10 Sep 2008 01:09:45 -0000	1.115
--- src/pl/plpgsql/src/gram.y	8 Oct 2008 22:23:58 -0000
***************
*** 18,23 ****
--- 18,25 ----
  
  #include "parser/parser.h"
  
+ #include "plpgsql_i18n.h"
+ 
  
  /*
   * Bison doesn't allocate anything that needs to live across parser calls,
Index: src/pl/plpgsql/src/pl_comp.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/pl/plpgsql/src/pl_comp.c,v
retrieving revision 1.130
diff -c -p -r1.130 pl_comp.c
*** src/pl/plpgsql/src/pl_comp.c	1 Sep 2008 20:42:46 -0000	1.130
--- src/pl/plpgsql/src/pl_comp.c	8 Oct 2008 18:14:31 -0000
***************
*** 37,42 ****
--- 37,43 ----
  #include "utils/memutils.h"
  #include "utils/syscache.h"
  
+ #include "plpgsql_i18n.h"
  
  /* ----------
   * Our own local and global variables
Index: src/pl/plpgsql/src/pl_exec.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/pl/plpgsql/src/pl_exec.c,v
retrieving revision 1.221
diff -c -p -r1.221 pl_exec.c
*** src/pl/plpgsql/src/pl_exec.c	24 Sep 2008 14:40:00 -0000	1.221
--- src/pl/plpgsql/src/pl_exec.c	8 Oct 2008 17:44:31 -0000
***************
*** 32,37 ****
--- 32,38 ----
  #include "utils/snapmgr.h"
  #include "utils/typcache.h"
  
+ #include "plpgsql_i18n.h"		/* must be last */
  
  static const char *const raise_skip_msg = "RAISE";
  
Index: src/pl/plpgsql/src/pl_funcs.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/pl/plpgsql/src/pl_funcs.c,v
retrieving revision 1.73
diff -c -p -r1.73 pl_funcs.c
*** src/pl/plpgsql/src/pl_funcs.c	29 Aug 2008 13:02:33 -0000	1.73
--- src/pl/plpgsql/src/pl_funcs.c	8 Oct 2008 22:22:56 -0000
***************
*** 19,24 ****
--- 19,25 ----
  
  #include "parser/scansup.h"
  
+ #include "plpgsql_i18n.h"
  
  /* ----------
   * Local variables for the namestack handling
Index: src/pl/plpgsql/src/pl_handler.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/pl/plpgsql/src/pl_handler.c,v
retrieving revision 1.40
diff -c -p -r1.40 pl_handler.c
*** src/pl/plpgsql/src/pl_handler.c	29 Aug 2008 13:02:33 -0000	1.40
--- src/pl/plpgsql/src/pl_handler.c	8 Oct 2008 21:56:16 -0000
*************** _PG_init(void)
*** 42,47 ****
--- 42,57 ----
  	if (inited)
  		return;
  
+ #ifdef ENABLE_NLS
+ 	if (loading_library_path)
+ 	{
+ 		char	locale_path[MAXPGPATH];
+ 
+ 		get_locale_path(loading_library_path, locale_path);
+ 		bindtextdomain("plpgsql", locale_path);
+ 	}
+ #endif
+ 	
  	plpgsql_HashTableInit();
  	RegisterXactCallback(plpgsql_xact_cb, NULL);
  	RegisterSubXactCallback(plpgsql_subxact_cb, NULL);
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to