5#include "../SqlConnection.hpp"
6#include "../SqlError.hpp"
7#include "../SqlRetryPolicy.hpp"
8#include "SqlBackup.hpp"
19 #pragma clang diagnostic push
20 #pragma clang diagnostic ignored "-Wnullability-extension"
24 #pragma clang diagnostic pop
27namespace Lightweight::SqlBackup::detail
33constexpr size_t MaxBinaryLobBufferSize = 16 * 1024 * 1024;
61LIGHTWEIGHT_API
bool IsTransientError(SqlErrorInfo
const& error);
70LIGHTWEIGHT_API std::chrono::milliseconds CalculateRetryDelay(
unsigned attempt, RetrySettings
const& settings)
noexcept;
92[[nodiscard]] LIGHTWEIGHT_API RetryAction ClassifyRetryOutcome(SqlErrorInfo
const& error,
93 unsigned attemptsSoFar,
94 RetrySettings
const& settings);
104LIGHTWEIGHT_API
bool ConnectWithRetry(SqlConnection& conn,
105 SqlConnectionString
const& connectionString,
106 RetrySettings
const& settings,
107 ProgressManager& progress,
108 std::string
const& operation);
123template <
typename Func>
124auto RetryOnTransientError(Func func, RetrySettings
const& settings, ProgressManager& progress, std::string
const& operation)
127 auto policy = SqlRetryPolicy { settings };
129 policy.SetRetryObserver([&progress, &operation, &settings](SqlRetryAttempt
const& attempt) {
130 progress.Update({ .state = Progress::State::Warning,
131 .tableName = operation,
133 .totalRows = std::nullopt,
136 .message = std::format(
"Transient error, retry {}/{}: {}",
139 std::format(
"{}", attempt.error)) });
142 return policy.Execute(std::move(func));
148LIGHTWEIGHT_API std::string CurrentDateTime();
157template <
typename Container>
158Container ReadZipEntry(zip_t* zip, zip_int64_t index, zip_uint64_t size)
160 zip_file_t* file = zip_fopen_index(zip,
static_cast<zip_uint64_t
>(index), 0);
167 zip_int64_t bytesRead = zip_fread(file, data.data(), size);
170 if (bytesRead < 0 || std::cmp_not_equal(bytesRead, size))
181LIGHTWEIGHT_API std::string FormatTableName(std::string_view schema, std::string_view table);
190LIGHTWEIGHT_API
bool DropTableIfExists(SqlConnection& conn,
191 std::string
const& schema,
192 std::string
const& tableName,
193 ProgressManager& progress);