Files
scylladb/mutation_partition_view.cc
Tomasz Grabiec 4ab66de0ae db: Introduce frozen_mutation
The immediate motivation for introducing frozen_mutation is inability
to deserialize current "mutation" object, which needs schema reference
at the time it's constructed. It needs schema to initialize its
internal maps with proper key comparators, which depend on schema.

frozen_mutation is an immutable, compact form of a mutation. It
doesn't use complex in-memory strucutres, data is stored in a linear
buffer. In case of frozen_mutation schema needs to be supplied only at
the time mutation partition is visited. Therefore it can be trivially
deserialized without schema.
2015-05-08 09:19:01 +02:00

67 lines
2.1 KiB
C++

/*
* Copyright (C) 2015 Cloudius Systems, Ltd.
*/
#include "mutation_partition_view.hh"
#include "schema.hh"
#include "atomic_cell.hh"
#include "db/serializer.hh"
#include "utils/data_input.hh"
#include "mutation_partition_serializer.hh"
//
// See mutation_partition_serializer.cc for representation layout.
//
using namespace db;
void
mutation_partition_view::accept(const schema& schema, mutation_partition_visitor& visitor) const {
data_input in(_bytes);
visitor.accept_partition_tombstone(tombstone_serializer::read(in));
// Read static row
auto n_columns = in.read<mutation_partition_serializer::count_type>();
while (n_columns-- > 0) {
auto id = in.read<column_id>();
if (schema.static_column_at(id).is_atomic()) {
auto&& v = atomic_cell_view_serializer::read(in);
visitor.accept_static_cell(id, v);
} else {
auto&& v = collection_mutation_view_serializer::read(in);
visitor.accept_static_cell(id, v);
}
}
// Read row tombstones
auto n_tombstones = in.read<mutation_partition_serializer::count_type>();
while (n_tombstones-- > 0) {
auto&& prefix = clustering_key_prefix_view_serializer::read(in);
auto&& t = tombstone_serializer::read(in);
visitor.accept_row_tombstone(prefix, t);
}
// Read clustered rows
while (in.has_next()) {
auto&& key = clustering_key_view_serializer::read(in);
auto&& created_at = in.read<api::timestamp_type>();
auto&& deleted_at = tombstone_serializer::read(in);
visitor.accept_row(key, created_at, deleted_at);
auto n_columns = in.read<mutation_partition_serializer::count_type>();
while (n_columns-- > 0) {
auto id = in.read<column_id>();
if (schema.regular_column_at(id).is_atomic()) {
auto&& v = atomic_cell_view_serializer::read(in);
visitor.accept_row_cell(id, v);
} else {
auto&& v = collection_mutation_view_serializer::read(in);
visitor.accept_row_cell(id, v);
}
}
}
}