Skip to content

Commit

Permalink
remove removed_nodes_tracker
Browse files Browse the repository at this point in the history
  • Loading branch information
spoonincode committed Jan 11, 2024
1 parent 0faebfe commit 1682873
Show file tree
Hide file tree
Showing 2 changed files with 1 addition and 100 deletions.
45 changes: 0 additions & 45 deletions include/chainbase/undo_index.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -415,41 +415,6 @@ namespace chainbase {
BOOST_THROW_EXCEPTION( std::logic_error{ "could not modify object, most likely a uniqueness constraint was violated" } );
}

// Allows testing whether a value has been removed from the undo_index.
//
// The lifetime of an object removed through a removed_nodes_tracker
// does not end before the removed_nodes_tracker is destroyed or invalidated.
//
// A removed_nodes_tracker is invalidated by the following members of undo_index:
// start_undo_session, commit, squash, and undo.
class removed_nodes_tracker {
public:
explicit removed_nodes_tracker(undo_index& idx) : _self(&idx) {}
~removed_nodes_tracker() {
_removed_values.clear_and_dispose([this](value_type* obj) { _self->dispose_node(*obj); });
}
removed_nodes_tracker(const removed_nodes_tracker&) = delete;
removed_nodes_tracker& operator=(const removed_nodes_tracker&) = delete;
bool is_removed(const value_type& obj) const {
return undo_index::get_removed_field(obj) == erased_flag;
}
// Must be used in place of undo_index::remove
void remove(const value_type& obj) {
_self->remove(obj, *this);
}
private:
friend class undo_index;
void save(value_type& obj) {
undo_index::set_removed_field(obj, erased_flag);
_removed_values.push_front(obj);
}
undo_index* _self;
list_base<node, index0_type> _removed_values;
};
auto track_removed() {
return removed_nodes_tracker(*this);
}

void remove( const value_type& obj ) noexcept {
auto& node_ref = const_cast<value_type&>(obj);
erase_impl(node_ref);
Expand All @@ -458,16 +423,6 @@ namespace chainbase {
}
}

private:

void remove( const value_type& obj, removed_nodes_tracker& tracker ) noexcept {
auto& node_ref = const_cast<value_type&>(obj);
erase_impl(node_ref);
if(on_remove(node_ref)) {
tracker.save(node_ref);
}
}

public:

template<typename CompatibleKey>
Expand Down
56 changes: 1 addition & 55 deletions test/undo_index.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ EXCEPTION_TEST_CASE(test_simple) {
struct test_element_t {
template<typename C, typename A>
test_element_t(C&& c, A&&) { c(*this); }

uint64_t id;
int secondary;
throwing_copy dummy;
Expand Down Expand Up @@ -877,58 +877,4 @@ BOOST_AUTO_TEST_CASE(test_project) {
}


EXCEPTION_TEST_CASE(test_remove_tracking_session) {
fs::path temp = fs::temp_directory_path() / "pinnable_mapped_file";
try {
chainbase::pinnable_mapped_file db(temp, true, 1024 * 1024, false, chainbase::pinnable_mapped_file::map_mode::mapped);
test_allocator<basic_element_t> alloc(db.get_segment_manager());
undo_index_in_segment<test_element_t, test_allocator<test_element_t>,
boost::multi_index::ordered_unique<key<&test_element_t::id>>,
boost::multi_index::ordered_unique<key<&test_element_t::secondary>>> i0(alloc);
i0->emplace([](test_element_t& elem) { elem.secondary = 20; });
auto session = i0->start_undo_session(true);
auto tracker = i0->track_removed();
i0->emplace([](test_element_t& elem) { elem.secondary = 21; });
const test_element_t& elem0 = *i0->find(0);
const test_element_t& elem1 = *i0->find(1);
BOOST_CHECK(!tracker.is_removed(elem0));
BOOST_CHECK(!tracker.is_removed(elem1));
tracker.remove(elem0);
tracker.remove(elem1);
BOOST_CHECK(tracker.is_removed(elem0));
BOOST_CHECK(tracker.is_removed(elem1));
} catch ( ... ) {
fs::remove_all( temp );
throw;
}
fs::remove_all( temp );
}


EXCEPTION_TEST_CASE(test_remove_tracking_no_session) {
fs::path temp = fs::temp_directory_path() / "pinnable_mapped_file";
try {
chainbase::pinnable_mapped_file db(temp, true, 1024 * 1024, false, chainbase::pinnable_mapped_file::map_mode::mapped);
test_allocator<basic_element_t> alloc(db.get_segment_manager());
undo_index_in_segment<test_element_t, test_allocator<test_element_t>,
boost::multi_index::ordered_unique<key<&test_element_t::id>>,
boost::multi_index::ordered_unique<key<&test_element_t::secondary>>> i0(alloc);
i0->emplace([](test_element_t& elem) { elem.secondary = 20; });
auto tracker = i0->track_removed();
i0->emplace([](test_element_t& elem) { elem.secondary = 21; });
const test_element_t& elem0 = *i0->find(0);
const test_element_t& elem1 = *i0->find(1);
BOOST_CHECK(!tracker.is_removed(elem0));
BOOST_CHECK(!tracker.is_removed(elem1));
tracker.remove(elem0);
tracker.remove(elem1);
BOOST_CHECK(tracker.is_removed(elem0));
BOOST_CHECK(tracker.is_removed(elem1));
} catch ( ... ) {
fs::remove_all( temp );
throw;
}
fs::remove_all( temp );
}

BOOST_AUTO_TEST_SUITE_END()

0 comments on commit 1682873

Please sign in to comment.