/* * Copyright (c) 2021, Jan de Visser * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace SQL { struct TupleElementDescriptor { String name { "" }; SQLType type { SQLType::Text }; Order order { Order::Ascending }; bool operator==(TupleElementDescriptor const&) const = default; void serialize(Serializer& serializer) const { serializer.serialize(name); serializer.serialize((u8)type); serializer.serialize((u8)order); } void deserialize(Serializer& serializer) { name = serializer.deserialize(); type = (SQLType)serializer.deserialize(); order = (Order)serializer.deserialize(); } size_t length() const { return (sizeof(u32) + name.length()) + 2 * sizeof(u8); } }; class TupleDescriptor : public Vector , public RefCounted { public: TupleDescriptor() = default; ~TupleDescriptor() = default; [[nodiscard]] int compare_ignoring_names(TupleDescriptor const& other) const { if (size() != other.size()) return (int)size() - (int)other.size(); for (auto ix = 0u; ix < size(); ++ix) { auto elem = (*this)[ix]; auto other_elem = other[ix]; if ((elem.type != other_elem.type) || (elem.order != other_elem.order)) { return 1; } } return 0; } void serialize(Serializer& serializer) const { serializer.serialize(size()); for (auto& element : *this) { serializer.serialize(element); } } void deserialize(Serializer& serializer) { auto sz = serializer.deserialize(); for (auto ix = 0u; ix < sz; ix++) { append(serializer.deserialize()); } } size_t length() const { size_t len = sizeof(u32); for (auto& element : *this) { len += element.length(); } return len; } using Vector::operator==; }; }