>
>> > years ago I tried it, if I remember well. I had a problems with SPI
>> calls,
>> > because some caches was not initialized. I am not sure, and I didn't
>> test
>> > last time.
>>
>> You'd have to start your own transaction if you wanted one, and any
>> uncaught error would effectively be FATAL because it would terminate the
>> session, but otherwise I don't see why that wouldn't work.
>>
>
> Probably I didn't start transaction.
>
> I'll check it.
>
It is working. Patch attached
Regards
Pavel
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 ...3bdead5
*** a/contrib/session_exec/session_exec.c
--- b/contrib/session_exec/session_exec.c
***************
*** 0 ****
--- 1,89 ----
+ /*-------------------------------------------------------------------------
+ *
+ * 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();
+
+ elog(FATAL, "exception in login function \"%s\"",
+ edata->message);
+ }
+ PG_END_TRY();
+ }
+ }
+
--
Sent via pgsql-general mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general