blob: 4380e4ac3fbdc9cc06bc1abd54b2a3f6da93c71c [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 "PdxReaderWithTypeCollector.hpp"
#include "../begin_native.hpp"
#include <PdxTypes.hpp>
#include "../end_native.hpp"
using namespace System;
namespace Apache
{
namespace Geode
{
namespace Client
{
namespace Internal
{
namespace native = apache::geode::client;
void PdxReaderWithTypeCollector::checkType(String^ fieldName, PdxFieldTypes typeId, String^ fieldType)
{
PdxFieldType^ pft = m_pdxType->GetPdxField(fieldName);
if (pft != nullptr)
{
if (static_cast<int8_t>(typeId) != pft->TypeId)
{
throw gcnew IllegalStateException("Expected " + fieldType + " field but found field of type " + pft);
}
}
}
SByte PdxReaderWithTypeCollector::ReadByte(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::BYTE, "byte");
m_newPdxType->AddFixedLengthTypeField(fieldName, "byte", PdxFieldTypes::BYTE, native::PdxTypes::BYTE_SIZE);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
SByte retVal = PdxLocalReader::ReadByte(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return 0;
}
SByte PdxReaderWithTypeCollector::ReadSByte(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::BYTE, "byte");
m_newPdxType->AddFixedLengthTypeField(fieldName, "byte", PdxFieldTypes::BYTE, native::PdxTypes::BYTE_SIZE);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
SByte retVal = PdxLocalReader::ReadSByte(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return 0;
}
Boolean PdxReaderWithTypeCollector::ReadBoolean(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::BOOLEAN, "boolean");
m_newPdxType->AddFixedLengthTypeField(fieldName, "boolean", PdxFieldTypes::BOOLEAN, native::PdxTypes::BOOLEAN_SIZE);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
m_dataInput->AdvanceCursorPdx(position);
bool retVal = PdxLocalReader::ReadBoolean(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
Char PdxReaderWithTypeCollector::ReadChar(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::CHAR, "char");
m_newPdxType->AddFixedLengthTypeField(fieldName, "char", PdxFieldTypes::CHAR, native::PdxTypes::CHAR_SIZE);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
m_dataInput->AdvanceCursorPdx(position);
Char retVal = PdxLocalReader::ReadChar(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
System::UInt16 PdxReaderWithTypeCollector::ReadUInt16(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::SHORT, "short");
m_newPdxType->AddFixedLengthTypeField(fieldName, "short", PdxFieldTypes::SHORT, native::PdxTypes::SHORT_SIZE);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
UInt16 retVal = PdxLocalReader::ReadUInt16(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return 0;
}
System::UInt32 PdxReaderWithTypeCollector::ReadUInt32(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::INT, "int");
m_newPdxType->AddFixedLengthTypeField(fieldName, "int", PdxFieldTypes::INT, native::PdxTypes::INTEGER_SIZE);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
UInt32 retVal = PdxLocalReader::ReadUInt32(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return 0;
}
System::UInt64 PdxReaderWithTypeCollector::ReadUInt64(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::LONG, "long");
m_newPdxType->AddFixedLengthTypeField(fieldName, "long", PdxFieldTypes::LONG, native::PdxTypes::LONG_SIZE);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
UInt64 retVal = PdxLocalReader::ReadUInt64(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return 0;
}
short PdxReaderWithTypeCollector::ReadShort(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::SHORT, "short");
m_newPdxType->AddFixedLengthTypeField(fieldName, "short", PdxFieldTypes::SHORT, native::PdxTypes::SHORT_SIZE);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
Int16 retVal = PdxLocalReader::ReadShort(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return 0;
}
Int32 PdxReaderWithTypeCollector::ReadInt(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::INT, "int");
m_newPdxType->AddFixedLengthTypeField(fieldName, "int", PdxFieldTypes::INT, native::PdxTypes::INTEGER_SIZE);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
Int32 retVal = PdxLocalReader::ReadInt(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return 0;
}
Int64 PdxReaderWithTypeCollector::ReadLong(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::LONG, "long");
m_newPdxType->AddFixedLengthTypeField(fieldName, "long", PdxFieldTypes::LONG, native::PdxTypes::LONG_SIZE);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
Int64 retVal = PdxLocalReader::ReadLong(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return 0;
}
float PdxReaderWithTypeCollector::ReadFloat(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::FLOAT, "float");
m_newPdxType->AddFixedLengthTypeField(fieldName, "float", PdxFieldTypes::FLOAT, native::PdxTypes::FLOAT_SIZE);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
float retVal = PdxLocalReader::ReadFloat(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return 0.0;
}
double PdxReaderWithTypeCollector::ReadDouble(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::DOUBLE, "double");
m_newPdxType->AddFixedLengthTypeField(fieldName, "double", PdxFieldTypes::DOUBLE, native::PdxTypes::DOUBLE_SIZE);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
Double retVal = PdxLocalReader::ReadDouble(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return 0.0;
}
String^ PdxReaderWithTypeCollector::ReadString(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::STRING, "String");
m_newPdxType->AddVariableLengthTypeField(fieldName, "String", PdxFieldTypes::STRING);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
String^ retVal = PdxLocalReader::ReadString(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return nullptr;
}
String^ PdxReaderWithTypeCollector::ReadUTFHuge(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::STRING, "String");
m_newPdxType->AddVariableLengthTypeField(fieldName, "String", PdxFieldTypes::STRING);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
String^ retVal = PdxLocalReader::ReadUTFHuge(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return nullptr;
}
String^ PdxReaderWithTypeCollector::ReadASCIIHuge(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::STRING, "String");
m_newPdxType->AddVariableLengthTypeField(fieldName, "String", PdxFieldTypes::STRING);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
String^ retVal = PdxLocalReader::ReadASCIIHuge(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return nullptr;
}
Object^ PdxReaderWithTypeCollector::ReadObject(String^ fieldName)
{
//field is collected after reading
checkType(fieldName, PdxFieldTypes::OBJECT, "Object");
m_newPdxType->AddVariableLengthTypeField(fieldName, "Object"/*retVal->GetType()->FullName*/, PdxFieldTypes::OBJECT);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
Object^ retVal = PdxLocalReader::ReadObject(fieldName);
m_dataInput->ResetPdx(m_startPosition);//force native as well
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return nullptr;
}
System::DateTime PdxReaderWithTypeCollector::ReadDate(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::DATE, "Date");
m_newPdxType->AddFixedLengthTypeField(fieldName, "Date", PdxFieldTypes::DATE, native::PdxTypes::DATE_SIZE);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
System::DateTime retVal = PdxLocalReader::ReadDate(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
DateTime dt(0);
return dt;
}
array<bool>^ PdxReaderWithTypeCollector::ReadBooleanArray(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::BOOLEAN_ARRAY, "boolean[]");
m_newPdxType->AddVariableLengthTypeField(fieldName, "boolean[]", PdxFieldTypes::BOOLEAN_ARRAY);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
array<bool>^ retVal = PdxLocalReader::ReadBooleanArray(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return nullptr;
}
array<Char>^ PdxReaderWithTypeCollector::ReadCharArray(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::CHAR_ARRAY, "char[]");
m_newPdxType->AddVariableLengthTypeField(fieldName, "char[]", PdxFieldTypes::CHAR_ARRAY);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
array<Char>^ retVal = PdxLocalReader::ReadCharArray(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return nullptr;
}
array<Byte>^ PdxReaderWithTypeCollector::ReadByteArray(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::BYTE_ARRAY, "byte[]");
m_newPdxType->AddVariableLengthTypeField(fieldName, "byte[]", PdxFieldTypes::BYTE_ARRAY);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
array<Byte>^ retVal = PdxLocalReader::ReadByteArray(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return nullptr;
}
array<SByte>^ PdxReaderWithTypeCollector::ReadSByteArray(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::BYTE_ARRAY, "byte[]");
m_newPdxType->AddVariableLengthTypeField(fieldName, "byte[]", PdxFieldTypes::BYTE_ARRAY);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
array<SByte>^ retVal = PdxLocalReader::ReadSByteArray(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return nullptr;
}
array<short>^ PdxReaderWithTypeCollector::ReadShortArray(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::SHORT_ARRAY, "short[]");
m_newPdxType->AddVariableLengthTypeField(fieldName, "short[]", PdxFieldTypes::SHORT_ARRAY);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
array<Int16>^ retVal = PdxLocalReader::ReadShortArray(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return nullptr;
}
array<System::UInt16>^ PdxReaderWithTypeCollector::ReadUnsignedShortArray(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::SHORT_ARRAY, "short[]");
m_newPdxType->AddVariableLengthTypeField(fieldName, "short[]", PdxFieldTypes::SHORT_ARRAY);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
array<UInt16>^ retVal = PdxLocalReader::ReadUnsignedShortArray(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return nullptr;
}
array<System::Int32>^ PdxReaderWithTypeCollector::ReadIntArray(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::INT_ARRAY, "int[]");
m_newPdxType->AddVariableLengthTypeField(fieldName, "int[]", PdxFieldTypes::INT_ARRAY);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
array<Int32>^ retVal = PdxLocalReader::ReadIntArray(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return nullptr;
}
array<System::UInt32>^ PdxReaderWithTypeCollector::ReadUnsignedIntArray(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::INT_ARRAY, "int[]");
m_newPdxType->AddVariableLengthTypeField(fieldName, "int[]", PdxFieldTypes::INT_ARRAY);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
array<UInt32>^ retVal = PdxLocalReader::ReadUnsignedIntArray(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return nullptr;
}
array<Int64>^ PdxReaderWithTypeCollector::ReadLongArray(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::LONG_ARRAY, "long[]");
m_newPdxType->AddVariableLengthTypeField(fieldName, "long[]", PdxFieldTypes::LONG_ARRAY);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
array<Int64>^ retVal = PdxLocalReader::ReadLongArray(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return nullptr;
}
array<System::UInt64>^ PdxReaderWithTypeCollector::ReadUnsignedLongArray(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::LONG_ARRAY, "long[]");
m_newPdxType->AddVariableLengthTypeField(fieldName, "long[]", PdxFieldTypes::LONG_ARRAY);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
array<UInt64>^ retVal = PdxLocalReader::ReadUnsignedLongArray(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return nullptr;
}
array<float>^ PdxReaderWithTypeCollector::ReadFloatArray(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::FLOAT_ARRAY, "float[]");
m_newPdxType->AddVariableLengthTypeField(fieldName, "float[]", PdxFieldTypes::FLOAT_ARRAY);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
array<float>^ retVal = PdxLocalReader::ReadFloatArray(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return nullptr;
}
array<double>^ PdxReaderWithTypeCollector::ReadDoubleArray(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::DOUBLE_ARRAY, "double[]");
m_newPdxType->AddVariableLengthTypeField(fieldName, "double[]", PdxFieldTypes::DOUBLE_ARRAY);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
array<Double>^ retVal = PdxLocalReader::ReadDoubleArray(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return nullptr;
}
array<String^>^ PdxReaderWithTypeCollector::ReadStringArray(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::STRING_ARRAY, "String[]");
m_newPdxType->AddVariableLengthTypeField(fieldName, "String[]", PdxFieldTypes::STRING_ARRAY);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
array<String^>^ retVal = PdxLocalReader::ReadStringArray(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return nullptr;
}
List<Object^>^ PdxReaderWithTypeCollector::ReadObjectArray(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::OBJECT_ARRAY, "Object[]");
m_newPdxType->AddVariableLengthTypeField(fieldName, "Object[]", PdxFieldTypes::OBJECT_ARRAY);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
List<Object^>^ retVal = PdxLocalReader::ReadObjectArray(fieldName);
m_dataInput->ResetPdx(m_startPosition);//force native as well
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return nullptr;
}
array<array<Byte>^>^ PdxReaderWithTypeCollector::ReadArrayOfByteArrays(String^ fieldName)
{
checkType(fieldName, PdxFieldTypes::ARRAY_OF_BYTE_ARRAYS, "byte[][]");
m_newPdxType->AddVariableLengthTypeField(fieldName, "byte[][]", PdxFieldTypes::ARRAY_OF_BYTE_ARRAYS);
int position = m_pdxType->GetFieldPosition(fieldName, m_offsetsBuffer, m_offsetSize, m_serializedLength);
if (position != -1)
{
m_dataInput->AdvanceCursorPdx(position);
array<array<Byte>^>^ retVal = PdxLocalReader::ReadArrayOfByteArrays(fieldName);
m_dataInput->RewindCursorPdx(position);
return retVal;
}
return nullptr;
}
} // namepsace Internal
} // namespace Client
} // namespace Geode
} // namespace Apache