1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * walmethods.h |
4 | * |
5 | * Portions Copyright (c) 1996-2019, 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 | * Write count number of bytes to the file, and return the number of bytes |
57 | * actually written or -1 for error. |
58 | */ |
59 | ssize_t (*write) (Walfile f, const void *buf, size_t count); |
60 | |
61 | /* Return the current position in a file or -1 on error */ |
62 | off_t (*get_current_pos) (Walfile f); |
63 | |
64 | /* |
65 | * fsync the contents of the specified file. Returns 0 on success. |
66 | */ |
67 | int (*sync) (Walfile f); |
68 | |
69 | /* |
70 | * Clean up the Walmethod, closing any shared resources. For methods like |
71 | * tar, this includes writing updated headers. Returns true if the |
72 | * close/write/sync of shared resources succeeded, otherwise returns false |
73 | * (but the resources are still closed). |
74 | */ |
75 | bool (*finish) (void); |
76 | |
77 | /* Return a text for the last error in this Walfile */ |
78 | const char *(*getlasterror) (void); |
79 | }; |
80 | |
81 | /* |
82 | * Available WAL methods: |
83 | * - WalDirectoryMethod - write WAL to regular files in a standard pg_wal |
84 | * - TarDirectoryMethod - write WAL to a tarfile corresponding to pg_wal |
85 | * (only implements the methods required for pg_basebackup, |
86 | * not all those required for pg_receivewal) |
87 | */ |
88 | WalWriteMethod *CreateWalDirectoryMethod(const char *basedir, |
89 | int compression, bool sync); |
90 | WalWriteMethod *CreateWalTarMethod(const char *tarbase, int compression, bool sync); |
91 | |
92 | /* Cleanup routines for previously-created methods */ |
93 | void FreeWalDirectoryMethod(void); |
94 | void FreeWalTarMethod(void); |
95 | |