Realm C++ SDK版本 v 2.2.0

Flex_sync.hpp

1
2//
3// 版权所有 2022 Realm Inc.
4//
5// 根据 Apache 许可证 2.0 版(“许可证”)获得许可;
6// 除非符合合规,否则不得使用此文件。
7// 您可以在以下网址获取许可证副本:
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// 除非适用法律要求或书面同意,否则软件
12// 根据许可证分发是按“原样”分发的,
13// 不提供任何类型的Express或暗示的保证或条件。
14// 请参阅管理权限的特定语言的许可证和
15// 许可证下的限制。
16//
18
19#ifndef CPPREALM_FLEXIBLE_SYNC_HPP
20#define CPPREALM_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 template < typename >
37 struct 对象
38 class rbool;
39
40 namespace sync {
41 class MutableSubscriptionSet;
42 class SubscriptionSet;
43 class SubscriptionStore;
44 class订阅;
45 }
46
47// SyncSubscription 表示单个查询,可以与同一对象类上的其他查询进行 OR 运算,
48// 通过 QUERY 或 IDENT 消息发送到服务器。
50 // 返回此订阅的唯一ID 。
51 std::string 标识符;
52 // 代表此订阅的名称。
53 std::Optional<std::string> name;
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 朋友 struct sync_subscription_set;
67 };
68
69// MutableSyncSubscriptionSet 表示单个查询,可以与同一对象类上的其他查询进行 OR 运算,
70// 通过 QUERY 或 IDENT 消息发送到服务器。
72 private :
73 void insert_or_allow( const std::string& name, constinternal ::bridge::query &);
74 public :
81
82 // 如果订阅尚不存在,则将新订阅插入到集合中。
83 // 如果 `query_fn` 参数留空,则订阅将同步*所有*对象
84 // 用于模板化类类型。
85 template < typename T>
86 void add( const std::string &name ,
87 std::Optional<std::function< rbool ( 托管<T> &)>> &&query_fn = std::nullopt) {
88 static_assert ( sizeof ( 托管<T> ), "Must describe schema for T" );
89
90 auto 模式 = m_realm.get()。 模式().find( 托管<T>:: 模式 .name);
91 auto 群组 = m_realm.get().read_group();
92 autotable_ref = group.get_table(schema.table_key());
93 auto root_query = external ::bridge:: 查询 (table_ref);
94
95 if (query_fn) {
96 rbool 查询 = rbool (std::move(root_query));
97 auto query_object = 托管<T>::prepare_for_query (m_realm, &query);
98 auto full_query = (*query_fn)(query_object).q;
99 insert_or_allow(name, full_query);
100 } else {
101 insert_or_allow(name, root_query);
102 }
103 }
104
105 // 删除给定名称的订阅。 如果订阅满足以下条件,则会抛出异常:
106 // 不存在。
107 void 删除( 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 template < 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 删除(name);
121 add(name, std::move(query_fn));
122 }
123
124 // 更新给定名称的订阅。
125 // 如果订阅不存在,则抛出异常。
126 // 如果 `query_fn` 参数留空,则订阅将同步*所有*对象
127 // 用于模板化类类型。
128 template < typename T>
129 void update_subscription( const std::string& name,
130 std::Optional<std::function< rbool ( 托管<T> &)>>&& query_fn = std::nullopt) {
131 删除(name);
132 add(name, std::move(query_fn));
133 }
134
135 // 删除所有订阅。
136 void clear();
137
138 private :
139 mutable_sync_subscription_set ( internal::bridge::realm &, const sync::MutableSubscriptionSet&subscription_set);
140#ifdef CPPREALM_HAVE_GENERATED_BRIDGE_TYPES
141 internal::bridge:: 存储::MutableSyncSubscriptionSet m_subscription_set[ 1 ];
142#else
143std::shared_ptr<sync::MutableSubscriptionSet> m_subscription_set;
144#endif
145std::reference_wrapper<internal::bridge::realm> m_realm;
146 朋友 struct sync_subscription_set;
147 同步::MutableSubscriptionSet get_subscription_set();
148 };
149
151 public :
152 sync_subscription_set () = delete ;
153 sync_subscription_set ( const sync_subscription_set & other) = 删除 ;
154 sync_subscription_set & Operator=( const sync_subscription_set & other) ;
155 sync_subscription_set ( 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 朋友 struct db;
171#ifdef CPPREALM_HAVE_GENERATED_BRIDGE_TYPES
172 internal::bridge:: 存储::SyncSubscriptionSet m_subscription_set[ 1 ];
173#else
174std::shared_ptr<sync::SubscriptionSet> m_subscription_set;
175#endif
176std::reference_wrapper<internal::bridge::realm> m_realm;
177 };
178
179 } // 命名空间 Realm
180
181#endif /* CPPREALM_FLEXIBLE_SYNC_HPP */
定义: rbool.hpp:36
Definition: db.hpp:63
定义: query.hpp: 131
定义: realm.hpp: 67
定义: Flex_sync.hpp: 71
定义: Flex_sync.hpp: 37
定义: Flex_sync.hpp:150
size_t size() const
集合中的订阅总数。
定义: Flex_sync.cpp: 134
定义: Flex_sync.hpp: 49