ORM C++
Loading...
Searching...
No Matches
update.hpp
1#pragma once
2
3#include <optional>
4#include <utility>
5
6#include "query/UpdateSpec.hpp"
7
8namespace orm
9{
10class DatabaseCore;
11template <typename SchemaType>
12class Database;
13
14template <typename T>
15class Update
16{
17public:
18 Update() = default;
19
20 template <typename Value>
21 auto set(query::Column column, Value value) -> Update<T>&
22 {
23 data.assignments.push_back(query::UpdateAssignment{
24 .column = std::move(column), .value = query::UpdateValue{.value = query::QueryValue{std::move(value)}}});
25
26 return *this;
27 }
28
29 template <typename Value>
30 auto set(query::Column column, const std::optional<Value>& value) -> Update<T>&
31 {
32 if (value.has_value())
33 {
34 data.assignments.push_back(query::UpdateAssignment{
35 .column = std::move(column), .value = query::UpdateValue{.value = query::QueryValue{value.value()}}});
36 }
37 else
38 {
39 set(std::move(column), std::nullopt);
40 }
41
42 return *this;
43 }
44
45 auto set(query::Column column, std::nullopt_t) -> Update<T>&
46 {
47 data.assignments.push_back(query::UpdateAssignment{.column = std::move(column), .value = query::UpdateValue{}});
48
49 return *this;
50 }
51
52 auto where(const query::Predicate& predicate) -> Update<T>&
53 {
54 data.predicate = predicate;
55
56 return *this;
57 }
58
59 auto andWhere(const query::Predicate& predicate) -> Update<T>&
60 {
61 data.predicate = data.predicate.has_value() ? data.predicate.value() && predicate : predicate;
62
63 return *this;
64 }
65
66 auto orWhere(const query::Predicate& predicate) -> Update<T>&
67 {
68 data.predicate = data.predicate.has_value() ? data.predicate.value() || predicate : predicate;
69
70 return *this;
71 }
72
73private:
74 template <typename>
75 friend class orm::Database;
76 friend class orm::DatabaseCore;
77
78 [[nodiscard]] auto getData() const -> const query::UpdateSpec&
79 {
80 return data;
81 }
82
83 query::UpdateSpec data;
84};
85} // namespace orm
A class representing a database in the ORM framework.
Definition database.hpp:67
Database facade bound to one closed compile-time model schema.
Definition database.hpp:704