36 const char *(*link_map) (
const char *);
90 streamer->
file = file;
94 streamer->
file = fopen(pathname,
"wb");
95 if (streamer->
file == NULL)
96 pg_fatal(
"could not create file \"%s\": %m", pathname);
100 return &streamer->
base;
124 pg_fatal(
"could not write to file \"%s\": %m",
141 pg_fatal(
"could not close file \"%s\": %m",
144 mystreamer->
file = NULL;
187 const char *(*link_map) (
const char *),
188 void (*report_output_file) (
const char *))
199 return &streamer->
base;
226 fnamelen = strlen(mystreamer->
filename);
227 if (mystreamer->
filename[fnamelen - 1] ==
'/')
228 mystreamer->
filename[fnamelen - 1] =
'\0';
238 linktarget = mystreamer->
link_map(linktarget);
252 if (mystreamer->
file == NULL)
261 pg_fatal(
"could not write to file \"%s\": %m",
267 if (mystreamer->
file == NULL)
269 fclose(mystreamer->
file);
270 mystreamer->
file = NULL;
278 pg_fatal(
"unexpected state while extracting archive");
299 if (strcmp(
filename,
"pg_wal") == 0 ||
301 strcmp(
filename,
"archive_status") == 0 ||
302 strcmp(
filename,
"summaries") == 0 ||
308 const char *pg_tblspc = strstr(pathname,
"/pg_tblspc/");
310 return pg_tblspc != NULL && pg_tblspc + 11 ==
filename;
324 pg_fatal(
"could not create directory \"%s\": %m",
329 pg_fatal(
"could not set permissions on directory \"%s\": %m",
348 pg_fatal(
"could not create symbolic link from \"%s\" to \"%s\": %m",
368 pg_fatal(
"could not set permissions on file \"%s\": %m",
386 Assert(mystreamer->file == NULL);
astreamer_archive_context
@ ASTREAMER_MEMBER_HEADER
@ ASTREAMER_MEMBER_CONTENTS
@ ASTREAMER_MEMBER_TRAILER
@ ASTREAMER_ARCHIVE_TRAILER
astreamer * astreamer_plain_writer_new(char *pathname, FILE *file)
static void astreamer_plain_writer_content(astreamer *streamer, astreamer_member *member, const char *data, int len, astreamer_archive_context context)
static void astreamer_extractor_finalize(astreamer *streamer)
static void extract_directory(const char *filename, mode_t mode)
static FILE * create_file_for_extract(const char *filename, mode_t mode)
static const astreamer_ops astreamer_extractor_ops
struct astreamer_extractor astreamer_extractor
astreamer * astreamer_extractor_new(const char *basepath, const char *(*link_map)(const char *), void(*report_output_file)(const char *))
struct astreamer_plain_writer astreamer_plain_writer
static void astreamer_plain_writer_finalize(astreamer *streamer)
static void astreamer_extractor_free(astreamer *streamer)
static void astreamer_extractor_content(astreamer *streamer, astreamer_member *member, const char *data, int len, astreamer_archive_context context)
static const astreamer_ops astreamer_plain_writer_ops
static bool should_allow_existing_directory(const char *pathname)
static void extract_link(const char *filename, const char *linktarget)
static void astreamer_plain_writer_free(astreamer *streamer)
#define PG_USED_FOR_ASSERTS_ONLY
#define Assert(condition)
char * pstrdup(const char *in)
void pfree(void *pointer)
void * palloc0(Size size)
static PgChecksumMode mode
char * last_dir_separator(const char *filename)
char linktarget[MAXPGPATH]
void(* content)(astreamer *streamer, astreamer_member *member, const char *data, int len, astreamer_archive_context context)
const astreamer_ops * bbs_ops
#define symlink(oldpath, newpath)