diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 24346fb871..52a964170e 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -3861,7 +3861,7 @@ PostgresMain(int argc, char *argv[], PgStartTime = GetCurrentTimestamp(); if (session_start_hook) - (*session_start_hook) (dbname, username); + (*session_start_hook) (); /* * POSTGRES main processing loop begins here diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index 029eeb40a4..4faad231c4 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -1160,7 +1160,7 @@ ShutdownPostgres(int code, Datum arg) /* Hook just normal backends */ if (session_end_hook && MyBackendId != InvalidBackendId) { - (*session_end_hook) (MyProcPort->database_name, MyProcPort->user_name); + (*session_end_hook) (); /* Make don't leave any active transactions and/or locks behind */ AbortOutOfAnyTransaction(); diff --git a/src/include/tcop/tcopprot.h b/src/include/tcop/tcopprot.h index b7fb8c34b3..9f05bfb4ab 100644 --- a/src/include/tcop/tcopprot.h +++ b/src/include/tcop/tcopprot.h @@ -36,10 +36,8 @@ extern int max_stack_depth; extern int PostAuthDelay; /* Hook for plugins to get control at start and end of session */ -typedef void (*session_start_hook_type) (const char *dbname, - const char *username); -typedef void (*session_end_hook_type) (const char *dbname, - const char *username); +typedef void (*session_start_hook_type) (void); +typedef void (*session_end_hook_type) (void); extern PGDLLIMPORT session_start_hook_type session_start_hook; extern PGDLLIMPORT session_end_hook_type session_end_hook; diff --git a/src/test/modules/test_session_hooks/test_session_hooks.c b/src/test/modules/test_session_hooks/test_session_hooks.c index 96b244fc48..00f17aeec2 100644 --- a/src/test/modules/test_session_hooks/test_session_hooks.c +++ b/src/test/modules/test_session_hooks/test_session_hooks.c @@ -13,8 +13,10 @@ #include "postgres.h" #include "access/xact.h" +#include "commands/dbcommands.h" #include "executor/spi.h" #include "lib/stringinfo.h" +#include "miscadmin.h" #include "tcop/tcopprot.h" #include "utils/snapmgr.h" #include "utils/builtins.h" @@ -34,52 +36,57 @@ static session_start_hook_type prev_session_start_hook = NULL; static session_end_hook_type prev_session_end_hook = NULL; static void -register_session_hook(const char *dbname, const char *username, const char *hook_at) +register_session_hook(const char *hook_at) { int ret; StringInfoData buf; + const char *dbname; + const char *username; - if (!strcmp(dbname, "session_hook_db")) - { - StartTransactionCommand(); - SPI_connect(); - PushActiveSnapshot(GetTransactionSnapshot()); - initStringInfo(&buf); - - appendStringInfo(&buf, "INSERT INTO session_hook_log (dbname, username, hook_at) "); - appendStringInfo(&buf, "VALUES ('%s', '%s', '%s');", - dbname, username, hook_at); - - ret = SPI_exec(buf.data, 0); - if (ret != SPI_OK_INSERT) - elog(FATAL, "SPI_execute failed: error code %d", ret); - - SPI_finish(); - PopActiveSnapshot(); - CommitTransactionCommand(); - } + StartTransactionCommand(); + + SPI_connect(); + PushActiveSnapshot(GetTransactionSnapshot()); + initStringInfo(&buf); + + dbname = get_database_name(MyDatabaseId); + username = GetUserNameFromId(GetUserId(), false); + + elog(LOG, "%s session hook called", hook_at); + + appendStringInfo(&buf, "INSERT INTO session_hook_log (dbname, username, hook_at) "); + appendStringInfo(&buf, "VALUES ('%s', '%s', '%s');", + dbname, username, hook_at); + + ret = SPI_exec(buf.data, 0); + if (ret != SPI_OK_INSERT) + elog(FATAL, "SPI_execute failed: error code %d", ret); + + SPI_finish(); + PopActiveSnapshot(); + CommitTransactionCommand(); } /* sample session start hook function */ static void -sample_session_start_hook(const char *dbname, const char *username) +sample_session_start_hook(void) { if (prev_session_start_hook) - prev_session_start_hook(dbname, username); + prev_session_start_hook(); if (session_start_hook_enabled) - (void) register_session_hook(dbname, username, "START"); + (void) register_session_hook("START"); } /* sample sessoin end hook function */ static void -sample_session_end_hook(const char *dbname, const char *username) +sample_session_end_hook(void) { if (prev_session_end_hook) - prev_session_end_hook(dbname, username); + prev_session_end_hook(); if (session_end_hook_enabled) - (void) register_session_hook(dbname, username, "END"); + (void) register_session_hook("END"); } /*