mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-22 22:37:01 +08:00
This reverts commit f0f2c0c1aef95757c4e7f144d5577e2b0d814279. The original problem that led to the use of pg_restrict was that MSVC couldn't handle plain restrict, and defining it to something else would conflict with its __declspec(restrict) that is used in system header files. In C11 mode, this is no longer a problem, as MSVC handles plain restrict. This led to the commit to replace pg_restrict with restrict. But this did not take C++ into account. Standard C++ does not have restrict, so we defined it as something else (for example, MSVC supports __restrict). But this then again conflicts with __declspec(restrict) in system header files. So we have to revert this attempt. The comments are updated to clarify that the reason for this is now C++ only. Reported-by: Jelte Fennema-Nio <postgres@jeltef.nl> Reviewed-by: Andres Freund <andres@anarazel.de> Discussion: https://www.postgresql.org/message-id/CAGECzQRoD7chJP1-dneSrhxUJv%2BBRcigoGOO4UwGzaShLot2Yw%40mail.gmail.com
112 lines
3.0 KiB
C
112 lines
3.0 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* pg_verifybackup.h
|
|
* Verify a backup against a backup manifest.
|
|
*
|
|
* Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/bin/pg_verifybackup/pg_verifybackup.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
#ifndef PG_VERIFYBACKUP_H
|
|
#define PG_VERIFYBACKUP_H
|
|
|
|
#include "common/controldata_utils.h"
|
|
#include "common/hashfn_unstable.h"
|
|
#include "common/logging.h"
|
|
#include "common/parse_manifest.h"
|
|
#include "fe_utils/astreamer.h"
|
|
#include "fe_utils/simple_list.h"
|
|
|
|
/*
|
|
* Each file described by the manifest file is parsed to produce an object
|
|
* like this.
|
|
*/
|
|
typedef struct manifest_file
|
|
{
|
|
uint32 status; /* hash status */
|
|
const char *pathname;
|
|
uint64 size;
|
|
pg_checksum_type checksum_type;
|
|
int checksum_length;
|
|
uint8 *checksum_payload;
|
|
bool matched;
|
|
bool bad;
|
|
} manifest_file;
|
|
|
|
#define should_verify_checksum(m) \
|
|
(((m)->matched) && !((m)->bad) && (((m)->checksum_type) != CHECKSUM_TYPE_NONE))
|
|
|
|
/*
|
|
* Define a hash table which we can use to store information about the files
|
|
* mentioned in the backup manifest.
|
|
*/
|
|
#define SH_PREFIX manifest_files
|
|
#define SH_ELEMENT_TYPE manifest_file
|
|
#define SH_KEY_TYPE const char *
|
|
#define SH_KEY pathname
|
|
#define SH_HASH_KEY(tb, key) hash_string(key)
|
|
#define SH_EQUAL(tb, a, b) (strcmp(a, b) == 0)
|
|
#define SH_SCOPE static inline
|
|
#define SH_RAW_ALLOCATOR pg_malloc0
|
|
#define SH_DECLARE
|
|
#define SH_DEFINE
|
|
#include "lib/simplehash.h"
|
|
|
|
/*
|
|
* Each WAL range described by the manifest file is parsed to produce an
|
|
* object like this.
|
|
*/
|
|
typedef struct manifest_wal_range
|
|
{
|
|
TimeLineID tli;
|
|
XLogRecPtr start_lsn;
|
|
XLogRecPtr end_lsn;
|
|
struct manifest_wal_range *next;
|
|
struct manifest_wal_range *prev;
|
|
} manifest_wal_range;
|
|
|
|
/*
|
|
* All the data parsed from a backup_manifest file.
|
|
*/
|
|
typedef struct manifest_data
|
|
{
|
|
int version;
|
|
uint64 system_identifier;
|
|
manifest_files_hash *files;
|
|
manifest_wal_range *first_wal_range;
|
|
manifest_wal_range *last_wal_range;
|
|
} manifest_data;
|
|
|
|
/*
|
|
* All of the context information we need while checking a backup manifest.
|
|
*/
|
|
typedef struct verifier_context
|
|
{
|
|
manifest_data *manifest;
|
|
char *backup_directory;
|
|
SimpleStringList ignore_list;
|
|
char format; /* backup format: p(lain)/t(ar) */
|
|
bool skip_checksums;
|
|
bool exit_on_error;
|
|
bool saw_any_error;
|
|
} verifier_context;
|
|
|
|
extern void report_backup_error(verifier_context *context,
|
|
const char *pg_restrict fmt,...)
|
|
pg_attribute_printf(2, 3);
|
|
pg_noreturn extern void report_fatal_error(const char *pg_restrict fmt,...)
|
|
pg_attribute_printf(1, 2);
|
|
extern bool should_ignore_relpath(verifier_context *context,
|
|
const char *relpath);
|
|
|
|
extern astreamer *astreamer_verify_content_new(astreamer *next,
|
|
verifier_context *context,
|
|
char *archive_name,
|
|
Oid tblspc_oid);
|
|
|
|
#endif /* PG_VERIFYBACKUP_H */
|