diff options
Diffstat (limited to 'src/backend/replication/basebackup_sink.c')
-rw-r--r-- | src/backend/replication/basebackup_sink.c | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/src/backend/replication/basebackup_sink.c b/src/backend/replication/basebackup_sink.c new file mode 100644 index 00000000000..4a47854f81f --- /dev/null +++ b/src/backend/replication/basebackup_sink.c @@ -0,0 +1,125 @@ +/*------------------------------------------------------------------------- + * + * basebackup_sink.c + * Default implementations for bbsink (basebackup sink) callbacks. + * + * Portions Copyright (c) 2010-2021, PostgreSQL Global Development Group + * + * src/backend/replication/basebackup_sink.c + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "replication/basebackup_sink.h" + +/* + * Forward begin_backup callback. + * + * Only use this implementation if you want the bbsink you're implementing to + * share a buffer with the succesor bbsink. + */ +void +bbsink_forward_begin_backup(bbsink *sink) +{ + Assert(sink->bbs_next != NULL); + Assert(sink->bbs_state != NULL); + bbsink_begin_backup(sink->bbs_next, sink->bbs_state, + sink->bbs_buffer_length); + sink->bbs_buffer = sink->bbs_next->bbs_buffer; +} + +/* + * Forward begin_archive callback. + */ +void +bbsink_forward_begin_archive(bbsink *sink, const char *archive_name) +{ + Assert(sink->bbs_next != NULL); + bbsink_begin_archive(sink->bbs_next, archive_name); +} + +/* + * Forward archive_contents callback. + * + * Code that wants to use this should initalize its own bbs_buffer and + * bbs_buffer_length fields to the values from the successor sink. In cases + * where the buffer isn't shared, the data needs to be copied before forwarding + * the callback. We don't do try to do that here, because there's really no + * reason to have separately allocated buffers containing the same identical + * data. + */ +void +bbsink_forward_archive_contents(bbsink *sink, size_t len) +{ + Assert(sink->bbs_next != NULL); + Assert(sink->bbs_buffer == sink->bbs_next->bbs_buffer); + Assert(sink->bbs_buffer_length == sink->bbs_next->bbs_buffer_length); + bbsink_archive_contents(sink->bbs_next, len); +} + +/* + * Forward end_archive callback. + */ +void +bbsink_forward_end_archive(bbsink *sink) +{ + Assert(sink->bbs_next != NULL); + bbsink_end_archive(sink->bbs_next); +} + +/* + * Forward begin_manifest callback. + */ +void +bbsink_forward_begin_manifest(bbsink *sink) +{ + Assert(sink->bbs_next != NULL); + bbsink_begin_manifest(sink->bbs_next); +} + +/* + * Forward manifest_contents callback. + * + * As with the archive_contents callback, it's expected that the buffer is + * shared. + */ +void +bbsink_forward_manifest_contents(bbsink *sink, size_t len) +{ + Assert(sink->bbs_next != NULL); + Assert(sink->bbs_buffer == sink->bbs_next->bbs_buffer); + Assert(sink->bbs_buffer_length == sink->bbs_next->bbs_buffer_length); + bbsink_manifest_contents(sink->bbs_next, len); +} + +/* + * Forward end_manifest callback. + */ +void +bbsink_forward_end_manifest(bbsink *sink) +{ + Assert(sink->bbs_next != NULL); + bbsink_end_manifest(sink->bbs_next); +} + +/* + * Forward end_backup callback. + */ +void +bbsink_forward_end_backup(bbsink *sink, XLogRecPtr endptr, TimeLineID endtli) +{ + Assert(sink->bbs_next != NULL); + bbsink_end_backup(sink->bbs_next, endptr, endtli); +} + +/* + * Forward cleanup callback. + */ +void +bbsink_forward_cleanup(bbsink *sink) +{ + Assert(sink->bbs_next != NULL); + bbsink_cleanup(sink->bbs_next); +} |