session_hook_simplify.patch
application/octet-stream
Filename: session_hook_simplify.patch
Type: application/octet-stream
Part: 0
Message:
Re: [PATCH] A hook for session start
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/tcop/postgres.c | 1 | 1 |
| src/backend/utils/init/postinit.c | 1 | 1 |
| src/include/tcop/tcopprot.h | 2 | 4 |
| src/test/modules/test_session_hooks/test_session_hooks.c | 33 | 26 |
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");
}
/*