blob: a3eb779a08d8bc477ae2b901e4620846c68a9289 [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 "../IPdxInstance.hpp"
#include "../IPdxSerializable.hpp"
#include "../DataInput.hpp"
#include "PdxLocalWriter.hpp"
#include "../IWritablePdxInstance.hpp"
namespace apache {
namespace geode {
namespace client {
class CachePerfStats;
} // namespace client
} // nanespace geode
} // namespace apache
namespace Apache
{
namespace Geode
{
namespace Client
{
ref class Cache;
namespace Internal
{
using namespace System;
namespace native = apache::geode::client;
ref class PdxType;
/// <summary>
/// Serialize the data in geode Portable Data eXchange(Pdx) Format.
/// This format provides class versioning(forward and backward compability of types) in cache.
/// This provides ability to query .NET domian objects.
/// </summary>
ref class PdxInstanceImpl : public IWritablePdxInstance, public IPdxInstance, public IPdxSerializable
{
private:
static array<SByte>^ Boolean_DefaultBytes = gcnew array<SByte>{0};
static array<SByte>^ Byte_DefaultBytes = gcnew array<SByte>{0};
static array<SByte>^ Char_DefaultBytes = gcnew array<SByte>{0, 0};
static array<SByte>^ Short_DefaultBytes = gcnew array<SByte>{0, 0};
static array<SByte>^ Int_DefaultBytes = gcnew array<SByte>{0, 0, 0, 0};
static array<SByte>^ Long_DefaultBytes = gcnew array<SByte>{0, 0, 0, 0, 0, 0, 0, 0};
static array<SByte>^ Float_DefaultBytes = gcnew array<SByte>{0, 0, 0, 0};
static array<SByte>^ Double_DefaultBytes = gcnew array<SByte>{0, 0, 0, 0, 0, 0, 0, 0};
static array<SByte>^ Date_DefaultBytes = gcnew array<SByte>{-1, -1, -1, -1, -1, -1, -1, -1};
static array<SByte>^ String_DefaultBytes = gcnew array<SByte>{static_cast<SByte>(apache::geode::client::DSCode::CacheableNullString)};
static array<SByte>^ Object_DefaultBytes = gcnew array<SByte>{static_cast<SByte>(apache::geode::client::DSCode::NullObj)};
static array<SByte>^ NULL_ARRAY_DefaultBytes = gcnew array<SByte>{-1};
static PdxFieldType^ Default_PdxFieldType = gcnew PdxFieldType("default", "default", -1,
-1/*field index*/,
false, 1, -1/*var len field idx*/);
bool hasDefaultBytes(PdxFieldType^ pField, DataInput^ dataInput, int start, int end);
bool compareDefaulBytes(DataInput^ dataInput, int start, int end, array<SByte>^ defaultBytes);
void cleanup();
native::CachePerfStats* m_cachePerfStats;
System::Byte* m_buffer;
int m_bufferLength;
int m_typeId;
bool m_own;
PdxType^ m_pdxType;
Apache::Geode::Client::Cache^ m_cache;
internal:
Dictionary<String^, Object^>^ m_updatedFields;
Object^ readField(DataInput^ dataInput, String^ fieldName, int typeId);
bool checkType(Type^ fieldType, int typeId);
void writeField(IPdxWriter^ writer, String^ fieldName, int typeId, Object^ value);
int getOffset(DataInput^ dataInput, PdxType^ pt, int sequenceId);
int getSerializedLength(DataInput^ dataInput, PdxType^ pt);
void writeUnmodifieldField(DataInput^ dataInput, int startPos, int endPos, PdxLocalWriter^ localWriter);
int getNextFieldPosition(DataInput^ dataInput, int fieldId, PdxType^ pt);
IList<PdxFieldType^>^ getIdentityPdxFields(PdxType^ pt);
bool isPrimitiveArray(Object^ object);
int getRawHashCode(PdxType^ pt, PdxFieldType^ pField, DataInput^ dataInput);
static int deepArrayHashCode(Object^ obj);
generic <class T>where T:System::Collections::ICollection, System::Collections::IList, System::Collections::IEnumerable
static int primitiveArrayHashCode(T objArray);
static int enumerableHashCode(System::Collections::IEnumerable^ enumObj);
static int enumerateDictionary(System::Collections::IDictionary^ iDict);
void setOffsetForObject(DataInput^ dataInput, PdxType^ pt, int sequenceId);
static int comparePdxField(PdxFieldType^ a, PdxFieldType^ b);
void equatePdxFields(IList<PdxFieldType^>^ my, IList<PdxFieldType^>^ other);
//bool compareRawBytes(PdxInstanceImpl^ other, PdxType^ myPT, PdxFieldType^ myF, PdxType^ otherPT, PdxFieldType^ otherF);
bool compareRawBytes(PdxInstanceImpl^ other, PdxType^ myPT, PdxFieldType^ myF, DataInput^ myDataInput, PdxType^ otherPT, PdxFieldType^ otherF, DataInput^ otherDataInput);
static bool enumerateDictionaryForEqual(System::Collections::IDictionary^ iDict, System::Collections::IDictionary^ otherIDict);
static bool enumerableEquals(System::Collections::IEnumerable^ enumObj, System::Collections::IEnumerable^ enumOtherObj);
static bool deepArrayEquals(Object^ obj, Object^ otherObj);
void updatePdxStream(System::Byte* newPdxStream, int len);
public:
PdxInstanceImpl(System::Byte* buffer, int length, int typeId, bool own, Apache::Geode::Client::Cache^ cache)
{
m_buffer = buffer;
m_bufferLength = length;
m_typeId = typeId;
m_updatedFields = nullptr;
m_own = own;
m_pdxType = nullptr;
m_cache = cache;
}
//for pdxInstance factory
PdxInstanceImpl(Dictionary<String^, Object^>^ fieldVsValue, PdxType^ pdxType, Cache^ cache);
~PdxInstanceImpl()
{
cleanup();
}
!PdxInstanceImpl()
{
cleanup();
}
PdxType^ getPdxType();
void setPdxId(Int32 typeId);
virtual String^ GetClassName();
virtual Object^ GetObject();
virtual bool HasField(String^ fieldName);
virtual IList<String^>^ GetFieldNames();
virtual bool IsIdentityField(String^ fieldName);
virtual Object^ GetField(String^ fieldName);
virtual bool Equals(Object^ other) override;
virtual int GetHashCode() override;
virtual String^ ToString() override;
virtual IWritablePdxInstance^ CreateWriter();
virtual void SetField(String^ fieldName, Object^ value);
virtual void ToData(IPdxWriter^ writer);
virtual void FromData(IPdxReader^ reader);
};
} // namespace Internal
} // namespace Client
} // namespace Geode
} // namespace Apache