Realm C++ SDK 버전 v2.2.0

db.hpp

1
2//
3//저작권 2022 Realm Inc.
4//
5// Apache 라이선스, 버전 2.0("라이선스")에 따라 라이선스가 부여됩니다.
6// 라이선스를 준수하는 경우를 제외하고는 이 파일을 사용할 수 없습니다.
7// 다음에서 라이선스 사본을 얻을 수 있습니다.
8//
9// http://www.apache.org/licences/LICENSE-2.0
10//
11// 관련 법률에서 요구하거나 문서로 동의하지 않는 한, 소프트웨어
12// 라이선스에 따라 배포되는 것은 '있는 그대로' 배포됩니다,
13// Express 묵시적이든 어떤 종류의 보증이나 조건도 제공하지 않습니다.
14// 권한을 관리하는 특정 언어에 대한 내용은 라이선스를 참조하세요.
15// 라이선스에 따른 제한 사항.
16//
18
19#ifndef CPPRALM_DB_HPP
20#defin CPPRALM_DB_HPP
21
22#include <cpprealm/accessors.hpp>
23#include <cpprealm/macros.hpp>
24#include <cpprealm/results.hpp>
25#include <cpprealm/scheduler.hpp>
26#include <cpprealm/schema.hpp>
27#include <cpprealm/types.hpp>
28
29#include <cpprealm/internal/bridge/sync_session.hpp>
30#include <cpprealm/internal/bridge/thread_safe_reference.hpp>
31#include <cpprealm/internal/bridge/sync_session.hpp>
32
33#include <filesystem>
34#include <optional>
35#include <string>
36#include <utility>
37
38네임스페이스 영역 {
39 네임스페이스 {
40 템플릿<typename T>
41 using is_Optional = Internal::type_info::is_Optional<T>;
42 }
43 네임스페이스 schemagen {
44 템플릿 <typename class, typename 속성>
45 구조체 스키마;
46 템플릿 <auto Ptr, bool IsPrimaryKey>
47 구조체 속성;
48 }
49
50 sync_config 사용 = Internal::bridge::영역::sync_config;
51 db_config 사용 = Internal::bridge::영역::config;
52 using sync_session = Internal::bridge::sync_session;
53 sync_error 사용 = Internal::bridge::sync_error;
54
55 struct sync_subscription_set;
56
57 템플릿 <typename T>
58 struct 스레드 안전 참조;
59}
60
61네임스페이스 영역 {
62
63 구조체 db {
64 static 인라인 std::vector<internal::bridge::object_schema> 스키마;
66 명시적 db(영역::db_config config)
67 {
68 if (!config.get_schema())
69 config.set_schema(db::schemas);
70 m_realm = internal::bridge:: 영역(config);
71 }
72
73 시작_쓰기 무효화 () const { m_realm.begin_transaction(); }
74 void commit_write() const { m_realm.commit_transaction(); }
75
76 템플릿 <typename Fn>
77 std::invoke_result_t<Fn> 쓰기 (write)(Fn&& fn) const {
78 begin_write();
79 만약 constexpr (!std::is_void_v<std::invoke_result_t<Fn>) {
80 auto val = fn();
81 commit_write();
82 반환 val;
83 } 기타 {
84 fn();
85 commit_write();
86 }
87 }
88 템플릿 <typename U>
90 using T = std::remove_const_t<U>;
91 static_assert(sizeof(managed<T>), "Must explain schema for T");
92 자동 테이블 = m_realm.table_for_object_type(managed<std::remove_const_t<T>>::schema.name);
94 만약 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(영역::internal::bridge::mixed(serialize(pk.value)));
97 } 기타 {
98 m_obj = table.create_object();
99 }
100
101 std:: 적용([&m_obj, &v, this](auto && ...p) {
102 (접근자 <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 ), ...);
106 반환 managed<T>(std::move(m_obj), m_realm);
107 }
108 템플릿 <typename T>
109 void remove(T& 객체)
110 {
111 자동 테이블 = m_realm.table_for_object_type(T::schema.name);
112 table.remove_object(객체.m_obj.get_key());
113 }
114 템플릿 <typename T>
115 void insert(const std::vector<T> &v) {
116 static_assert(sizeof(managed<T>), "Must explain schema for T");
117 내부::브릿지::테이블 테이블 = m_realm.table_for_object_type(managed<T>::schema.name);
118 for (auto& obj : v) {
120 만약 constexpr (managed<T>::schema.HasPrimaryKeyProperty) {
121 auto pk = obj.*(managed<T>::schema.primary_key().PTr);
122 m_obj = table.create_object_with_primary_key(영역::internal::bridge::mixed(serialize(pk.value)));
123 } 기타 {
124 m_obj = table.create_object();
125 }
126 std:: 적용([&m_obj, &obj](auto && ...p) {
127 (접근자 <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 ), ...);
131 }
132 }
133
134 private:
135 template <size_t N, typename Tpl, typename ...Ts> auto v_add(const Tpl& tpl, const std::tuple<Ts...>& vs) {
136 만약 constexpr (N + 1 == sizeof...(Typescript)) {
137 자동 managed = add(std::move(std::get<N>(vs)));
138 return std::tuple_cat(tpl, std::ake_tuple(std::move(managed)));
139 } 기타 {
140 자동 managed = add(std::move(std::get<N>(vs)));
141 return v_add<N + 1>(std::tuple_cat(tpl, std::ake_tuple(std::move(managed))), vs);
142 }
143 }
144 public:
145 템플릿 <typename ...Ts>
146 std::tuple<managed<Ts>...> insert(Ts&&... v) {
147 std::tuple<> tpl;
148 return v_add<0>(tpl, std::ake_tuple(v...));
149 }
150 템플릿 <typename T>
151 결과<T> 객체()
152 {
153 반환 Results<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 템플릿 <typename T>
169 {
170 자동 객체 = Internal::bridge::resolve<internal::bridge::object>(m_realm, std::move(tsr.m_tsr));
171 internal::bridge::obj m_obj = 객체.get_obj();
172 반환 managed<T>(std::move(m_obj), m_realm);
173 }
174
175 bool is_frozen() const;
176 db 동결();
177 dbthaw ();
178 void 무효화();
179 voidclose ();
180 bool is_closed();
181 친구 구조체::영역::thread_safe_reference<db>;
182 템플릿 <typename, typename> 친구 구조체 managed;
183 템플릿<typename T>
184 친구 void internal::bridge::영역::config::set_client_reset_handler(const client_reset_mode_base<T>&);
185 private:
187 {
188 m_realm = std::move(r);
189 }
191 {
192 m_realm = r;
193 }
194 };
195
196 bool 연산자==(const db&, const db&);
197 bool 연산자!=(const db&, const db&);
198
199 템플릿 <typename ...Ts>
200 인라인 db open(const db_config& config) {
201 auto config_copy = config;
202 만약 constexpr (sizeof...(Typescript) == 0) {
203 config_copy.set_schema(db::schemas);
204 } 기타 {
205 std::vector<internal::bridge::object_schema> 스키마;
206 (스키마.push_back(managed<Ts>:: 스키마.to_core_schema()), ...);
207 config_copy.set_schema(스키마);
208 }
209 return db(config_copy);
210 }
211 템플릿 <typename ...Ts>
212 [[deprecated("이 함수는 더 이상 사용되지 않으며 `db::open(const db_config& config)`으로 대체되었습니다.")]]
213 인라인 db open(const std::string& 경로, const std::shared_ptr<scheduler>& 스케줄러) {
214 return open<Ts...>(db_config(path, 스케줄러));
215 }
216
217 템플릿 <typename T>
218 인라인 std::ostream& 연산자<< (std::ostream& stream, const T*& 객체)
219 {
220 스트림 << "link:" << object << std::endl;
221 반환 스트림;
222 }
223}
224
225#endif //CPPRALM_DB_HPP
정의: accessors.hpp:33
Definition: db.hpp:63
정의: realm.hpp:67
정의: Results.hpp:46
정의: obj.hpp:62
정의: Results.hpp:411
정의: flex_sync.hpp:150
정의: 스레드_안전_참조.hpp:27