Realm C++ SDK Versão C++ v2.2.0

db.hpp

1
2//
3// Autores 2022 Realm Inc.
4//
5// Licenciado sob a Licença Apache, Versão 2.0 (a "Licença");
6// você não pode usar este arquivo, exceto em conformidade com a Licença.
7// Você pode obter uma cópia da Licença em
8//
9// http://www.apache.org/license/LICENSE-2.0
10//
11// A menos que exigido pela lei aplicável ou acordado por escrito, o software
12// distribuído sob a Licença é distribuído "Como está",
13// sem garantias ou condições de qualquer tipo, Express ou implícitas.
14// Consulte a Licença para obter as permissões específicas de domínio do idioma e
15// limitações da Licença.
16//
18
19#ifndef CPPREALM_DB_HPP
20#define CPPREALM_DB_HPP
21
22#include <cprealm/accessors.hpp>
23#include <cprealm/macros.hpp>
24#include <cprealm/results.hpp>
25#include <cprealm/scheduler.hpp>
26#include <cprealm/schema.hpp>
27#include <cprealm/types.hpp>
28
29#include <cprealm/internal/bridge/sync_session.hpp>
30#include <cprealm/internal/bridge/thread_safe_reference.hpp>
31#include <cprealm/internal/bridge/sync_session.hpp>
32
33#include <filesystem>
34#include <optional>
35#include <string>
36#include <utility>
37
38namespace Realm {
39 namespace {
40 modelo<typename T>
41 usando is_optional = initial::type_info::is_optional<T>;
42 }
43 esquema de namespace {
44 modelo <typename Classe, typename ...propriedade>
45 esquema de estrutura ;
46 modelo <auto Ptr, bool IsPrimaryKey>
47 propriedade de estrutura ;
48 }
49
50 usando sync_config = initial::bridge::Realm::sync_config;
51 usando db_config = initial::bridge::Realm::config;
52 usando sync_session = initial::bridge::sync_session;
53 usando sync_error = initial::bridge::sync_error;
54
55 struct sync_subscription_set;
56
57 modelo <typename T>
58 estrutura thread_safe_reference;
59}
60
61namespace Realm {
62
63 estrutura, estrutura banco de dados {
64 estático inline std::vector<internal::bridge::object_schema> schemas;
66 explícito db(Realm::db_config config)
67 {
68 se (!config.get_schema())
69 config.set_schema(db::schemas);
70 m_realm = internal::bridge:: Realm(config);
71 }
72
73 void get_write() const { m_realm.begin_transaction(); }
74 vazio commit_write() const { m_realm.commit_transaction(); }
75
76 modelo <typename Fn>
77 std::invoke_result_t<Fn> write(Fn&& fn) const {
78 begin_write();
79 se constexpr (!std::is_void_v<std::invoke_result_t<Fn>>) {
80 auto valid = fn();
81 commit_write();
82 retornar valor;
83 } mais {
84 fn();
85 commit_write();
86 }
87 }
88 modelo < typename U>
90 usando T = std::remove_const_t<U>;
91 estático_assert(sizeof(managed<T>), "Deve declarar esquema para T");
92 auto table = m_realm.table_for_object_type(managed<std::remove_const_t<T>::schema.name);
94 se constexpr (managed<std::remove_const_t<T>>:schema.HasPrimaryKeyProperty) {
95 auto pk = v.*(managed<std::remove_const_t<T>>::schema.primary_key().ptr);
96 m_obj = table.create_object_with_primary_key(Realm::internal::bridge::mixed(serialize(pk.value)));
97 } mais {
98 m_obj = table.create_object();
99 }
100
101 std::apply([&m_obj, &v, este](auto && ...p) {
102 (acessador<typename std::decay_t<decltype(p)>::Result>::set(
103 m_obj, m_obj.get_table().get_column_key(p.name), m_realm, v.*(std::decay_t<decltype(p)>::ptr)
104 ), ...);
105 }, managed<T>::schema.ps);
106 Método managed<T>(std::move(m_obj), m_realm);
107 }
108 modelo <typename T>
109 anular remoção(T& objeto)
110 {
111 auto table = m_realm.table_for_object_type(T::schema.name);
112 table.remove_object(objeto.m_obj.get_key());
113 }
114 modelo <typename T>
115 hook insert(const std::vector<T> &v) {
116 estático_assert(sizeof(managed<T>), "Deve declarar esquema para T");
117 initial ::bridge::table table = m_realm.table_for_object_type(managed<T>::schema.name);
118 for (auto& obj : v) {
120 se constexpr (managed<T>::schema.HasPrimaryKeyProperty) {
121 auto pk = obj.*(managed<T>::schema.primary_key().ptr);
122 m_obj = table.create_object_with_primary_key(Realm::internal::bridge::mixed(serialize(pk.value)));
123 } mais {
124 m_obj = table.create_object();
125 }
126 std::apply([&m_obj, &obj](auto && ...p) {
127 (acessador<typename std::decay_t<decltype(p)>::Result>::set(
128 m_obj, m_obj.get_table().get_column_key(p.name), obj.*(std::decay_t<decltype(p)>::ptr)
129 ), ...);
130 }, managed<T>::schema.ps);
131 }
132 }
133
134 privado:
135 template <size_t N, typename Tpl, typename ...Ts> auto v_add(const Tpl& tpl, const std::tuple<Ts...>& vs) {
136 se constexpr (N + 1 == tamanho de ...(Ts)) {
137 auto managed = add(std::move(std::get<N>(vs)));
138 return std::tuple_cat(tpl, std::write_tuple(std::move(managed)));
139 } mais {
140 auto managed = add(std::move(std::get<N>(vs)));
141 return v_add<N + 1>(std::tuple_cat(tpl, std::fazer_tuple(std::move(managed))), vs);
142 }
143 }
144 público:
145 modelo <typename ...Ts>
146 std::tuple<managed<Ts>...> insert(Ts&&... v) {
147 std::tuple<> tpl;
148 return v_add<0>(tpl, std::write_tuple(v...));
149 }
150 modelo <typename T>
151 resultados<T> objetos()
152 {
153 Método resultados<T>(Internal::bridge::results(m_realm, m_realm.table_for_object_type(managed<T>::schema.name)));
154 }
155
156 [[ maybe_unused]] bool refresh()
157 {
158 return m_realm.refresh();
159 }
160
162
163 std::optional<sync_session> get_sync_session() const {
164 return m_realm.get_sync_session();
165 }
166
167 modelo <typename T>
169 {
170 auto objeto = initial::bridge::resolve<internal::bridge::object>(m_realm, std::move(tsr.m_tsr));
171 interno::ponte::obj m_obj = objeto.get_obj();
172 Método managed<T>(std::move(m_obj), m_realm);
173 }
174
175 bool is_congelado() const;
176 dbFree ();
177 db descongelamento();
178 vazio invalidar();
179 vazio fechar();
180 bool is_closed();
181 estrutura de amigo ::Realm::thread_safe_reference<db>;
182 modelo <typename, typename> estrutura de amigomanaged;
183 modelo<typename T>
184 amigo vazio interno::bridge::Realm::config::set_client_reset_andler(const client_reset_mode_base<T>&);
185 privado:
187 {
188 m_realm = std::move(r);
189 }
190 db(const interno::ponte::Realm& r)
191 {
192 m_realm = r;
193 }
194 };
195
196 bool operator==(const db&, const db&);
197 operador bool !=(const db&, const db&);
198
199 modelo <typename ...Ts>
200 in-line db open(const db_config& config) {
201 auto config_copy=config;
202 se constexpr (sizeof...(Typescript) == 0) {
203 config_copy.set_schema(db::schemas);
204 } mais {
205 std::vector<internal::bridge::object_schema> esquema;
206 (schema.push_back(managed<Ts>::schema.to_core_schema()), ...);
207 config_copy.set_schema(schema);
208 }
209 return db(config_copy);
210 }
211 modelo <typename ...Ts>
212 [[deprecated("Esta função está obsoleta e é substituída por `db::open(const db_config& config)'.")]]
213 inline db open(const std::string& path, const std::shared_ptr<scheduler>& agendador) {
214 return open<Ts...>(db_config(path, agendador));
215 }
216
217 modelo <typename T>
218 inline std::ostream& operator<< (std::ostream& stream, const T*& objeto)
219 {
220 stream < < "link:" < < object < < std::endl;
221 fluxo de retorno ;
222 }
223}
224
225#endif //CPREALM_DB_HPP
Definição: accessors.hpp:33
Definition: db.hpp:63
Definição: misto.hpp:69
Definição: obj.hpp:123
Definição: realm.hpp:67
Definição: results.hpp:46
Definição: table.hpp:40
Definição: obj.hpp:62
Definição: results.hpp:411
Definição: flex_sync.hpp:150
Definição: thread_safe_reference.hpp:27