MongoReplicable.hpp #2

  • //
  • guest/
  • ShadauxCat/
  • Sprawl/
  • Mainline/
  • serialization/
  • mongo/
  • MongoReplicable.hpp
  • View
  • Commits
  • Open Download .zip Download (9 KB)
#pragma once

/*
 * This module is included as a part of libSprawl
 *
 * Copyright (C) 2013 Jaedyn K. Draper
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
 
#ifdef _WIN32
	#pragma warning( push )
	#pragma warning( disable: 4250 )
#endif

#include "MongoSerializer.hpp"
#include "Replicable.hpp"

namespace sprawl
{
	namespace serialization
	{
		class MongoReplicableSerializer : public ReplicableSerializer<MongoSerializer>
		{
		public:
			typedef std::unordered_set<ReplicationKey, RKeyHash, std::equal_to<ReplicationKey>, sprawl::memory::StlWrapper<ReplicationKey>> ReplicationSet;
			typedef std::unordered_map<ReplicationKey, mongo::BSONObj, RKeyHash, std::equal_to<ReplicationKey>, sprawl::memory::StlWrapper<std::pair<ReplicationKey, mongo::BSONObj>>> ReplicationBSONMap;
			virtual void StartArray(const sprawl::String &name, uint32_t &size, bool b) override;

			virtual uint32_t StartObject(const sprawl::String &name, bool b) override;

			virtual uint32_t StartMap(const sprawl::String &name, bool b) override;

			mongo::BSONObj getBaselineObj()
			{
				return m_baseline->Obj();
			}

			mongo::BSONObj getBaselineTempObj()
			{
				return m_baseline->tempObj();
			}

			virtual void Mark() override;

			virtual void Discard() override;

			virtual void Reset() override;

			std::vector<mongo::BSONObj> generateUpdateQuery()
			{
				BuildDeltaParams params = { m_objData, m_data, m_marked_data, m_allArrays, m_markedArrays, m_allObjs, m_markedObjs };
				return this->BuildDelta( params );
			}

			std::vector<mongo::BSONObj> generateUndoQuery()
			{
				BuildDeltaParams params = {m_markedObjData, m_marked_data, m_data, m_markedArrays, m_allArrays, m_markedObjs, m_allObjs};
				return this->BuildDelta( params );
			}

		protected:
			template<typename T2>
			void serialize_impl( T2* var, sprawl::String const& name, bool PersistToDB)
			{
				this->m_serializer->Reset();
				this->PushKey(name);

				(*m_serializer) % sprawl::serialization::prepare_data(*var, name, PersistToDB);
				m_data.insert(std::make_pair(m_current_key, m_serializer->Str()));
				m_objData.insert(std::make_pair(m_current_key, m_serializer->Obj()));
				if(!m_marked)
				{
					(*m_baseline) % sprawl::serialization::prepare_data(*var, name, PersistToDB);
				}

				this->PopKey();
			}

			inline void serialize_impl(char* var, const uint32_t bytes, sprawl::String const& name, bool PersistToDB)
			{
				this->m_serializer->Reset();
				this->PushKey(name);

				(*m_serializer) % sprawl::serialization::prepare_data(var, bytes, name, PersistToDB);
				m_data.insert(std::make_pair(m_current_key, m_serializer->Str()));
				m_objData.insert(std::make_pair(m_current_key, m_serializer->Obj()));
				if(!m_marked)
				{
					(*m_baseline) % sprawl::serialization::prepare_data(var, bytes, name, PersistToDB);
				}

				this->PopKey();
			}

		public:
			virtual void serialize(mongo::OID* var, sprawl::String const& name, bool PersistToDB) override;

			virtual void serialize(mongo::BSONObj* var, sprawl::String const& name, bool PersistToDB) override;

			virtual void serialize(mongo::Date_t* var, sprawl::String const& name, bool PersistToDB) override;

			virtual void serialize(int* var, const uint32_t /*bytes*/, sprawl::String const& name, bool PersistToDB) override
			{
				serialize_impl(var, name, PersistToDB);
			}

			virtual void serialize(long int* var, const uint32_t /*bytes*/, sprawl::String const& name, bool PersistToDB) override
			{
				serialize_impl(var, name, PersistToDB);
			}

			virtual void serialize(long long int* var, const uint32_t /*bytes*/, sprawl::String const& name, bool PersistToDB)  override
			{
				serialize_impl(var, name, PersistToDB);
			}

			virtual void serialize(short int* var, const uint32_t /*bytes*/, sprawl::String const& name, bool PersistToDB) override
			{
				serialize_impl(var, name, PersistToDB);
			}

			using ReplicableSerializer<MongoSerializer>::operator%;

			virtual SerializerBase& operator%(BinaryData&& var) override
			{
				uint32_t len = var.size;
				serialize_impl(var.val, len, var.name, var.PersistToDB);
				return *this;
			}

			virtual void serialize(char* var, const uint32_t bytes, sprawl::String const& name, bool PersistToDB) override
			{
				sprawl::String str(sprawl::StringRef(var, bytes));
				serialize(&str, bytes, name, PersistToDB);
			}

			virtual void serialize(float* var, const uint32_t /*bytes*/, sprawl::String const& name, bool PersistToDB) override
			{
				serialize_impl(var, name, PersistToDB);
			}

			virtual void serialize(double* var, const uint32_t /*bytes*/, sprawl::String const& name, bool PersistToDB) override
			{
				serialize_impl(var, name, PersistToDB);
			}

			virtual void serialize(long double* var, const uint32_t /*bytes*/, sprawl::String const& name, bool PersistToDB) override
			{
				serialize_impl(var, name, PersistToDB);
			}

			virtual void serialize(bool* var, const uint32_t /*bytes*/, sprawl::String const& name, bool PersistToDB) override
			{
				serialize_impl(var, name, PersistToDB);
			}

			virtual void serialize(unsigned int* var, const uint32_t /*bytes*/, sprawl::String const& name, bool PersistToDB) override
			{
				serialize_impl(var, name, PersistToDB);
			}

			virtual void serialize(unsigned long int* var, const uint32_t /*bytes*/, sprawl::String const& name, bool PersistToDB) override
			{
				serialize_impl(var, name, PersistToDB);
			}

			virtual void serialize(unsigned long long int* var, const uint32_t /*bytes*/, sprawl::String const& name, bool PersistToDB) override
			{
				serialize_impl(var, name, PersistToDB);
			}

			virtual void serialize(unsigned short int* var, const uint32_t /*bytes*/, sprawl::String const& name, bool PersistToDB) override
			{
				serialize_impl(var, name, PersistToDB);
			}

			virtual void serialize(unsigned char* var, const uint32_t /*bytes*/, sprawl::String const& name, bool PersistToDB) override
			{
				serialize_impl(var, name, PersistToDB);
			}
			virtual void serialize(std::string* var, const uint32_t /*bytes*/, sprawl::String const& name, bool PersistToDB) override
			{
				serialize_impl(var, name, PersistToDB);
			}
			virtual void serialize(sprawl::String* var, const uint32_t /*bytes*/, sprawl::String const& name, bool PersistToDB) override
			{
				serialize_impl(var, name, PersistToDB);
			}

		private:
			virtual void PushKey(sprawl::String const& name, bool forArray = false) override;

			virtual void PopKey() override;

			struct BuildDeltaParams
			{
				ReplicationBSONMap const& objs;
				ReplicationMap const& data;
				ReplicationMap const& markedData;
				ReplicationSet const& allArrays;
				ReplicationSet const& markedArrays;
				ReplicationSet const& allObjs;
				ReplicationSet const& markedObjs;
			};

			std::vector<mongo::BSONObj> BuildDelta(BuildDeltaParams const& params);

			ReplicationBSONMap m_objData;
			ReplicationBSONMap m_markedObjData;
			KeyToStringMap m_reverse_name_index;
			ReplicationSet m_allArrays;
			ReplicationSet m_allObjs;
			ReplicationSet m_markedArrays;
			ReplicationSet m_markedObjs;
			ReplicationKey m_array_tracker;
		};

		class MongoReplicableDeserializer : public ReplicableDeserializer<MongoDeserializer>
		{
		public:
			using ReplicableDeserializer<MongoDeserializer>::serialize;

			virtual void serialize(mongo::OID* var, sprawl::String const& name, bool PersistToDB) override;

			MongoReplicableDeserializer(sprawl::String const& data)
				: ReplicableDeserializer<MongoDeserializer>(data)
			{
				//
			}

			MongoReplicableDeserializer(const char* data, size_t length)
				: ReplicableDeserializer<MongoDeserializer>(data, length)
			{
				//
			}
		};
			
		extern template class ReplicableSerializer<MongoSerializer>;
		extern template class ReplicableDeserializer<MongoDeserializer>;
	}
}

#ifdef _WIN32
	#pragma warning( pop )
#endif
# Change User Description Committed
#2 14783 ShadauxCat Style corrections (placement of const)

#review-14784
#1 11496 ShadauxCat Initial checkin: Current states for csbuild and libSprawl