3 #include "../../data_interfaces/destination/idestination.hpp"
4 #include "../../data_interfaces/store/istore.hpp"
5 #include "../dependency_tracker/dependency_tracker.hpp"
7 #include <launchdarkly/data_model/descriptors.hpp>
8 #include <launchdarkly/server_side/change_notifier.hpp>
10 #include <boost/signals2/signal.hpp>
14 namespace launchdarkly::server_side::data_components {
19 template <
typename Storage>
20 using Collection = data_model::SDKDataSet::Collection<std::string, Storage>;
22 template <
typename Storage>
23 using SharedItem = std::shared_ptr<data_model::ItemDescriptor<Storage>>;
25 template <
typename Storage>
26 using SharedCollection =
27 std::unordered_map<std::string, SharedItem<Storage>>;
31 std::unique_ptr<IConnection>
OnFlagChange(ChangeHandler handler)
override;
33 void Init(data_model::SDKDataSet data_set)
override;
34 void Upsert(std::string
const& key,
35 data_model::FlagDescriptor flag)
override;
36 void Upsert(std::string
const& key,
37 data_model::SegmentDescriptor segment)
override;
39 [[nodiscard]] std::string
const&
Identity()
const override;
49 bool HasListeners()
const;
51 template <
typename FlagOrSegment>
52 void UpsertCommon(DataKind kind,
54 SharedItem<FlagOrSegment> existing,
55 data_model::ItemDescriptor<FlagOrSegment> updated) {
56 if (existing && (updated.version <= existing->version)) {
66 NotifyChanges(updated_deps);
69 sink_.Upsert(key, updated);
72 template <
typename FlagOrSegment>
73 void CalculateChanges(
75 SharedCollection<FlagOrSegment>
const& existing_flags_or_segments,
76 Collection<FlagOrSegment>
const& new_flags_or_segments,
78 for (
auto const& old_flag_or_segment : existing_flags_or_segments) {
79 auto new_flag_or_segment =
80 new_flags_or_segments.find(old_flag_or_segment.first);
81 if (new_flag_or_segment != new_flags_or_segments.end() &&
82 new_flag_or_segment->second.version <=
83 old_flag_or_segment.second->version) {
89 kind, old_flag_or_segment.first, updated_items);
92 for (
auto const& flag_or_segment : new_flags_or_segments) {
94 existing_flags_or_segments.find(flag_or_segment.first);
95 if (oldItem != existing_flags_or_segments.end() &&
96 flag_or_segment.second.version <= oldItem->second->version) {
111 boost::signals2::signal<void(std::shared_ptr<ChangeSet>)> signals_;
121 mutable std::recursive_mutex signal_mutex_;
Definition: change_notifier.hpp:16
Definition: change_notifier.hpp:17
void Upsert(std::string const &key, data_model::FlagDescriptor flag) override
Upsert a flag named by key.
Definition: change_notifier.cpp:47
std::string const & Identity() const override
Definition: change_notifier.cpp:76
void Init(data_model::SDKDataSet data_set) override
Initialize the destination with a base set of data.
Definition: change_notifier.cpp:16
std::unique_ptr< IConnection > OnFlagChange(ChangeHandler handler) override
Definition: change_notifier.cpp:8
Definition: dependency_tracker.hpp:26
Definition: dependency_tracker.hpp:94
void UpdateDependencies(std::string const &key, data_model::FlagDescriptor const &flag)
Definition: dependency_tracker.cpp:99
void CalculateChanges(DataKind kind, std::string const &key, DependencySet &dependency_set)
Definition: dependency_tracker.cpp:130
IDestination represents a sink for data received by the SDK. A destination may be a database,...
Definition: idestination.hpp:14
IStore provides shared ownership of flag and segment domain objects.
Definition: istore.hpp:15