From e2b76fd5599262c9dbafa2aa45e47cce89bf75ec Mon Sep 17 00:00:00 2001 From: Juliusz Stasiewicz Date: Fri, 6 Mar 2020 17:47:22 +0100 Subject: [PATCH] cdc: move the extractor of `pirow` columns into separate method Because it will be used more than once. --- cdc/log.cc | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/cdc/log.cc b/cdc/log.cc index a32c2d4f8d..6cb36c3034 100644 --- a/cdc/log.cc +++ b/cdc/log.cc @@ -711,26 +711,7 @@ public: } if (has_pirow) { - value = cdef.is_atomic() - ? pirow->get_blob(cdef.name_as_text()) - : visit(*cdef.type, make_visitor( - // flatten set - [&] (const set_type_impl& type) { - auto v = pirow->get_view(cdef.name_as_text()); - auto f = cql_serialization_format::internal(); - auto n = read_collection_size(v, f); - std::vector tmp; - tmp.reserve(n); - while (n--) { - tmp.emplace_back(read_collection_value(v, f)); // key - read_collection_value(v, f); // value. ignore. - } - return set_type_impl::serialize_partially_deserialized_form(tmp, f); - }, - [&] (const abstract_type& o) -> bytes { - return pirow->get_blob(cdef.name_as_text()); - } - )); + value = get_preimage_col_value(cdef, pirow); assert(std::addressof(res.partition().clustered_row(*_log_schema, *pikey)) != std::addressof(res.partition().clustered_row(*_log_schema, log_ck))); assert(pikey->explode() != log_ck.explode()); @@ -833,6 +814,29 @@ public: return res; } + static bytes get_preimage_col_value(const column_definition& cdef, const cql3::untyped_result_set_row *pirow) { + return cdef.is_atomic() + ? pirow->get_blob(cdef.name_as_text()) + : visit(*cdef.type, make_visitor( + // flatten set + [&] (const set_type_impl& type) { + auto v = pirow->get_view(cdef.name_as_text()); + auto f = cql_serialization_format::internal(); + auto n = read_collection_size(v, f); + std::vector tmp; + tmp.reserve(n); + while (n--) { + tmp.emplace_back(read_collection_value(v, f)); // key + read_collection_value(v, f); // value. ignore. + } + return set_type_impl::serialize_partially_deserialized_form(tmp, f); + }, + [&] (const abstract_type& o) -> bytes { + return pirow->get_blob(cdef.name_as_text()); + } + )); + } + static db::timeout_clock::time_point default_timeout() { return db::timeout_clock::now() + 10s; }