mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-01-23 01:32:14 -05:00
57dc179b1f
This will make it easier to support both string types at the same time while we convert code, and tracking down remaining uses. One big exception is Value::to_string() in LibJS, where the name is dictated by the ToString AO.
106 lines
2.8 KiB
C++
106 lines
2.8 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 {
|
|
DeprecatedString schema { "" };
|
|
DeprecatedString table { "" };
|
|
DeprecatedString 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<DeprecatedString>();
|
|
type = (SQLType)serializer.deserialize<u8>();
|
|
order = (Order)serializer.deserialize<u8>();
|
|
}
|
|
|
|
size_t length() const
|
|
{
|
|
return (sizeof(u32) + name.length()) + 2 * sizeof(u8);
|
|
}
|
|
|
|
DeprecatedString to_deprecated_string() const
|
|
{
|
|
return DeprecatedString::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;
|
|
}
|
|
|
|
DeprecatedString to_deprecated_string() const
|
|
{
|
|
Vector<DeprecatedString> elements;
|
|
for (auto& element : *this) {
|
|
elements.append(element.to_deprecated_string());
|
|
}
|
|
return DeprecatedString::formatted("[\n{}\n]", DeprecatedString::join('\n', elements));
|
|
}
|
|
|
|
using Vector<TupleElementDescriptor>::operator==;
|
|
};
|
|
|
|
}
|