16 using MapCollection = std::map<std::string, std::shared_ptr<AbstractMap>>;
35 bool tx_contains_new_map)>;
37 static inline std::optional<Version> apply_changes(
42 const std::optional<Version>& new_maps_conflict_version,
43 bool track_read_versions,
44 bool track_deletes_on_missing_keys,
45 const std::optional<Version>& expected_rollback_count = std::nullopt)
52 bool has_writes =
false;
54 std::map<std::string, std::unique_ptr<AbstractCommitter>> views;
55 for (
const auto& [map_name, mc] : changes)
57 views[map_name] = mc.map->create_committer(mc.changeset.get());
60 for (
auto it = changes.begin(); it != changes.end(); ++it)
62 bool changeset_has_writes = it->second.changeset->has_writes();
63 if (changeset_has_writes)
67 if (changeset_has_writes || track_read_versions)
69 it->second.map->lock();
75 if (expected_rollback_count.has_value() && !changes.empty())
80 auto store = changes.begin()->second.map->get_store();
90 ok = store->check_rollback_count(expected_rollback_count.value());
96 for (
auto it = views.begin(); it != views.end(); ++it)
98 if (!it->second->prepare(track_read_versions))
106 for (
const auto& [map_name, map_ptr] : new_maps)
114 auto store = map_ptr->get_store();
119 if (new_maps_conflict_version.has_value())
121 current_v = *new_maps_conflict_version;
125 current_v = store->current_version();
128 if (store->get_map_unsafe(current_v, map_name) !=
nullptr)
135 if (ok && has_writes)
139 std::tie(version, version_last_new_map) =
140 version_resolver_fn(!new_maps.empty());
142 if (!track_read_versions)
146 for (
const auto& [map_name, map_ptr] : new_maps)
148 const auto it = views.find(map_name);
149 if (it != views.end() && it->second->has_writes())
151 map_ptr->get_store()->add_dynamic_map(version, map_ptr);
155 for (
auto it = views.begin(); it != views.end(); ++it)
158 version, track_read_versions, track_deletes_on_missing_keys);
162 for (
auto it = views.begin(); it != views.end(); ++it)
164 auto hook_ptr = it->second->post_commit();
165 if (hook_ptr !=
nullptr)
167 hooks.push_back(std::move(hook_ptr));
178 for (
auto it = changes.begin(); it != changes.end(); ++it)
180 if (it->second.changeset->has_writes() || track_read_versions)
182 it->second.map->unlock();
Definition app_interface.h:20
uint64_t Term
Definition kv_types.h:46
uint64_t Version
Definition version.h:8
std::function< std::tuple< Version, VersionLastNewMap >(bool tx_contains_new_map)> VersionResolver
Definition apply_changes.h:35
Version VersionLastNewMap
Definition apply_changes.h:33
std::map< std::string, std::shared_ptr< AbstractMap > > MapCollection
Definition apply_changes.h:16
std::map< std::string, MapChanges > OrderedChanges
Definition tx.h:42
std::vector< ConsensusHookPtr > ConsensusHookPtrs
Definition hooks.h:22
Definition apply_changes.h:19
virtual ~AbstractChangeContainer()=default
virtual void set_change_list(OrderedChanges &&change_list, Term term)=0