1 /*------------------------------------------------------------------------- 2 * 3 * walmethods.h 4 * 5 * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group 6 * 7 * IDENTIFICATION 8 * src/bin/pg_basebackup/walmethods.h 9 *------------------------------------------------------------------------- 10 */ 11 12 13 typedef void *Walfile; 14 15 typedef enum 16 { 17 CLOSE_NORMAL, 18 CLOSE_UNLINK, 19 CLOSE_NO_RENAME 20 } WalCloseMethod; 21 22 /* 23 * A WalWriteMethod structure represents the different methods used 24 * to write the streaming WAL as it's received. 25 * 26 * All methods that have a failure return indicator will set state 27 * allowing the getlasterror() method to return a suitable message. 28 * Commonly, errno is this state (or part of it); so callers must take 29 * care not to clobber errno between a failed method call and use of 30 * getlasterror() to retrieve the message. 31 */ 32 typedef struct WalWriteMethod WalWriteMethod; 33 struct WalWriteMethod 34 { 35 /* 36 * Open a target file. Returns Walfile, or NULL if open failed. If a temp 37 * suffix is specified, a file with that name will be opened, and then 38 * automatically renamed in close(). If pad_to_size is specified, the file 39 * will be padded with NUL up to that size, if supported by the Walmethod. 40 */ 41 Walfile (*open_for_write) (const char *pathname, const char *temp_suffix, size_t pad_to_size); 42 43 /* 44 * Close an open Walfile, using one or more methods for handling automatic 45 * unlinking etc. Returns 0 on success, other values for error. 46 */ 47 int (*close) (Walfile f, WalCloseMethod method); 48 49 /* Check if a file exist */ 50 bool (*existsfile) (const char *pathname); 51 52 /* Return the size of a file, or -1 on failure. */ 53 ssize_t (*get_file_size) (const char *pathname); 54 55 /* 56 * Return the name of the current file to work on in pg_malloc()'d string, 57 * without the base directory. This is useful for logging. 58 */ 59 char *(*get_file_name) (const char *pathname, const char *temp_suffix); 60 61 /* Return the level of compression */ 62 int (*compression) (void); 63 64 /* 65 * Write count number of bytes to the file, and return the number of bytes 66 * actually written or -1 for error. 67 */ 68 ssize_t (*write) (Walfile f, const void *buf, size_t count); 69 70 /* Return the current position in a file or -1 on error */ 71 off_t (*get_current_pos) (Walfile f); 72 73 /* 74 * fsync the contents of the specified file. Returns 0 on success. 75 */ 76 int (*sync) (Walfile f); 77 78 /* 79 * Clean up the Walmethod, closing any shared resources. For methods like 80 * tar, this includes writing updated headers. Returns true if the 81 * close/write/sync of shared resources succeeded, otherwise returns false 82 * (but the resources are still closed). 83 */ 84 bool (*finish) (void); 85 86 /* Return a text for the last error in this Walfile */ 87 const char *(*getlasterror) (void); 88 }; 89 90 /* 91 * Available WAL methods: 92 * - WalDirectoryMethod - write WAL to regular files in a standard pg_wal 93 * - TarDirectoryMethod - write WAL to a tarfile corresponding to pg_wal 94 * (only implements the methods required for pg_basebackup, 95 * not all those required for pg_receivewal) 96 */ 97 WalWriteMethod *CreateWalDirectoryMethod(const char *basedir, 98 int compression, bool sync); 99 WalWriteMethod *CreateWalTarMethod(const char *tarbase, int compression, bool sync); 100 101 /* Cleanup routines for previously-created methods */ 102 void FreeWalDirectoryMethod(void); 103 void FreeWalTarMethod(void); 104