diff options
Diffstat (limited to 'src/backend/postmaster/bgworker.c')
-rw-r--r-- | src/backend/postmaster/bgworker.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/backend/postmaster/bgworker.c b/src/backend/postmaster/bgworker.c index b37ccb85ad6..13dc2cf064e 100644 --- a/src/backend/postmaster/bgworker.c +++ b/src/backend/postmaster/bgworker.c @@ -852,6 +852,89 @@ BackgroundWorkerMain(char *startup_data, size_t startup_data_len) } /* + * Connect background worker to a database. + */ +void +BackgroundWorkerInitializeConnection(const char *dbname, const char *username, uint32 flags) +{ + BackgroundWorker *worker = MyBgworkerEntry; + bits32 init_flags = 0; /* never honor session_preload_libraries */ + + /* ignore datallowconn? */ + if (flags & BGWORKER_BYPASS_ALLOWCONN) + init_flags |= INIT_PG_OVERRIDE_ALLOW_CONNS; + /* ignore rolcanlogin? */ + if (flags & BGWORKER_BYPASS_ROLELOGINCHECK) + init_flags |= INIT_PG_OVERRIDE_ROLE_LOGIN; + + /* XXX is this the right errcode? */ + if (!(worker->bgw_flags & BGWORKER_BACKEND_DATABASE_CONNECTION)) + ereport(FATAL, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("database connection requirement not indicated during registration"))); + + InitPostgres(dbname, InvalidOid, /* database to connect to */ + username, InvalidOid, /* role to connect as */ + init_flags, + NULL); /* no out_dbname */ + + /* it had better not gotten out of "init" mode yet */ + if (!IsInitProcessingMode()) + ereport(ERROR, + (errmsg("invalid processing mode in background worker"))); + SetProcessingMode(NormalProcessing); +} + +/* + * Connect background worker to a database using OIDs. + */ +void +BackgroundWorkerInitializeConnectionByOid(Oid dboid, Oid useroid, uint32 flags) +{ + BackgroundWorker *worker = MyBgworkerEntry; + bits32 init_flags = 0; /* never honor session_preload_libraries */ + + /* ignore datallowconn? */ + if (flags & BGWORKER_BYPASS_ALLOWCONN) + init_flags |= INIT_PG_OVERRIDE_ALLOW_CONNS; + /* ignore rolcanlogin? */ + if (flags & BGWORKER_BYPASS_ROLELOGINCHECK) + init_flags |= INIT_PG_OVERRIDE_ROLE_LOGIN; + + /* XXX is this the right errcode? */ + if (!(worker->bgw_flags & BGWORKER_BACKEND_DATABASE_CONNECTION)) + ereport(FATAL, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("database connection requirement not indicated during registration"))); + + InitPostgres(NULL, dboid, /* database to connect to */ + NULL, useroid, /* role to connect as */ + init_flags, + NULL); /* no out_dbname */ + + /* it had better not gotten out of "init" mode yet */ + if (!IsInitProcessingMode()) + ereport(ERROR, + (errmsg("invalid processing mode in background worker"))); + SetProcessingMode(NormalProcessing); +} + +/* + * Block/unblock signals in a background worker + */ +void +BackgroundWorkerBlockSignals(void) +{ + sigprocmask(SIG_SETMASK, &BlockSig, NULL); +} + +void +BackgroundWorkerUnblockSignals(void) +{ + sigprocmask(SIG_SETMASK, &UnBlockSig, NULL); +} + +/* * Register a new static background worker. * * This can only be called directly from postmaster or in the _PG_init |