Files
scylladb/data_dictionary/impl.hh
Avi Kivity e55a606423 data_dictionary: add database/keyspace/table objects
Add metadata-only counterparts to ::database, ::keyspace, and ::table.

Apart from being metadata-only objects suitable for the coordinator,
the new types are also type-erased and so they can be mocked without
being linked to ::database and friends.

We use a single abstract class to mediate between data_dictionary
objects and the objects they represent (data_dictionary::impl).
This makes the data_dictionary objects very lightweight - they
only contain a pointer to the impl object (of which only one
needs to be instantiated), and a reference to the object that
is represented. This allows these objects to be easily passed
by value.

The abstraction is leaky: in one place it is outright breached
with data_dictionary::database::real_database() that returns
a ::database reference. This is used so that we can perform the
transition incrementally. Another place is that one of the
methods returns a secondary_index_manager, which in turn grants
access to the real objects. This will be addressed later, probably
by type erasing as well.

This patch only contains the interface, and no implementation. It
is somewhat messy since it mimics the years-old evolution of the
real objects, but maybe it will be easier to improve it now.
2021-12-15 13:52:31 +02:00

90 lines
3.3 KiB
C++

/*
* Copyright (C) 2021-present 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 <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "data_dictionary.hh"
// Interface for implementing data_dictionary classes
namespace data_dictionary {
class impl {
public:
virtual ~impl();
virtual std::optional<keyspace> try_find_keyspace(database db, std::string_view name) const = 0;
virtual std::optional<table> try_find_table(database db, std::string_view ks, std::string_view tab) const = 0;
virtual std::optional<table> try_find_table(database db, utils::UUID id) const = 0;
virtual const secondary_index::secondary_index_manager& get_index_manager(table t) const = 0;
virtual schema_ptr get_table_schema(table t) const = 0;
virtual lw_shared_ptr<keyspace_metadata> get_keyspace_metadata(keyspace ks) const = 0;
virtual const locator::abstract_replication_strategy& get_replication_strategy(keyspace ks) const = 0;
virtual const std::vector<view_ptr>& get_table_views(table t) const = 0;
virtual sstring get_available_index_name(database db, std::string_view ks_name, std::string_view table_name,
std::optional<sstring> index_name_root) const = 0;
virtual std::set<sstring> existing_index_names(database db, std::string_view ks_name, std::string_view cf_to_exclude = {}) const = 0;
virtual schema_ptr find_indexed_table(database db, std::string_view ks_name, std::string_view index_name) const = 0;
virtual schema_ptr get_cdc_base_table(database db, const schema&) const = 0;
virtual const db::config& get_config(database db) const = 0;
virtual const db::extensions& get_extensions(database db) const = 0;
virtual const gms::feature_service& get_features(database db) const = 0;
virtual ::database& real_database(database db) const = 0;
protected:
// Tools for type erasing an unerasing
static database make_database(const impl* i, const void* db) {
return database(i, db);
}
static keyspace make_keyspace(const impl* i, const void* k) {
return keyspace(i, k);
}
static table make_table(const impl* i, const void* db) {
return table(i, db);
}
static const void* extract(database db) {
return db._database;
}
static const void* extract(keyspace ks) {
return ks._keyspace;
}
static const void* extract(table t) {
return t._table;
}
};
inline
table::table(const impl* ops, const void* table)
: _ops(ops)
, _table(table) {
}
inline
keyspace::keyspace(const impl* ops, const void* keyspace)
: _ops(ops)
, _keyspace(keyspace) {
}
inline
database::database(const impl* ops, const void* database)
: _ops(ops)
, _database(database) {
}
}