END;
$func$ STRICT LANGUAGE plpgsql;
- CREATE OR REPLACE FUNCTION bdr_replication_identifier_advance(i_riname text, i_remote_lsn pg_lsn, i_local_lsn pg_lsn) RETURNS void
- AS $func$
- BEGIN
- UPDATE bdr.bdr_replication_identifier SET riremote_lsn = i_remote_lsn, rilocal_lsn = i_local_lsn WHERE riname = i_riname;
- END;
- $func$ STRICT LANGUAGE plpgsql;
+ CREATE OR REPLACE FUNCTION bdr_replication_identifier_advance(i_riname text, i_remote_lsn pg_lsn, i_local_lsn pg_lsn)
+ RETURNS VOID
+ LANGUAGE C
+ AS 'MODULE_PATHNAME';
- CREATE OR REPLACE FUNCTION bdr_replication_identifier_drop(i_riname text) RETURNS void
- AS $func$
- DECLARE
- v_riident int;
- BEGIN
- DELETE FROM bdr.bdr_replication_identifier WHERE riname = i_riname RETURNING riident INTO v_riident;
- IF FOUND THEN
- DELETE FROM bdr.bdr_replication_identifier_pos WHERE riident = v_riident;
- END IF;
- END;
- $func$ STRICT LANGUAGE plpgsql;
+ CREATE OR REPLACE FUNCTION bdr_replication_identifier_drop(i_riname text)
+ RETURNS VOID
+ LANGUAGE C
+ AS 'MODULE_PATHNAME';
CREATE OR REPLACE FUNCTION bdr.bdr_replication_identifier_is_replaying()
RETURNS boolean
static ReplicationState *local_replication_state = NULL;
PG_FUNCTION_INFO_V1(bdr_replication_identifier_is_replaying);
+PG_FUNCTION_INFO_V1(bdr_replication_identifier_advance);
+PG_FUNCTION_INFO_V1(bdr_replication_identifier_drop);
static void
EnsureReplicationIdentifierRelationId(void)
/* now release lock again, */
heap_close(rel, ExclusiveLock);
+ heap_close(relpos, ExclusiveLock);
}
void
PG_RETURN_BOOL(replication_origin_id != InvalidRepNodeId);
}
+
+Datum
+bdr_replication_identifier_advance(PG_FUNCTION_ARGS)
+{
+ text *name = PG_GETARG_TEXT_P(0);
+ XLogRecPtr remote_lsn = PG_GETARG_LSN(1);
+ XLogRecPtr local_lsn = PG_GETARG_LSN(2);
+ RepNodeId node;
+
+ CheckReplicationIdentifierPrerequisites(true);
+
+ node = GetReplicationIdentifier(text_to_cstring(name), false);
+
+ AdvanceReplicationIdentifier(node, remote_lsn, local_lsn);
+
+ PG_RETURN_VOID();
+}
+
+Datum
+bdr_replication_identifier_drop(PG_FUNCTION_ARGS)
+{
+ text *name = PG_GETARG_TEXT_P(0);
+ RepNodeId node;
+
+ CheckReplicationIdentifierPrerequisites(true);
+
+ node = GetReplicationIdentifier(text_to_cstring(name), false);
+
+ DropReplicationIdentifier(node);
+
+ PG_RETURN_VOID();
+}
extern void GetReplicationInfoByIdentifier(RepNodeId riident, bool missing_ok, char **riname);
extern Datum bdr_replication_identifier_is_replaying(PG_FUNCTION_ARGS);
+extern Datum bdr_replication_identifier_advance(PG_FUNCTION_ARGS);
+extern Datum bdr_replication_identifier_drop(PG_FUNCTION_ARGS);
/*
* bdr_replication_identifier struct