2015-09-27 13:33 GMT+02:00 Nikolai Zhubr <n-a-zh...@yandex.ru>:

> Hi,
> 27.09.2015 8:29, Pavel Stehule:
>
>>     I'll check it.
>>
>>
>> It is working. Patch attached
>>
>
> Oh, brilliant! This is a _huge_ help actually!
>
> If I understand it correctly, any unhandled SQL-level exceptions will
> essentially be ignored there, so that the session will continue regardless?
>
> And maybe it could even be proposed for upstream?
> It is so wonderfully small and looks not too much intrusive.
>
>
>
updated patch - fixed error reporting

Regards

Pavel


>
> --
> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general
>
diff --git a/contrib/session_exec/Makefile b/contrib/session_exec/Makefile
new file mode 100644
index ...fd21d87
*** a/contrib/session_exec/Makefile
--- b/contrib/session_exec/Makefile
***************
*** 0 ****
--- 1,16 ----
+ # contrib/session_exec/Makefile
+ 
+ MODULE_big = session_exec
+ OBJS = session_exec.o $(WIN32RES)
+ PGFILEDESC = "session_exec - logging facility for execution plans"
+ 
+ ifdef USE_PGXS
+ PG_CONFIG = pg_config
+ PGXS := $(shell $(PG_CONFIG) --pgxs)
+ include $(PGXS)
+ else
+ subdir = contrib/session_exec
+ top_builddir = ../..
+ include $(top_builddir)/src/Makefile.global
+ include $(top_srcdir)/contrib/contrib-global.mk
+ endif
diff --git a/contrib/session_exec/session_exec.c b/contrib/session_exec/session_exec.c
new file mode 100644
index ...15cd5d9
*** a/contrib/session_exec/session_exec.c
--- b/contrib/session_exec/session_exec.c
***************
*** 0 ****
--- 1,94 ----
+ /*-------------------------------------------------------------------------
+  *
+  * session_exec.c
+  *
+  *
+  * Copyright (c) 2008-2015, PostgreSQL Global Development Group
+  *
+  * IDENTIFICATION
+  *	  contrib/session_exec/session_exec.c
+  *
+  *-------------------------------------------------------------------------
+  */
+ #include "postgres.h"
+ #include "fmgr.h"
+ #include "access/xact.h"
+ #include "catalog/namespace.h"
+ #include "storage/ipc.h"
+ #include "utils/builtins.h"
+ #include "utils/guc.h"
+ 
+ PG_MODULE_MAGIC;
+ 
+ void		_PG_init(void);
+ void		_PG_fini(void);
+ 
+ char *session_login_function_name = NULL;
+ 
+ /*
+  * Execute function named funcname. This function
+  * has not to have any parameters. This routine will
+  * be used for execution login/logout functions.
+  */
+ static void
+ exec_function(char *funcname)
+ {
+ 	FuncCandidateList clist;
+ 	List *names;
+ 
+ 	names = stringToQualifiedNameList(funcname);
+ 	clist = FuncnameGetCandidates(names, 0, NIL, false, false, true);
+ 
+ 	if (clist == NULL)
+ 		elog(WARNING, "function \"%s()\" does not exist", funcname);
+ 	else
+ 	{
+ 		/* execute function */
+ 		OidFunctionCall0(clist->oid);
+ 	}
+ }
+ 
+ void
+ _PG_init(void)
+ {
+ 	DefineCustomStringVariable("session_exec.login_name",
+ 	                           "Define function that will be executed on login",
+ 	                           "It is undefined by default",
+ 	                           &session_login_function_name,
+ 	                           NULL,
+ 	                           PGC_USERSET,
+ 	                           0, NULL, NULL, NULL);
+ 
+ 	if (session_login_function_name != NULL && *session_login_function_name != '\0')
+ 	{
+ 		MemoryContext	oldCtx = CurrentMemoryContext;
+ 
+ 		PG_TRY();
+ 		{
+ 			SetCurrentStatementStartTimestamp();
+ 			StartTransactionCommand();
+ 
+ 			exec_function(session_login_function_name);
+ 
+ 			CommitTransactionCommand();
+ 		}
+ 		PG_CATCH();
+ 		{
+ 			ErrorData	*edata;
+ 
+ 			MemoryContextSwitchTo(oldCtx);
+ 			edata = CopyErrorData();
+ 			FlushErrorState();
+ 
+ 			ereport(FATAL,
+ 					(errcode(ERRCODE_CONNECTION_FAILURE),
+ 					 errmsg("unhandled exception in login function \"%s\"",
+ 						    session_login_function_name),
+ 					 errdetail("%s", edata->message),
+ 					 errcontext("session_exec: perform login function \"%s\"",
+ 						    session_login_function_name),
+ 					 errcontext("%s", edata->context)));
+ 		}
+ 		PG_END_TRY();
+ 	}
+ }
-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

Reply via email to