You've already forked pgbackrest
mirror of
https://github.com/pgbackrest/pgbackrest.git
synced 2026-10-23 21:28:56 +03:00
backupFile() is only called by the backup protocol handler so include file.c into protocol.c directly, matching how the rest of the backup module is included into backup.c. This makes backupFile() static and removes the file.h header and build entry. The BackupFile/BackupFileResult structs are only used by backupFile() and the protocol handler so they become file-private as well. The BackupCopyResult enum is still needed by the backup process to interpret protocol job results so move it to protocol.h.
121 lines
4.9 KiB
C
121 lines
4.9 KiB
C
/***********************************************************************************************************************************
|
|
Backup Protocol Handler
|
|
***********************************************************************************************************************************/
|
|
#include <build.h>
|
|
|
|
#include "command/backup/blockIncr.h"
|
|
#include "command/backup/pageChecksum.h"
|
|
#include "command/backup/protocol.h"
|
|
#include "common/compress/helper.h"
|
|
#include "common/crypto/cipherBlock.h"
|
|
#include "common/crypto/hash.h"
|
|
#include "common/debug.h"
|
|
#include "common/io/bufferRead.h"
|
|
#include "common/io/filter/size.h"
|
|
#include "common/io/io.h"
|
|
#include "common/log.h"
|
|
#include "common/memContext.h"
|
|
#include "common/regExp.h"
|
|
#include "common/type/json.h"
|
|
#include "config/config.h"
|
|
#include "storage/helper.h"
|
|
|
|
#include "command/backup/file.c.inc"
|
|
|
|
/**********************************************************************************************************************************/
|
|
FN_EXTERN ProtocolServerResult *
|
|
backupFileProtocol(PackRead *const param)
|
|
{
|
|
FUNCTION_LOG_BEGIN(logLevelDebug);
|
|
FUNCTION_LOG_PARAM(PACK_READ, param);
|
|
FUNCTION_LOG_END();
|
|
|
|
ASSERT(param != NULL);
|
|
|
|
ProtocolServerResult *const result = protocolServerResultNewP();
|
|
|
|
MEM_CONTEXT_TEMP_BEGIN()
|
|
{
|
|
// Backup options that apply to all files
|
|
const String *const repoFile = pckReadStrP(param);
|
|
const uint64_t bundleId = pckReadU64P(param);
|
|
const bool bundleRaw = bundleId != 0 ? pckReadBoolP(param) : false;
|
|
const unsigned int blockIncrReference = (unsigned int)pckReadU64P(param);
|
|
const CompressType repoFileCompressType = (CompressType)pckReadU32P(param);
|
|
const int repoFileCompressLevel = pckReadI32P(param);
|
|
const CipherType cipherType = (CipherType)pckReadU64P(param);
|
|
const String *const cipherPass = pckReadStrP(param);
|
|
const PgPageSize pageSize = pckReadU32P(param);
|
|
const String *const pgVersionForce = pckReadStrP(param);
|
|
|
|
// Build the file list
|
|
List *const fileList = lstNewP(sizeof(BackupFile));
|
|
|
|
while (!pckReadNullP(param))
|
|
{
|
|
BackupFile file = {.pgFile = pckReadStrP(param)};
|
|
file.pgFileDelta = pckReadBoolP(param);
|
|
file.pgFileIgnoreMissing = pckReadBoolP(param);
|
|
file.pgFileSize = pckReadU64P(param);
|
|
file.pgFileSizeOriginal = pckReadU64P(param);
|
|
file.pgFileCopyExactSize = pckReadBoolP(param);
|
|
file.pgFileChecksum = pckReadBinP(param);
|
|
file.pgFileChecksumPage = pckReadBoolP(param);
|
|
file.pgFilePageHeaderCheck = pckReadBoolP(param);
|
|
file.blockIncrSize = (size_t)pckReadU64P(param);
|
|
|
|
if (file.blockIncrSize > 0)
|
|
{
|
|
file.blockIncrChecksumSize = (size_t)pckReadU64P(param);
|
|
file.blockIncrSuperSize = pckReadU64P(param);
|
|
file.blockIncrMapPriorFile = pckReadStrP(param);
|
|
|
|
if (file.blockIncrMapPriorFile != NULL)
|
|
{
|
|
file.blockIncrMapPriorOffset = pckReadU64P(param);
|
|
file.blockIncrMapPriorSize = pckReadU64P(param);
|
|
}
|
|
}
|
|
|
|
file.manifestFile = pckReadStrP(param);
|
|
file.repoFileChecksum = pckReadBinP(param);
|
|
file.repoFileSize = pckReadU64P(param);
|
|
file.manifestFileResume = pckReadBoolP(param);
|
|
file.manifestFileHasReference = pckReadBoolP(param);
|
|
|
|
lstAdd(fileList, &file);
|
|
}
|
|
|
|
// Backup file
|
|
const List *const resultList = backupFile(
|
|
repoFile, bundleId, bundleRaw, blockIncrReference, repoFileCompressType, repoFileCompressLevel, cipherType, cipherPass,
|
|
pgVersionForce, pageSize, fileList);
|
|
|
|
// Return result
|
|
PackWrite *const data = protocolServerResultData(result);
|
|
|
|
for (unsigned int resultIdx = 0; resultIdx < lstSize(resultList); resultIdx++)
|
|
{
|
|
const BackupFileResult *const fileResult = lstGet(resultList, resultIdx);
|
|
|
|
ASSERT(
|
|
fileResult->backupCopyResult == backupCopyResultSkip || fileResult->copySize != 0 ||
|
|
bufEq(fileResult->copyChecksum, HASH_TYPE_SHA1_ZERO_BUF));
|
|
|
|
pckWriteStrP(data, fileResult->manifestFile);
|
|
pckWriteU32P(data, fileResult->backupCopyResult);
|
|
pckWriteBoolP(data, fileResult->repoInvalid);
|
|
pckWriteU64P(data, fileResult->copySize);
|
|
pckWriteU64P(data, fileResult->bundleOffset);
|
|
pckWriteU64P(data, fileResult->blockIncrMapSize);
|
|
pckWriteU64P(data, fileResult->repoSize);
|
|
pckWriteBinP(data, fileResult->copyChecksum);
|
|
pckWriteBinP(data, fileResult->repoChecksum);
|
|
pckWritePackP(data, fileResult->pageChecksumResult);
|
|
}
|
|
}
|
|
MEM_CONTEXT_TEMP_END();
|
|
|
|
FUNCTION_LOG_RETURN(PROTOCOL_SERVER_RESULT, result);
|
|
}
|