blob: e505896e48491d3c31a9baa8036f4b6cb745f5db [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <ignite/common/bytes_view.h>
#include <ignite/common/ignite_error.h>
#include <ignite/common/primitive.h>
#include <ignite/common/uuid.h>
#include <ignite/tuple/binary_tuple_builder.h>
#include <ignite/tuple/binary_tuple_parser.h>
#include <array>
#include <functional>
#include <optional>
#include <cstddef>
#include <cstdint>
struct msgpack_object;
namespace ignite::protocol {
class reader;
/**
* Error data extensions. When the server returns an error response, it may contain additional data in a map.
* Keys are defined here.
*/
namespace error_extensions {
constexpr const char* EXPECTED_SCHEMA_VERSION = "expected-schema-ver";
constexpr const char* SQL_UPDATE_COUNTERS = "sql-update-counters";
};
/** Magic bytes. */
static constexpr std::array<std::byte, 4> MAGIC_BYTES = {
std::byte('I'), std::byte('G'), std::byte('N'), std::byte('I')};
template<typename T>
[[nodiscard]] std::optional<T> try_unpack_object(const msgpack_object &) {
static_assert(sizeof(T) == 0, "Unpacking is not implemented for the type");
}
/**
* Try unpack number.
*
* @param object MsgPack object.
* @return Number or @c nullopt if the object is not a number.
*/
template<>
[[nodiscard]] std::optional<std::int64_t> try_unpack_object(const msgpack_object &object);
/**
* Try unpack number.
*
* @param object MsgPack object.
* @return Number or @c nullopt if the object is not a number.
*/
template<>
[[nodiscard]] std::optional<std::int32_t> try_unpack_object(const msgpack_object &object);
/**
* Try to unpack a string.
*
* @param object MsgPack object.
* @return String or @c nullopt if the object is not a string.
*/
template<>
[[nodiscard]] std::optional<std::string> try_unpack_object(const msgpack_object &object);
template<typename T>
[[nodiscard]] std::optional<T> unpack_nullable(const msgpack_object &) {
static_assert(sizeof(T) == 0, "Unpacking is not implemented for the type");
}
/**
* Unpack string.
*
* @param object MsgPack object.
* @return String of @c nullopt if the object is @c nil.
* @throw ignite_error if the object is not a string.
*/
template<>
[[nodiscard]] std::optional<std::string> unpack_nullable(const msgpack_object &object);
template<typename T>
[[nodiscard]] T unpack_object(const msgpack_object &) {
static_assert(sizeof(T) == 0, "Unpacking is not implemented for the type");
}
/**
* Unpack number.
*
* @param object MsgPack object.
* @return Number.
* @throw ignite_error if the object is not a number.
*/
template<>
[[nodiscard]] std::int64_t unpack_object(const msgpack_object &object);
/**
* Unpack number.
*
* @param object MsgPack object.
* @return Number.
* @throw ignite_error if the object is not a number.
*/
template<>
[[nodiscard]] std::uint64_t unpack_object(const msgpack_object &object);
/**
* Unpack number.
*
* @param object MsgPack object.
* @return Number.
* @throw ignite_error if the object is not a number.
*/
template<>
[[nodiscard]] std::int32_t unpack_object(const msgpack_object &object);
/**
* Unpack number.
*
* @param object MsgPack object.
* @return Number.
* @throw ignite_error if the object is not a number.
*/
template<>
[[nodiscard]] std::int16_t unpack_object(const msgpack_object &object);
/**
* Unpack number.
*
* @param object MsgPack object.
* @return Number.
* @throw ignite_error if the object is not a number.
*/
template<>
[[nodiscard]] std::uint16_t unpack_object(const msgpack_object &object);
/**
* Unpack number.
*
* @param object MsgPack object.
* @return Number.
* @throw ignite_error if the object is not a number.
*/
template<>
[[nodiscard]] std::int8_t unpack_object(const msgpack_object &object);
/**
* Unpack number.
*
* @param object MsgPack object.
* @return Number.
* @throw ignite_error if the object is not a number.
*/
template<>
[[nodiscard]] std::uint8_t unpack_object(const msgpack_object &object);
/**
* Unpack string.
*
* @param object MsgPack object.
* @return String.
* @throw ignite_error if the object is not a string.
*/
template<>
[[nodiscard]] std::string unpack_object(const msgpack_object &object);
/**
* Unpack UUID.
*
* @param object MsgPack object.
* @return UUID.
* @throw ignite_error if the object is not a UUID.
*/
template<>
[[nodiscard]] uuid unpack_object(const msgpack_object &object);
/**
* Unpack bool.
*
* @param object MsgPack object.
* @return bool value.
* @throw ignite_error if the object is not a bool.
*/
template<>
[[nodiscard]] bool unpack_object(const msgpack_object &object);
/**
* Get binary data.
*
* @param object Object.
* @return Binary data view.
*/
[[nodiscard]] bytes_view unpack_binary(const msgpack_object &object);
/**
* Read error.
*
* @param reader reader.
* @return Error if there is any.
*/
[[nodiscard]] std::optional<ignite_error> try_read_error(protocol::reader &reader);
/**
* Read error core.
*
* @param reader reader.
* @return Error.
*/
[[nodiscard]] ignite_error read_error(protocol::reader &reader);
/**
* Claim type and scale header for a value written in binary tuple.
*
* @param builder Tuple builder.
* @param typ Type.
* @param scale Scale.
*/
inline void claim_type_and_scale(binary_tuple_builder &builder, ignite_type typ, std::int32_t scale = 0) {
builder.claim_int32(static_cast<std::int32_t>(typ));
builder.claim_int32(scale);
}
/**
* Append type and scale header for a value written in binary tuple.
*
* @param builder Tuple builder.
* @param typ Type.
* @param scale Scale.
*/
inline void append_type_and_scale(binary_tuple_builder &builder, ignite_type typ, std::int32_t scale = 0) {
builder.append_int32(static_cast<std::int32_t>(typ));
builder.append_int32(scale);
}
/**
* Claim space for a value with type header in tuple builder.
*
* @param builder Tuple builder.
* @param value Value.
*/
void claim_primitive_with_type(binary_tuple_builder &builder, const primitive &value);
/**
* Append a value with type header in tuple builder.
*
* @param builder Tuple builder.
* @param value Value.
*/
void append_primitive_with_type(binary_tuple_builder &builder, const primitive &value);
/**
* Read column value from binary tuple.
*
* @param parser Binary tuple parser.
* @param typ Column type.
* @param scale Column scale.
* @return Column value.
*/
[[nodiscard]] primitive read_next_column(binary_tuple_parser &parser, ignite_type typ, std::int32_t scale);
} // namespace ignite::protocol