/* * Copyright (c) 2021, Jan de Visser * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace SQL { struct TupleElementDescriptor { String schema { "" }; String table { "" }; 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); } String to_string() const { return String::formatted(" name: {} type: {} order: {}", name, SQLType_name(type), Order_name(order)); } }; 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; } String to_string() const { Vector elements; for (auto& element : *this) { elements.append(element.to_string()); } return String::formatted("[\n{}\n]", String::join("\n", elements)); } using Vector::operator==; }; }