Fixes some typos as found by codespell run on the code. In this commit, I was hoping to fix only comments, not user-visible alerts, output, etc. Follow-up commits will take care of them. Refs: https://github.com/scylladb/scylladb/issues/16255 Signed-off-by: Yaniv Kaul <yaniv.kaul@scylladb.com>
364 lines
9.6 KiB
C++
364 lines
9.6 KiB
C++
/*
|
|
* Modified by ScyllaDB
|
|
*
|
|
* Copyright (C) 2015-present ScyllaDB
|
|
*/
|
|
|
|
/*
|
|
* SPDX-License-Identifier: (AGPL-3.0-or-later and Apache-2.0)
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "types/types.hh"
|
|
#include "data_dictionary/data_dictionary.hh"
|
|
#include "exceptions/exceptions.hh"
|
|
#include <iosfwd>
|
|
#include "enum_set.hh"
|
|
|
|
namespace data_dictionary {
|
|
class database;
|
|
class user_types_metadata;
|
|
}
|
|
namespace auth {
|
|
class resource;
|
|
}
|
|
|
|
namespace cql3 {
|
|
|
|
class ut_name;
|
|
|
|
class cql3_type final {
|
|
data_type _type;
|
|
public:
|
|
cql3_type(data_type type) : _type(std::move(type)) {}
|
|
bool is_collection() const { return _type->is_collection(); }
|
|
bool is_counter() const { return _type->is_counter(); }
|
|
bool is_native() const { return _type->is_native(); }
|
|
bool is_user_type() const { return _type->is_user_type(); }
|
|
data_type get_type() const { return _type; }
|
|
const sstring& to_string() const { return _type->cql3_type_name(); }
|
|
|
|
// For UserTypes, we need to know the current keyspace to resolve the
|
|
// actual type used, so Raw is a "not yet prepared" CQL3Type.
|
|
class raw {
|
|
virtual sstring to_string() const = 0;
|
|
protected:
|
|
bool _frozen = false;
|
|
public:
|
|
virtual ~raw() {}
|
|
virtual bool supports_freezing() const = 0;
|
|
virtual bool is_collection() const;
|
|
virtual bool is_counter() const;
|
|
virtual bool is_duration() const;
|
|
virtual bool is_user_type() const;
|
|
bool is_frozen() const;
|
|
virtual bool references_user_type(const sstring&) const;
|
|
virtual std::optional<sstring> keyspace() const;
|
|
virtual void freeze();
|
|
virtual cql3_type prepare_internal(const sstring& keyspace, const data_dictionary::user_types_metadata&) = 0;
|
|
virtual cql3_type prepare(data_dictionary::database db, const sstring& keyspace);
|
|
static shared_ptr<raw> from(cql3_type type);
|
|
static shared_ptr<raw> user_type(ut_name name);
|
|
static shared_ptr<raw> map(shared_ptr<raw> t1, shared_ptr<raw> t2);
|
|
static shared_ptr<raw> list(shared_ptr<raw> t);
|
|
static shared_ptr<raw> set(shared_ptr<raw> t);
|
|
static shared_ptr<raw> tuple(std::vector<shared_ptr<raw>> ts);
|
|
static shared_ptr<raw> frozen(shared_ptr<raw> t);
|
|
friend std::ostream& operator<<(std::ostream& os, const raw& r);
|
|
friend sstring format_as(const raw& r) {
|
|
return r.to_string();
|
|
}
|
|
friend class auth::resource;
|
|
};
|
|
|
|
private:
|
|
class raw_type;
|
|
class raw_collection;
|
|
class raw_ut;
|
|
class raw_tuple;
|
|
friend std::ostream& operator<<(std::ostream& os, const cql3_type& t) {
|
|
return os << t.to_string();
|
|
}
|
|
|
|
public:
|
|
enum class kind : int8_t {
|
|
ASCII, BIGINT, BLOB, BOOLEAN, COUNTER, DECIMAL, DOUBLE, EMPTY, FLOAT, INT, SMALLINT, TINYINT, INET, TEXT, TIMESTAMP, UUID, VARINT, TIMEUUID, DATE, TIME, DURATION
|
|
};
|
|
using kind_enum = super_enum<kind,
|
|
kind::ASCII,
|
|
kind::BIGINT,
|
|
kind::BLOB,
|
|
kind::BOOLEAN,
|
|
kind::COUNTER,
|
|
kind::DECIMAL,
|
|
kind::DOUBLE,
|
|
kind::EMPTY,
|
|
kind::FLOAT,
|
|
kind::INET,
|
|
kind::INT,
|
|
kind::SMALLINT,
|
|
kind::TINYINT,
|
|
kind::TEXT,
|
|
kind::TIMESTAMP,
|
|
kind::UUID,
|
|
kind::VARINT,
|
|
kind::TIMEUUID,
|
|
kind::DATE,
|
|
kind::TIME,
|
|
kind::DURATION>;
|
|
using kind_enum_set = enum_set<kind_enum>;
|
|
|
|
static thread_local cql3_type ascii;
|
|
static thread_local cql3_type bigint;
|
|
static thread_local cql3_type blob;
|
|
static thread_local cql3_type boolean;
|
|
static thread_local cql3_type double_;
|
|
static thread_local cql3_type empty;
|
|
static thread_local cql3_type float_;
|
|
static thread_local cql3_type int_;
|
|
static thread_local cql3_type smallint;
|
|
static thread_local cql3_type text;
|
|
static thread_local cql3_type timestamp;
|
|
static thread_local cql3_type tinyint;
|
|
static thread_local cql3_type uuid;
|
|
static thread_local cql3_type timeuuid;
|
|
static thread_local cql3_type date;
|
|
static thread_local cql3_type time;
|
|
static thread_local cql3_type inet;
|
|
static thread_local cql3_type varint;
|
|
static thread_local cql3_type decimal;
|
|
static thread_local cql3_type counter;
|
|
static thread_local cql3_type duration;
|
|
|
|
static const std::vector<cql3_type>& values();
|
|
public:
|
|
kind_enum_set::prepared get_kind() const;
|
|
};
|
|
|
|
inline bool operator==(const cql3_type& a, const cql3_type& b) {
|
|
return a.get_type() == b.get_type();
|
|
}
|
|
|
|
#if 0
|
|
public static class Custom implements CQL3Type
|
|
{
|
|
private final AbstractType<?> type;
|
|
|
|
public Custom(AbstractType<?> type)
|
|
{
|
|
this.type = type;
|
|
}
|
|
|
|
public Custom(String className) throws SyntaxException, ConfigurationException
|
|
{
|
|
this(TypeParser.parse(className));
|
|
}
|
|
|
|
public boolean isCollection()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public AbstractType<?> getType()
|
|
{
|
|
return type;
|
|
}
|
|
|
|
@Override
|
|
public final boolean equals(Object o)
|
|
{
|
|
if(!(o instanceof Custom))
|
|
return false;
|
|
|
|
Custom that = (Custom)o;
|
|
return type.equals(that.type);
|
|
}
|
|
|
|
@Override
|
|
public final int hashCode()
|
|
{
|
|
return type.hashCode();
|
|
}
|
|
|
|
@Override
|
|
public String toString()
|
|
{
|
|
return "'" + type + "'";
|
|
}
|
|
}
|
|
|
|
public static class Collection implements CQL3Type
|
|
{
|
|
private final CollectionType type;
|
|
|
|
public Collection(CollectionType type)
|
|
{
|
|
this.type = type;
|
|
}
|
|
|
|
public AbstractType<?> getType()
|
|
{
|
|
return type;
|
|
}
|
|
|
|
public boolean isCollection()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public final boolean equals(Object o)
|
|
{
|
|
if(!(o instanceof Collection))
|
|
return false;
|
|
|
|
Collection that = (Collection)o;
|
|
return type.equals(that.type);
|
|
}
|
|
|
|
@Override
|
|
public final int hashCode()
|
|
{
|
|
return type.hashCode();
|
|
}
|
|
|
|
@Override
|
|
public String toString()
|
|
{
|
|
boolean isFrozen = !this.type.isMultiCell();
|
|
StringBuilder sb = new StringBuilder(isFrozen ? "frozen<" : "");
|
|
switch (type.kind)
|
|
{
|
|
case LIST:
|
|
AbstractType<?> listType = ((ListType)type).getElementsType();
|
|
sb.append("list<").append(listType.asCQL3Type());
|
|
break;
|
|
case SET:
|
|
AbstractType<?> setType = ((SetType)type).getElementsType();
|
|
sb.append("set<").append(setType.asCQL3Type());
|
|
break;
|
|
case MAP:
|
|
AbstractType<?> keysType = ((MapType)type).getKeysType();
|
|
AbstractType<?> valuesType = ((MapType)type).getValuesType();
|
|
sb.append("map<").append(keysType.asCQL3Type()).append(", ").append(valuesType.asCQL3Type());
|
|
break;
|
|
default:
|
|
throw new AssertionError();
|
|
}
|
|
sb.append(">");
|
|
if (isFrozen)
|
|
sb.append(">");
|
|
return sb.toString();
|
|
}
|
|
}
|
|
|
|
public static class UserDefined implements CQL3Type
|
|
{
|
|
// Keeping this separately from type just to simplify toString()
|
|
private final String name;
|
|
private final UserType type;
|
|
|
|
private UserDefined(String name, UserType type)
|
|
{
|
|
this.name = name;
|
|
this.type = type;
|
|
}
|
|
|
|
public static UserDefined create(UserType type)
|
|
{
|
|
return new UserDefined(UTF8Type.instance.compose(type.name), type);
|
|
}
|
|
|
|
public boolean isCollection()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public AbstractType<?> getType()
|
|
{
|
|
return type;
|
|
}
|
|
|
|
@Override
|
|
public final boolean equals(Object o)
|
|
{
|
|
if(!(o instanceof UserDefined))
|
|
return false;
|
|
|
|
UserDefined that = (UserDefined)o;
|
|
return type.equals(that.type);
|
|
}
|
|
|
|
@Override
|
|
public final int hashCode()
|
|
{
|
|
return type.hashCode();
|
|
}
|
|
|
|
@Override
|
|
public String toString()
|
|
{
|
|
return name;
|
|
}
|
|
}
|
|
|
|
public static class Tuple implements CQL3Type
|
|
{
|
|
private final TupleType type;
|
|
|
|
private Tuple(TupleType type)
|
|
{
|
|
this.type = type;
|
|
}
|
|
|
|
public static Tuple create(TupleType type)
|
|
{
|
|
return new Tuple(type);
|
|
}
|
|
|
|
public boolean isCollection()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public AbstractType<?> getType()
|
|
{
|
|
return type;
|
|
}
|
|
|
|
@Override
|
|
public final boolean equals(Object o)
|
|
{
|
|
if(!(o instanceof Tuple))
|
|
return false;
|
|
|
|
Tuple that = (Tuple)o;
|
|
return type.equals(that.type);
|
|
}
|
|
|
|
@Override
|
|
public final int hashCode()
|
|
{
|
|
return type.hashCode();
|
|
}
|
|
|
|
@Override
|
|
public String toString()
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.append("tuple<");
|
|
for (int i = 0; i < type.size(); i++)
|
|
{
|
|
if (i > 0)
|
|
sb.append(", ");
|
|
sb.append(type.type(i).asCQL3Type());
|
|
}
|
|
sb.append(">");
|
|
return sb.toString();
|
|
}
|
|
}
|
|
#endif
|
|
|
|
}
|