mirror of
https://github.com/postgres/postgres.git
synced 2025-08-22 21:53:06 +03:00
Optionally don't error out due to preexisting slots in commandline utilities.
pg_receivexlog and pg_recvlogical error out when --create-slot is specified and a slot with the same name already exists. In some cases, especially with pg_receivexlog, that's rather annoying and requires additional scripting. Backpatch to 9.5 as slot control functions have newly been added to pg_receivexlog, and there doesn't seem much point leaving it in a less useful state. Discussion: 20150619144755.GG29350@alap3.anarazel.de
This commit is contained in:
@@ -31,6 +31,8 @@
|
||||
#include "common/fe_memutils.h"
|
||||
#include "datatype/timestamp.h"
|
||||
|
||||
#define ERRCODE_DUPLICATE_OBJECT "42710"
|
||||
|
||||
const char *progname;
|
||||
char *connection_string = NULL;
|
||||
char *dbhost = NULL;
|
||||
@@ -314,7 +316,7 @@ RunIdentifySystem(PGconn *conn, char **sysid, TimeLineID *starttli,
|
||||
*/
|
||||
bool
|
||||
CreateReplicationSlot(PGconn *conn, const char *slot_name, const char *plugin,
|
||||
XLogRecPtr *startpos, bool is_physical)
|
||||
bool is_physical, bool slot_exists_ok)
|
||||
{
|
||||
PQExpBuffer query;
|
||||
PGresult *res;
|
||||
@@ -336,12 +338,23 @@ CreateReplicationSlot(PGconn *conn, const char *slot_name, const char *plugin,
|
||||
res = PQexec(conn, query->data);
|
||||
if (PQresultStatus(res) != PGRES_TUPLES_OK)
|
||||
{
|
||||
fprintf(stderr, _("%s: could not send replication command \"%s\": %s"),
|
||||
progname, query->data, PQerrorMessage(conn));
|
||||
const char *sqlstate = PQresultErrorField(res, PG_DIAG_SQLSTATE);
|
||||
|
||||
destroyPQExpBuffer(query);
|
||||
PQclear(res);
|
||||
return false;
|
||||
if (slot_exists_ok && strcmp(sqlstate, ERRCODE_DUPLICATE_OBJECT) == 0)
|
||||
{
|
||||
destroyPQExpBuffer(query);
|
||||
PQclear(res);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, _("%s: could not send replication command \"%s\": %s"),
|
||||
progname, query->data, PQerrorMessage(conn));
|
||||
|
||||
destroyPQExpBuffer(query);
|
||||
PQclear(res);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (PQntuples(res) != 1 || PQnfields(res) != 4)
|
||||
@@ -356,25 +369,6 @@ CreateReplicationSlot(PGconn *conn, const char *slot_name, const char *plugin,
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Get LSN start position if necessary */
|
||||
if (startpos != NULL)
|
||||
{
|
||||
uint32 hi,
|
||||
lo;
|
||||
|
||||
if (sscanf(PQgetvalue(res, 0, 1), "%X/%X", &hi, &lo) != 2)
|
||||
{
|
||||
fprintf(stderr,
|
||||
_("%s: could not parse transaction log location \"%s\"\n"),
|
||||
progname, PQgetvalue(res, 0, 1));
|
||||
|
||||
destroyPQExpBuffer(query);
|
||||
PQclear(res);
|
||||
return false;
|
||||
}
|
||||
*startpos = ((uint64) hi) << 32 | lo;
|
||||
}
|
||||
|
||||
destroyPQExpBuffer(query);
|
||||
PQclear(res);
|
||||
return true;
|
||||
|
Reference in New Issue
Block a user