| /*------------------------------------------------------------------------- |
| * |
| * basebackup_sink.c |
| * Default implementations for bbsink (basebackup sink) callbacks. |
| * |
| * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group |
| * |
| * src/backend/backup/basebackup_sink.c |
| * |
| *------------------------------------------------------------------------- |
| */ |
| |
| #include "postgres.h" |
| |
| #include "backup/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 successor 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 initialize 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); |
| } |