1 #pragma once 2 #include <memory> 3 #include "DBStateServer.h" 4 #include "DistributedObject.h" 5 6 class LoadingObject final : public MDParticipantInterface 7 { 8 friend class DBStateServer; 9 10 public: 11 LoadingObject(DBStateServer *stateserver, doid_t do_id, doid_t parent_id, zone_t zone_id, 12 const std::unordered_set<uint32_t> &contexts = std::unordered_set<uint32_t>()); 13 LoadingObject(DBStateServer *stateserver, doid_t do_id, doid_t parent_id, zone_t zone_id, 14 const dclass::Class *dclass, DatagramIterator &dgi, 15 const std::unordered_set<uint32_t> &contexts = std::unordered_set<uint32_t>()); 16 17 void begin(); 18 void handle_datagram(DatagramHandle in_dg, DatagramIterator &dgi); 19 private: 20 DBStateServer *m_dbss; 21 doid_t m_do_id; 22 doid_t m_parent_id; 23 zone_t m_zone_id; 24 uint32_t m_context; 25 std::unique_ptr<LogCategory> m_log; 26 27 // Upstream object data 28 const dclass::Class *m_dclass; 29 UnorderedFieldValues m_field_updates; 30 UnorderedFieldValues m_required_fields; 31 FieldValues m_ram_fields; 32 std::unordered_set<uint32_t> m_valid_contexts; 33 34 // Received datagrams while waiting for reply 35 std::vector<DatagramHandle> m_datagram_queue; 36 bool m_is_loaded; 37 38 // send_get_object makes the initial request to the database for the object data 39 void inline send_get_object(doid_t do_id); 40 // replay_datagrams while replay the datagrams for a loaded distributed object 41 void inline replay_datagrams(DistributedObject* obj); 42 // forward_datagrams will replay the datagrams to the dbss for a failed load 43 void inline forward_datagrams(); 44 // finalize will clean up the loader, replaying whatever is necessary 45 void inline finalize(); 46 }; 47