/* * Copyright (C) 2015 ScyllaDB * */ /* * This file is part of Scylla. * * Scylla is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Scylla is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Scylla. If not, see . */ #pragma once #include "bytes.hh" #include "key.hh" #include "core/temporary_buffer.hh" #include "consumer.hh" #include "sstables/types.hh" // sstables::data_consume_row feeds the contents of a single row into a // row_consumer object: // // * First, consume_row_start() is called, with some information about the // whole row: The row's key, timestamp, etc. // * Next, consume_cell() is called once for every column. // * Finally, consume_row_end() is called. A consumer written for a single // column will likely not want to do anything here. // // Important note: the row key, column name and column value, passed to the // consume_* functions, are passed as a "bytes_view" object, which points to // internal data held by the feeder. This internal data is only valid for the // duration of the single consume function it was passed to. If the object // wants to hold these strings longer, it must make a copy of the bytes_view's // contents. [Note, in reality, because our implementation reads the whole // row into one buffer, the byte_views remain valid until consume_row_end() // is called.] class row_consumer { public: using proceed = data_consumer::proceed; // Consume the row's key and deletion_time. The latter determines if the // row is a tombstone, and if so, when it has been deleted. // Note that the key is in serialized form, and should be deserialized // (according to the schema) before use. // As explained above, the key object is only valid during this call, and // if the implementation wishes to save it, it must copy the *contents*. virtual proceed consume_row_start(sstables::key_view key, sstables::deletion_time deltime) = 0; // Consume one cell (column name and value). Both are serialized, and need // to be deserialized according to the schema. // When a cell is set with an expiration time, "ttl" is the time to live // (in seconds) originally set for this cell, and "expiration" is the // absolute time (in seconds since the UNIX epoch) when this cell will // expire. Typical cells, not set to expire, will get expiration = 0. virtual proceed consume_cell(bytes_view col_name, bytes_view value, int64_t timestamp, int32_t ttl, int32_t expiration) = 0; // Consume one counter cell. Column name and value are serialized, and need // to be deserialized according to the schema. virtual proceed consume_counter_cell(bytes_view col_name, bytes_view value, int64_t timestamp) = 0; // Consume a deleted cell (i.e., a cell tombstone). virtual proceed consume_deleted_cell(bytes_view col_name, sstables::deletion_time deltime) = 0; // Consume one range tombstone. virtual proceed consume_range_tombstone( bytes_view start_col, bytes_view end_col, sstables::deletion_time deltime) = 0; // Called at the end of the row, after all cells. // Returns a flag saying whether the sstable consumer should stop now, or // proceed consuming more data. virtual proceed consume_row_end() = 0; // Called when the reader is fast forwarded to given element. virtual void reset(sstables::indexable_element) = 0; // Under which priority class to place I/O coming from this consumer virtual const io_priority_class& io_priority() = 0; virtual ~row_consumer() { } };