Realm C++ SDK 버전 v2.2.0

flex_sync.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 CPPREALM_FLEXIBLE_SYNC_HPP
20#define CPPRALM_FLEXIBLE_SYNC_HPP
21
22#include <future>
23#include <type_traits>
24
25#include <cpprealm/internal/bridge/obj.hpp>
26#include <cpprealm/internal/bridge/ 쿼리.hpp>
27#include <cpprealm/internal/bridge/schema.hpp>
28#include <cpprealm/internal/bridge/realm.hpp>
29#include <cpprealm/internal/bridge/utils.hpp>
30
31#include <cpprealm/macros.hpp>
32#include <cpprealm/results.hpp>
33#include <cpprealm/rbool.hpp>
34
35네임스페이스 영역 {
36 템플릿 <typename>
37 구조체 객체;
38 클래스 rbool;
39
40 namespace sync {
41 클래스 MutableSubscriptionSet;
42 클래스 SubscriptionSet;
43 클래스 SubscriptionStore;
44 클래스 구독;
45 }
46
47// SyncSubscription은 동일한 객체 클래스에 대한 다른 쿼리와 OR 처리될 수 있는 단일 쿼리 를 나타냅니다.
48// QUERY 또는 IDENT 메시지로 서버 에 보냅니다.
50 // 이 구독 의 고유 ID 를 반환합니다.
51 std::string 식별자;
52 // 이 구독 을 나타내는 이름입니다.
53 std::optional<std::string> 이름;
54 // 이 구독 이 원래 생성된 시점의 타임스탬프를 반환합니다.
55 std::chrono::time_point<std::chrono::system_clock> created_at;
56 // update_query를 호출하여 이 구독 이 마지막으로 업데이트된 시간의 타임스탬프를 반환합니다.
57 std::chrono::time_point<std::chrono::system_clock> updated_at;
58 // 이 구독 과 연결된 쿼리 의 문자열화된 버전을 반환합니다.
59 std::string query_string;
60 // 이 구독에 대한 쿼리의 객체 클래스 이름을 반환합니다.
61 std::string object_class_name;
62 private:
63 sync_subscription(const sync::Subscription&);
64
65 친구 구조체 sync_subscription_set;
66 친구 구조체 mutable_sync_subscription_set;
67 };
68
69// MutableSyncSubscriptionSet는 동일한 객체 클래스에 대한 다른 쿼리와 OR 연산될 수 있는 단일 쿼리를 나타냅니다.
70// QUERY 또는 IDENT 메시지로 서버 에 보냅니다.
72 private:
73 oid insert_or_assign(const std::string& name, const internal::bridge::query&);
74 public:
81
82 // 아직 구독이 없는 경우 세트에 새 구독을 삽입합니다.
83 // `query_fn` 매개변수를 비워 두면 구독 은 *모든* 객체를 동기화 합니다.
84 // 템플릿 클래스 유형의 경우.
85 템플릿<typename T>
86 oid add(const std::string &name ,
87 std::optional<std::function<rbool(managed<T> &)>> &&query_fn = std::nullopt) {
88 static_assert(sizeof(managed<T>), "Must explain schema for T");
89
90 자동 스키마 = m_realm.get(). 스키마().find(managed<T>:: 스키마.name);
91 자동 그룹 = m_realm.get().read_group();
92 auto table_ref = group.get_table(schema.table_key());
93 auto root_query = internal::bridge:: 쿼리(table_ref);
94
95 if (query_fn) {
96 rbool 쿼리 = rbool(std::move(root_query));
97 auto query_object = managed<T>::prepare_for_query(m_realm, &query);
98 auto full_query = (*query_fn)(query_object).q;
99 insert_or_assign(name, full_query);
100 } 기타 {
101 insert_or_assign(name, root_query);
102 }
103 }
104
105 // 지정된 이름에 대한 구독을 제거합니다. 구독이 다음과 같은 경우 발생합니다.
106 // 존재하지 않습니다.
107 무효 제거(const std::string& name);
108
109 // 지정된 이름에 대한 구독 을 찾습니다. 구독 은 `std::nullopt`를 반환합니다.
110 // 존재하지 않습니다.
111 std::optional<sync_subscription> find(const std::string& name);
112
113 // 지정된 이름에 대한 구독 을 업데이트합니다.
114 // 구독 이 존재하지 않으면 예외가 발생합니다.
115 // `query_fn` 매개변수를 비워 두면 구독 은 *모든* 객체를 동기화 합니다.
116 // 템플릿 클래스 유형의 경우.
117 템플릿 <typename T>
118 std::enable_if_t<std::is_base_of_v< 객체<T>, T>>
119 update_subscription(const std::string& name, std::optional<std::function<rbool(T&)>>&& query_fn = std::nullopt) {
120 (이름)을 제거 합니다.
121 add(name, std::move(query_fn));
122 }
123
124 // 지정된 이름에 대한 구독 을 업데이트합니다.
125 // 구독 이 존재하지 않으면 예외가 발생합니다.
126 // `query_fn` 매개변수를 비워 두면 구독 은 *모든* 객체를 동기화 합니다.
127 // 템플릿 클래스 유형의 경우.
128 템플릿 <typename T>
129 update_subscription (const std::string& name,
130 std::optional<std::function<rbool(managed<T>&)>>&& query_fn = std::nullopt) {
131 (이름)을 제거 합니다.
132 add(name, std::move(query_fn));
133 }
134
135 // 모든 구독을 제거합니다.
136 무효 clear();
137
138 private:
139 mutable_sync_subscription_set(internal::bridge::realm&, const sync::MutableSubscriptionSet& Subscription_set);
140#ifdef CPPRALM_HAVE_GENERATED_BRIDGE_TYPES
141 internal::bridge:: 저장::MutableSyncSubscriptionSet m_subscription_set[1];
142#else
143 std::shared_ptr<sync::MutableSubscriptionSet> m_subscription_set;
144#endif
145 std::reference_wrapper<internal::bridge::realm> m_realm;
146 친구 구조체 sync_subscription_set;
147 동기화::MutableSubscriptionSet get_subscription_set();
148 };
149
151 public:
152 sync_subscription_set() = 삭제;
153 sync_subscription_set(const sync_subscription_set& other) = 삭제;
154 sync_subscription_set& operator=(const sync_subscription_set& other) ;
156 sync_subscription_set& 연산자=(sync_subscription_set&& other);
158
160 [[nodiscard]] size_t size() const;
161
162 // 지정된 이름에 대한 구독 을 찾습니다. 구독 은 `std::nullopt`를 반환합니다.
163 // 존재하지 않습니다.
164 std::optional<sync_subscription> find(const std::string& name);
165
166 std::future<bool> update(std::function<void(mutable_sync_subscription_set&)>&& fn);
167
169 private:
170 친구 구조체 db;
171#ifdef CPPRALM_HAVE_GENERATED_BRIDGE_TYPES
172 internal::bridge:: 저장::SyncSubscriptionSet m_subscription_set[1];
173#else
174 std::shared_ptr<sync::SubscriptionSet> m_subscription_set;
175#endif
176 std::reference_wrapper<internal::bridge::realm> m_realm;
177 };
178
179} // 네임스페이스 영역
180
181#endif /* CPPREALM_FLEXIBLE_SYNC_HPP */
정의: rbool.hpp:36
Definition: db.hpp:63
정의: query.hpp:131
정의: realm.hpp:67
정의: flex_sync.hpp:37
정의: flex_sync.hpp:150
size_t size() const
세트의 총 구독 수입니다.
정의: flex_sync.cpp:134
정의: flex_sync.hpp:49