87 lines
2.9 KiB
C
87 lines
2.9 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* rewind_source.h
|
|
* Abstraction for fetching from source server.
|
|
*
|
|
* The source server can be either a libpq connection to a live system,
|
|
* or a local data directory. The 'rewind_source' struct abstracts the
|
|
* operations to fetch data from the source system, so that the rest of
|
|
* the code doesn't need to care what kind of a source its dealing with.
|
|
*
|
|
* Copyright (c) 2013-2023, PostgreSQL Global Development Group
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef REWIND_SOURCE_H
|
|
#define REWIND_SOURCE_H
|
|
|
|
#include "access/xlogdefs.h"
|
|
#include "file_ops.h"
|
|
#include "filemap.h"
|
|
#include "libpq-fe.h"
|
|
|
|
typedef struct rewind_source
|
|
{
|
|
/*
|
|
* Traverse all files in the source data directory, and call 'callback' on
|
|
* each file.
|
|
*/
|
|
void (*traverse_files) (struct rewind_source *,
|
|
process_file_callback_t callback);
|
|
|
|
/*
|
|
* Fetch a single file into a malloc'd buffer. The file size is returned
|
|
* in *filesize. The returned buffer is always zero-terminated, which is
|
|
* handy for text files.
|
|
*/
|
|
char *(*fetch_file) (struct rewind_source *, const char *path,
|
|
size_t *filesize);
|
|
|
|
/*
|
|
* Request to fetch (part of) a file in the source system, specified by an
|
|
* offset and length, and write it to the same offset in the corresponding
|
|
* target file. The source implementation may queue up the request and
|
|
* execute it later when convenient. Call finish_fetch() to flush the
|
|
* queue and execute all requests.
|
|
*/
|
|
void (*queue_fetch_range) (struct rewind_source *, const char *path,
|
|
off_t offset, size_t len);
|
|
|
|
/*
|
|
* Like queue_fetch_range(), but requests replacing the whole local file
|
|
* from the source system. 'len' is the expected length of the file,
|
|
* although when the source is a live server, the file may change
|
|
* concurrently. The implementation is not obliged to copy more than 'len'
|
|
* bytes, even if the file is larger. However, to avoid copying a
|
|
* truncated version of the file, which can cause trouble if e.g. a
|
|
* configuration file is modified concurrently, the implementation should
|
|
* try to copy the whole file, even if it's larger than expected.
|
|
*/
|
|
void (*queue_fetch_file) (struct rewind_source *, const char *path,
|
|
size_t len);
|
|
|
|
/*
|
|
* Execute all requests queued up with queue_fetch_range().
|
|
*/
|
|
void (*finish_fetch) (struct rewind_source *);
|
|
|
|
/*
|
|
* Get the current WAL insert position in the source system.
|
|
*/
|
|
XLogRecPtr (*get_current_wal_insert_lsn) (struct rewind_source *);
|
|
|
|
/*
|
|
* Free this rewind_source object.
|
|
*/
|
|
void (*destroy) (struct rewind_source *);
|
|
|
|
} rewind_source;
|
|
|
|
/* in libpq_source.c */
|
|
extern rewind_source *init_libpq_source(PGconn *conn);
|
|
|
|
/* in local_source.c */
|
|
extern rewind_source *init_local_source(const char *datadir);
|
|
|
|
#endif /* REWIND_SOURCE_H */
|