3 #include "../../data_interfaces/destination/itransactional_destination.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>>;
32 std::unique_ptr<IConnection>
OnFlagChange(ChangeHandler handler)
override;
34 void Init(data_model::SDKDataSet data_set)
override;
35 void Upsert(std::string
const& key,
36 data_model::FlagDescriptor flag)
override;
37 void Upsert(std::string
const& key,
38 data_model::SegmentDescriptor segment)
override;
39 void Apply(data_model::ChangeSet<data_interfaces::ChangeSetData> change_set)
42 [[nodiscard]] std::string
const&
Identity()
const override;
52 bool HasListeners()
const;
54 template <
typename FlagOrSegment>
55 void UpsertCommon(DataKind kind,
57 SharedItem<FlagOrSegment> existing,
58 data_model::ItemDescriptor<FlagOrSegment> updated) {
59 if (existing && (updated.version <= existing->version)) {
69 NotifyChanges(updated_deps);
72 sink_.
Upsert(key, updated);
75 template <
typename FlagOrSegment>
76 void CalculateChanges(
78 SharedCollection<FlagOrSegment>
const& existing_flags_or_segments,
79 Collection<FlagOrSegment>
const& new_flags_or_segments,
81 for (
auto const& old_flag_or_segment : existing_flags_or_segments) {
82 auto new_flag_or_segment =
83 new_flags_or_segments.find(old_flag_or_segment.first);
84 if (new_flag_or_segment != new_flags_or_segments.end() &&
85 new_flag_or_segment->second.version <=
86 old_flag_or_segment.second->version) {
92 kind, old_flag_or_segment.first, updated_items);
95 for (
auto const& flag_or_segment : new_flags_or_segments) {
97 existing_flags_or_segments.find(flag_or_segment.first);
98 if (oldItem != existing_flags_or_segments.end() &&
99 flag_or_segment.second.version <= oldItem->second->version) {
114 boost::signals2::signal<void(std::shared_ptr<ChangeSet>)> signals_;
124 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:62
std::string const & Identity() const override
Definition: change_notifier.cpp:164
void Init(data_model::SDKDataSet data_set) override
Initialize the destination with a base set of data.
Definition: change_notifier.cpp:31
std::unique_ptr< IConnection > OnFlagChange(ChangeHandler handler) override
Definition: change_notifier.cpp:23
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
virtual void Upsert(std::string const &key, data_model::FlagDescriptor flag)=0
Upsert a flag named by key.
IStore provides shared ownership of flag and segment domain objects.
Definition: istore.hpp:15
Definition: itransactional_destination.hpp:18