blob: 5cf8fb8eae3baf3c1f64dbbbccbb2be5dc3f32f2 [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.
*/
#include <ignite/binary/binary_raw_reader.h>
#include <ignite/thin/cache/cache_peek_mode.h>
#include <ignite/impl/thin/writable.h>
#include <ignite/impl/thin/readable.h>
#include "impl/response_status.h"
#include "impl/message.h"
namespace ignite
{
namespace impl
{
namespace thin
{
GetOrCreateCacheWithNameRequest::GetOrCreateCacheWithNameRequest(const std::string& name) :
name(name)
{
// No-op.
}
void GetOrCreateCacheWithNameRequest::Write(binary::BinaryWriterImpl& writer, const ProtocolVersion&) const
{
writer.WriteString(name);
}
CreateCacheWithNameRequest::CreateCacheWithNameRequest(const std::string& name) :
name(name)
{
// No-op.
}
void CreateCacheWithNameRequest::Write(binary::BinaryWriterImpl& writer, const ProtocolVersion&) const
{
writer.WriteString(name);
}
Response::Response():
status(ResponseStatus::FAILED)
{
// No-op.
}
Response::~Response()
{
// No-op.
}
void Response::Read(binary::BinaryReaderImpl& reader, const ProtocolVersion& ver)
{
status = reader.ReadInt32();
if (status == ResponseStatus::SUCCESS)
ReadOnSuccess(reader, ver);
else
reader.ReadString(error);
}
ClientCacheNodePartitionsResponse::ClientCacheNodePartitionsResponse(
std::vector<ConnectableNodePartitions>& nodeParts):
nodeParts(nodeParts)
{
// No-op.
}
ClientCacheNodePartitionsResponse::~ClientCacheNodePartitionsResponse()
{
// No-op.
}
void ClientCacheNodePartitionsResponse::ReadOnSuccess(
binary::BinaryReaderImpl& reader, const ProtocolVersion&)
{
int32_t num = reader.ReadInt32();
nodeParts.clear();
nodeParts.resize(static_cast<size_t>(num));
for (int32_t i = 0; i < num; ++i)
nodeParts[i].Read(reader);
}
CacheValueResponse::CacheValueResponse(Readable& value) :
value(value)
{
// No-op.
}
CacheValueResponse::~CacheValueResponse()
{
// No-op.
}
void CacheValueResponse::ReadOnSuccess(binary::BinaryReaderImpl& reader, const ProtocolVersion&)
{
value.Read(reader);
}
void BinaryTypeGetRequest::Write(binary::BinaryWriterImpl& writer, const ProtocolVersion& ver) const
{
writer.WriteInt32(typeId);
}
void BinaryTypePutRequest::Write(binary::BinaryWriterImpl& writer, const ProtocolVersion& ver) const
{
writer.WriteInt32(snapshot.GetTypeId());
writer.WriteString(snapshot.GetTypeName());
// Affinity Key Field name.
writer.WriteNull();
const binary::Snap::FieldMap& fields = snapshot.GetFieldMap();
writer.WriteInt32(static_cast<int32_t>(fields.size()));
for (binary::Snap::FieldMap::const_iterator it = fields.begin(); it != fields.end(); ++it)
{
writer.WriteString(it->first);
writer.WriteInt32(it->second.GetTypeId());
writer.WriteInt32(it->second.GetFieldId());
}
// Is enum: always false for now as we do not support enums.
writer.WriteBool(false);
// Schemas. Compact schema is not supported for now.
writer.WriteInt32(0);
}
void BinaryTypeGetResponse::ReadOnSuccess(binary::BinaryReaderImpl& reader, const ProtocolVersion&)
{
int32_t typeId = reader.ReadInt32();
std::string typeName;
reader.ReadString(typeName);
// Unused for now.
std::string affKeyFieldNameUnused;
reader.ReadString(affKeyFieldNameUnused);
snapshot = binary::SPSnap(new binary::Snap(typeName, typeId));
int32_t fieldsNum = reader.ReadInt32();
for (int32_t i = 0; i < fieldsNum; ++i)
{
std::string fieldName;
reader.ReadString(fieldName);
int32_t fieldTypeId = reader.ReadInt32();
int32_t fieldId = reader.ReadInt32();
snapshot.Get()->AddField(fieldId, fieldName, fieldTypeId);
}
// Check if the type is enum.
bool isEnum = reader.ReadBool();
if (isEnum)
throw IgniteError(IgniteError::IGNITE_ERR_BINARY, "Enum types is not supported.");
// Ignoring schemas for now.
}
void DestroyCacheRequest::Write(binary::BinaryWriterImpl& writer, const ProtocolVersion&) const
{
writer.WriteInt32(cacheId);
}
void GetCacheNamesResponse::ReadOnSuccess(binary::BinaryReaderImpl& reader, const ProtocolVersion&)
{
int32_t len = reader.ReadInt32();
cacheNames.reserve(static_cast<size_t>(len));
for (int32_t i = 0; i < len; i++)
{
std::string res;
reader.ReadString(res);
cacheNames.push_back(res);
}
}
void BoolResponse::ReadOnSuccess(binary::BinaryReaderImpl& reader, const ProtocolVersion&)
{
value = reader.ReadBool();
}
CacheGetSizeRequest::CacheGetSizeRequest(int32_t cacheId, bool binary, int32_t peekModes) :
CacheRequest<RequestType::CACHE_GET_SIZE>(cacheId, binary),
peekModes(peekModes)
{
// No-op.
}
void CacheGetSizeRequest::Write(binary::BinaryWriterImpl& writer, const ProtocolVersion& ver) const
{
CacheRequest<RequestType::CACHE_GET_SIZE>::Write(writer, ver);
if (peekModes & ignite::thin::cache::CachePeekMode::ALL)
{
// Size.
writer.WriteInt32(1);
writer.WriteInt8(0);
return;
}
interop::InteropOutputStream* stream = writer.GetStream();
// Reserve size.
int32_t sizePos = stream->Reserve(4);
if (peekModes & ignite::thin::cache::CachePeekMode::NEAR_CACHE)
stream->WriteInt8(1);
if (peekModes & ignite::thin::cache::CachePeekMode::PRIMARY)
stream->WriteInt8(2);
if (peekModes & ignite::thin::cache::CachePeekMode::BACKUP)
stream->WriteInt8(3);
if (peekModes & ignite::thin::cache::CachePeekMode::ONHEAP)
stream->WriteInt8(4);
if (peekModes & ignite::thin::cache::CachePeekMode::OFFHEAP)
stream->WriteInt8(5);
int32_t size = stream->Position() - sizePos - 4;
stream->WriteInt32(sizePos, size);
stream->Synchronize();
}
void Int64Response::ReadOnSuccess(binary::BinaryReaderImpl& reader, const ProtocolVersion&)
{
value = reader.ReadInt64();
}
}
}
}