userver: /data/code/userver/odbc/include/userver/storages/odbc/transaction_options.hpp Source File
Loading...
Searching...
No Matches
transaction_options.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/storages/odbc/transaction_options.hpp
4/// @brief ODBC transaction options
5
6#include <cstdint>
7#include <optional>
8
9USERVER_NAMESPACE_BEGIN
10
11namespace storages::odbc {
12
13/// Portable ODBC transaction isolation levels.
14enum class IsolationLevel : std::uint8_t {
15 kReadUncommitted,
16 kReadCommitted,
17 kRepeatableRead,
18 kSerializable,
19};
20
21/// ODBC transaction access-mode hint.
22///
23/// @warning `kReadOnly` requests `SQL_MODE_READ_ONLY` from the ODBC driver, but
24/// ODBC defines this as an intent/optimization hint. It does not guarantee that
25/// the database rejects write statements.
26enum class AccessMode : std::uint8_t {
27 kReadOnly,
28 kReadWrite,
29};
30
31/// Options for starting an ODBC transaction.
32///
33/// Empty optionals preserve the physical connection's current driver defaults;
34/// the driver does not silently force READ COMMITTED or READ WRITE.
35struct TransactionOptions final {
36 std::optional<IsolationLevel> isolation_level{};
37 std::optional<AccessMode> access_mode{};
38
39 // Explicit keeps the legacy Cluster::Begin(flags, {}) call unambiguous: an
40 // empty braced argument continues to mean OptionalCommandControl.
41 constexpr explicit TransactionOptions() = default;
42
43 constexpr explicit TransactionOptions(IsolationLevel isolation)
44 : isolation_level{isolation}
45 {}
46
47 constexpr explicit TransactionOptions(AccessMode mode)
48 : access_mode{mode}
49 {}
50
51 constexpr TransactionOptions(IsolationLevel isolation, AccessMode mode)
52 : isolation_level{isolation},
53 access_mode{mode}
54 {}
55};
56
57constexpr bool operator==(const TransactionOptions& lhs, const TransactionOptions& rhs) noexcept {
58 return lhs.isolation_level == rhs.isolation_level && lhs.access_mode == rhs.access_mode;
59}
60
61} // namespace storages::odbc
62
63USERVER_NAMESPACE_END