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