/*-------------------------------------------------------------------------
 *
 * walmethods.h
 *
 * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
 *
 * IDENTIFICATION
 *		  src/bin/pg_basebackup/walmethods.h
 *-------------------------------------------------------------------------
 */


typedef void *Walfile;

typedef enum
{
	CLOSE_NORMAL,
	CLOSE_UNLINK,
	CLOSE_NO_RENAME
}	WalCloseMethod;

typedef struct WalWriteMethod WalWriteMethod;
struct WalWriteMethod
{
	Walfile(*open_for_write) (const char *pathname, const char *temp_suffix, size_t pad_to_size);
	int			(*close) (Walfile f, WalCloseMethod method);
	bool		(*existsfile) (const char *pathname);
	ssize_t		(*get_file_size) (const char *pathname);

	ssize_t		(*write) (Walfile f, const void *buf, size_t count);
	off_t		(*get_current_pos) (Walfile f);
	int			(*sync) (Walfile f);
	bool		(*finish) (void);
	char	   *(*getlasterror) (void);
};

/*
 * Available WAL methods:
 *	- WalDirectoryMethod - write WAL to regular files in a standard pg_xlog
 *	- TarDirectoryMethod - write WAL to a tarfile corresponding to pg_xlog
 *						   (only implements the methods required for pg_basebackup,
 *						   not all those required for pg_receivewal)
 */
WalWriteMethod *CreateWalDirectoryMethod(const char *basedir,
										 int compression, bool sync);
WalWriteMethod *CreateWalTarMethod(const char *tarbase, int compression, bool sync);

/* Cleanup routines for previously-created methods */
void FreeWalDirectoryMethod(void);
void FreeWalTarMethod(void);
