Attached patch implements a function called pg_primary_conninfo() that returns, well, the primary_conninfo used on the standby when in streaming replication mode (otherwise NULL).
Objections? -- Magnus Hagander Me: http://www.hagander.net/ Work: http://www.redpill-linpro.com/
*** a/doc/src/sgml/func.sgml --- b/doc/src/sgml/func.sgml *************** *** 14098,14103 **** postgres=# SELECT * FROM pg_xlogfile_name_offset(pg_stop_backup()); --- 14098,14106 ---- <indexterm> <primary>pg_last_xact_replay_timestamp</primary> </indexterm> + <indexterm> + <primary>pg_primary_conninfo</primary> + </indexterm> <para> The functions shown in <xref *************** *** 14168,14173 **** postgres=# SELECT * FROM pg_xlogfile_name_offset(pg_stop_backup()); --- 14171,14187 ---- the function returns NULL. </entry> </row> + <row> + <entry> + <literal><function>pg_primary_conninfo()</function></literal> + </entry> + <entry><type>text</type></entry> + <entry>Gets the connection string used to connect to the primary + when using streaming replication. When the server has been started + normally without recovery, or when file based recovery is in + progress, the function returns NULL. + </entry> + </row> </tbody> </tgroup> </table> *** a/src/backend/access/transam/xlog.c --- b/src/backend/access/transam/xlog.c *************** *** 8829,8834 **** pg_last_xlog_replay_location(PG_FUNCTION_ARGS) --- 8829,8857 ---- } /* + * Report the connection info that the walreceiver is using to talk to the + * primary. + */ + Datum + pg_primary_conninfo(PG_FUNCTION_ARGS) + { + /* use volatile pointer to prevent code rearrangement */ + volatile WalRcvData *walrcv = WalRcv; + XLogRecPtr recptr; + char conninfo[MAXCONNINFO]; + + SpinLockAcquire(&walrcv->mutex); + recptr = walrcv->receivedUpto; + memcpy(conninfo, walrcv->conninfo, MAXCONNINFO); + SpinLockRelease(&walrcv->mutex); + + if (recptr.xlogid == 0 && recptr.xrecoff == 0 && conninfo[0] != '\0') + PG_RETURN_NULL(); + + PG_RETURN_TEXT_P(cstring_to_text(conninfo)); + } + + /* * Compute an xlog file name and decimal byte offset given a WAL location, * such as is returned by pg_stop_backup() or pg_xlog_switch(). * *** a/src/include/catalog/pg_proc.h --- b/src/include/catalog/pg_proc.h *************** *** 3386,3392 **** DESCR("xlog filename, given an xlog location"); DATA(insert OID = 3810 ( pg_is_in_recovery PGNSP PGUID 12 1 0 0 f f f t f v 0 0 16 "" _null_ _null_ _null_ _null_ pg_is_in_recovery _null_ _null_ _null_ )); DESCR("true if server is in recovery"); ! DATA(insert OID = 3820 ( pg_last_xlog_receive_location PGNSP PGUID 12 1 0 0 f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ pg_last_xlog_receive_location _null_ _null_ _null_ )); DESCR("current xlog flush location"); DATA(insert OID = 3821 ( pg_last_xlog_replay_location PGNSP PGUID 12 1 0 0 f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ pg_last_xlog_replay_location _null_ _null_ _null_ )); --- 3386,3393 ---- DATA(insert OID = 3810 ( pg_is_in_recovery PGNSP PGUID 12 1 0 0 f f f t f v 0 0 16 "" _null_ _null_ _null_ _null_ pg_is_in_recovery _null_ _null_ _null_ )); DESCR("true if server is in recovery"); ! DATA(insert OID = 3819 ( pg_primary_conninfo PGNSP PGUID 12 1 0 0 f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ pg_primary_conninfo _null_ _null_ _null_ )); ! DESCR("connection string for primary"); DATA(insert OID = 3820 ( pg_last_xlog_receive_location PGNSP PGUID 12 1 0 0 f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ pg_last_xlog_receive_location _null_ _null_ _null_ )); DESCR("current xlog flush location"); DATA(insert OID = 3821 ( pg_last_xlog_replay_location PGNSP PGUID 12 1 0 0 f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ pg_last_xlog_replay_location _null_ _null_ _null_ ));
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers