ladybird/Userland/Libraries/LibSQL/TupleDescriptor.h
Jan de Visser 7ea54db430 LibSQL: Add 'schema' and 'table' to TupleElementDescriptor
These are needed to distinguish columns from different tables with the
same column name in one and the same (joined) Tuple. Not quite happy
yet with this API; I think some sort of hierarchical structure would be
better but we'll burn that bridge when we get there :^)
2021-11-10 14:47:49 +01:00

106 lines
2.7 KiB
C++

/*
* Copyright (c) 2021, Jan de Visser <jan@de-visser.net>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/Vector.h>
#include <LibSQL/Serializer.h>
#include <LibSQL/Type.h>
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>((u8)type);
serializer.serialize<u8>((u8)order);
}
void deserialize(Serializer& serializer)
{
name = serializer.deserialize<String>();
type = (SQLType)serializer.deserialize<u8>();
order = (Order)serializer.deserialize<u8>();
}
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<TupleElementDescriptor>
, public RefCounted<TupleDescriptor> {
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<u32>(size());
for (auto& element : *this) {
serializer.serialize<TupleElementDescriptor>(element);
}
}
void deserialize(Serializer& serializer)
{
auto sz = serializer.deserialize<u32>();
for (auto ix = 0u; ix < sz; ix++) {
append(serializer.deserialize<TupleElementDescriptor>());
}
}
size_t length() const
{
size_t len = sizeof(u32);
for (auto& element : *this) {
len += element.length();
}
return len;
}
String to_string() const
{
Vector<String> elements;
for (auto& element : *this) {
elements.append(element.to_string());
}
return String::formatted("[\n{}\n]", String::join("\n", elements));
}
using Vector<TupleElementDescriptor>::operator==;
};
}