mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 23:50:19 +00:00
7ea54db430
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 :^)
106 lines
2.7 KiB
C++
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==;
|
|
};
|
|
|
|
}
|