EvEmu  0.8.4
11 September 2021
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
StationDataMgr.cpp
Go to the documentation of this file.
1 
11 #include "station/StationDataMgr.h"
12 #include "database/EVEDBUtils.h"
13 
14 
16 {
17  m_serviceMask.clear();
18  m_stationData.clear();
19  m_stationPyData.clear();
20  m_stationOfficeData.clear();
21 }
22 
24 {
25  //Clear();
26 }
27 
29 {
30  Populate();
31  sLog.Blue(" StationDataMgr", "Station Data Manager Initialized.");
32  return 1;
33 }
34 
36 {
38  for (auto cur : m_stationPyData)
39  PySafeDecRef(cur.second);
40 
41  sLog.Warning(" StationDataMgr", "Station Data Manager has been closed." );
42 }
43 
44 
46 {
47  for (auto cur : m_stationPyData)
48  PySafeDecRef(cur.second);
49 
50  m_serviceMask.clear();
51  m_stationData.clear();
52  m_stationPyData.clear();
53  m_stationOfficeData.clear();
54 
55 }
56 
58 {
59  double start = GetTimeMSeconds();
60  DBQueryResult* res = new DBQueryResult();
61  DBResultRow row;
62 
63  std::map<int8, int32>::iterator itr;
65  while (res->GetRow(row)) {
66  //SELECT operationID, serviceID FROM staOperationServices
67  if ((itr = m_serviceMask.find(row.GetInt(0))) != m_serviceMask.end()) {
68  itr->second += row.GetInt(1);
69  } else {
70  m_serviceMask.emplace(row.GetInt(0), row.GetInt(1));
71  }
72  }
73 
74  //res->Reset();
76  while (res->GetRow(row)) {
77  //SELECT itemID, corporationID, stationID, typeID, lockDown, rentalFee, expiryDateTime, officeFolderID
78  OfficeData data = OfficeData();
79  data.officeID = row.GetInt(0);
80  data.corporationID = row.GetInt(1);
81  data.stationID = row.GetInt(2);
82  data.typeID = row.GetInt(3);
83  data.lockDown = row.GetBool(4);
84  data.rentalFee = row.GetInt64(5);
85  data.expiryTime = row.GetInt64(6);
86  data.folderID = row.GetInt(7);
87  m_stationOfficeData.emplace(row.GetInt(2), data);
88  }
89 
90  //res->Reset();
92  while (res->GetRow(row)) {
93  //SELECT s.stationID, s.x, s.y, s.z, st.dockOrientationX, st.dockOrientationY, st.dockOrientationZ, s.dockingCostPerVolume, s.maxShipVolumeDockable,8 \
94  s.officeSlots, s.officeRentalCost, s.operationID, s.stationTypeID, s.corporationID, s.stationName, s.reprocessingStationsTake, s.reprocessingEfficiency,16 \
95  s.reprocessingHangarFlag, st.conquerable, st.hangarGraphicID, m.orbitID, m.radius, m.security, o.description, o.descriptionID,24\
96  t.graphicID, s.solarSystemID, s.constellationID, s.regionID, st.dockEntryX, st.dockEntryY, st.dockEntryZ 31
97  StationData sData = StationData();
98  sData.stationID = row.GetUInt(0);
99  if ((itr = m_serviceMask.find(sData.stationID)) != m_serviceMask.end()) {
100  sData.serviceMask = itr->second;
101  } else {
102  sData.serviceMask = 0;
103  }
104  sData.position = GPoint(row.GetDouble(1),row.GetDouble(2),row.GetDouble(3));
105  sData.dockOrientation = GVector(row.GetDouble(4),row.GetDouble(5),row.GetDouble(6));
106  sData.dockingCostPerVolume = row.GetFloat(7);
107  sData.maxShipVolumeDockable = row.GetUInt(8);
108  sData.officeSlots = row.GetUInt(9);
109  sData.officeRentalFee = row.GetInt(10);
110  sData.operationID = row.GetInt(11);
111  sData.typeID = row.GetInt(12);
112  sData.corporationID = row.GetInt(13);
113  sData.name = row.GetText(14);
114  sData.reprocessingStationsTake = row.GetFloat(15);
115  sData.reprocessingEfficiency = row.GetFloat(16);
116  sData.reprocessingHangarFlag = row.GetUInt(17);
117  sData.conquerable = row.GetBool(18);
118  sData.hangarGraphicID = row.GetUInt(19);
119  sData.orbitID = row.GetUInt(20);
120  sData.radius = row.GetFloat(21);
121  sData.security = row.GetFloat(22);
122  sData.description = row.GetText(23);
123  sData.descriptionID = row.GetInt(24);
124  sData.graphicID = row.GetInt(25);
125  sData.systemID = row.GetUInt(26);
126  sData.constellationID = row.GetUInt(27);
127  sData.regionID = row.GetUInt(28);
128  sData.dockEntry = GPoint(row.GetDouble(29),row.GetDouble(30),row.GetDouble(31));
129  sData.dockPosition = GPoint(row.GetDouble(29) + row.GetDouble(1),
130  row.GetDouble(30) + row.GetDouble(2),
131  row.GetDouble(31) + row.GetDouble(3));
132  m_stationData.emplace(row.GetInt(0), sData);
133  }
134 
136 
137  sLog.Cyan(" StationDataMgr", "%u Station data sets loaded in %.3fms.", \
138  (m_stationData.size() + m_serviceMask.size() + m_stationPyData.size() + m_stationOfficeData.size()), (GetTimeMSeconds() - start));
139 
140  //cleanup
141  SafeDelete(res);
142 }
143 
145 {
146  m_stationOfficeData.emplace(stationID, data);
147 }
148 
149 void StationDataMgr::LoadOffices(uint32 stationID, std::map<uint32, OfficeData>& data)
150 {
151  auto range = m_stationOfficeData.equal_range(stationID);
152  for (auto itr = range.first; itr != range.second; ++itr)
153  data.emplace(itr->second.officeID, itr->second);
154 }
155 
157 {
158  /* return info about loaded items? */
159  /*
160  * m_stationSystem
161  * m_stationData;
162  *
163  */
164 }
165 
167 {
169  std::map<uint32, StationData>::iterator itr = m_stationData.find(stationID);
170  if (itr != m_stationData.end())
171  return itr->second.corporationID;
172  return 0;
173 }
174 
176 {
177  auto range = m_stationOfficeData.equal_range(stationID);
178  for (auto itr = range.first; itr != range.second; ++itr)
179  if (itr->second.corporationID == corpID)
180  return itr->second.officeID;
181  return 0;
182 }
183 
185 {
186  std::map<uint32, StationData>::iterator itr = m_stationData.find(stationID);
187  if (itr != m_stationData.end())
188  return itr->second.dockPosition.y;
189  return 0;
190 }
191 
193 {
194  std::map<uint32, StationData>::iterator itr = m_stationData.find(stationID);
195  if (itr != m_stationData.end()) {
196  return itr->second.name;
197  } else {
198  _log(DATABASE__MESSAGE, "Failed to query station name for station %u: Station not found.", stationID);
199  }
200  return "";
201 }
202 
204 {
205  std::map<uint32, StationData>::iterator itr = m_stationData.find(stationID);
206  if (itr != m_stationData.end()) {
207  return itr->second.systemID;
208  } else {
209  _log(DATABASE__MESSAGE, "Failed to query station systemID for station %u: Station not found.", stationID);
210  }
211  return 0;
212 }
213 
214 
216 {
217  std::map<uint32, StationData>::iterator itr = m_stationData.find(stationID);
218  if (itr != m_stationData.end()) {
219  data = itr->second;
220  return true;
221  } else {
222  _log(DATABASE__MESSAGE, "Failed to query data for station %u: Station not found.", stationID);
223  }
224  return true;
225 }
226 
228 {
229  std::map<uint32, PyObject*>::iterator itr = m_stationPyData.find(stationID);
230  if (itr != m_stationPyData.end()) {
231  PyIncRef(itr->second);
232  return itr->second;
233  } else {
234  _log(DATABASE__MESSAGE, "Failed to query data for station %u: Station not found.", stationID);
235  }
236  return nullptr;
237 }
238 
240 {
241  //['hangarGraphicID','ownerID','itemID','serviceMask','stationTypeID']
242  std::map<uint32, StationData>::iterator itr = m_stationData.find(stationID);
243  if (itr != m_stationData.end()) {
244  std::map<int8, int32>::iterator itr2;
245  PyTuple * result = new PyTuple(5);
246  result->SetItem(0, new PyInt(itr->second.hangarGraphicID));
247  result->SetItem(1, new PyInt(itr->second.corporationID));
248  result->SetItem(2, new PyInt(stationID));
249  if ((itr2 = m_serviceMask.find(itr->second.operationID)) != m_serviceMask.end()) {
250  result->SetItem(3, new PyInt(itr2->second));
251  } else {
252  result->SetItem(3, new PyInt(0));
253  }
254  result->SetItem(4, new PyInt(itr->second.typeID));
255  return result;
256  }
257  return nullptr;
258 }
259 
260 void StationDataMgr::GetStationOfficeIDs(uint32 locationID, std::vector<OfficeData> &data)
261 {
262  if (sDataMgr.IsStation(locationID)) {
263  auto range = m_stationOfficeData.equal_range(locationID);
264  for (auto itr = range.first; itr != range.second; ++itr)
265  data.push_back(itr->second);
266  } else if (IsOfficeFolder(locationID)) {
267  auto range = m_stationOfficeData.equal_range((locationID - STATION_OFFICE_OFFSET));
268  for (auto itr = range.first; itr != range.second; ++itr)
269  if (itr->second.folderID == locationID)
270  data.push_back(itr->second);
271  } else if (IsOfficeID(locationID)) {
272  // no better way to do this one yet.....iterate thru the whole map?
273  // this is full map of station data. need to find station to cut down on loop time.
274  for (auto cur : m_stationOfficeData)
275  if (cur.second.officeID == locationID) {
276  data.push_back(cur.second);
277  return;
278  }
279  }
280 }
281 
283 {
284  std::map<uint32, StationData>::iterator itr = m_stationData.find(stationID);
285  if (itr != m_stationData.end())
286  return itr->second.officeRentalFee;
287  return 0;
288 }
289 
290 
292 {
293  for (auto cur : m_stationData) {
294  PyDict* dict = new PyDict();
295  dict->SetItemString("stationID", new PyInt(cur.first));
296  dict->SetItemString("ownerID", new PyInt(cur.second.corporationID));
297  dict->SetItemString("stationTypeID", new PyInt(cur.second.typeID));
298  dict->SetItemString("stationName", new PyString(cur.second.name));
299  dict->SetItemString("operationID", new PyInt(cur.second.operationID));
300  dict->SetItemString("x", new PyFloat(cur.second.position.x));
301  dict->SetItemString("y", new PyFloat(cur.second.position.y));
302  dict->SetItemString("z", new PyFloat(cur.second.position.z));
303  dict->SetItemString("dockEntryX", new PyFloat(cur.second.dockEntry.x));
304  dict->SetItemString("dockEntryY", new PyFloat(cur.second.dockEntry.y));
305  dict->SetItemString("dockEntryZ", new PyFloat(cur.second.dockEntry.z));
306  dict->SetItemString("dockOrientationX", new PyFloat(cur.second.dockOrientation.x));
307  dict->SetItemString("dockOrientationY", new PyFloat(cur.second.dockOrientation.y));
308  dict->SetItemString("dockOrientationZ", new PyFloat(cur.second.dockOrientation.z));
309 
310  dict->SetItemString("serviceMask", new PyInt(cur.second.serviceMask));
311  dict->SetItemString("conquerable", new PyBool(cur.second.conquerable));
312  dict->SetItemString("upgradeLevel", new PyInt(0)); // outposts only. others are 0
313  dict->SetItemString("standingOwnerID", new PyInt(cur.second.corporationID));
314  dict->SetItemString("hangarGraphicID", new PyInt(cur.second.hangarGraphicID));
315  dict->SetItemString("officeRentalCost", new PyInt(cur.second.officeRentalFee));
316  dict->SetItemString("dockingBayGraphicID", PyStatic.NewNone()); // cannot find any data on this; all packets show PyNone
317  dict->SetItemString("dockingCostPerVolume", new PyFloat(cur.second.dockingCostPerVolume));
318  dict->SetItemString("maxShipVolumeDockable", new PyFloat(cur.second.maxShipVolumeDockable));
319  dict->SetItemString("reprocessingEfficiency", new PyFloat(cur.second.reprocessingEfficiency));
320  dict->SetItemString("reprocessingHangarFlag", new PyInt(cur.second.reprocessingHangarFlag));
321  dict->SetItemString("reprocessingStationsTake", new PyFloat(cur.second.reprocessingStationsTake));
322 
323  dict->SetItemString("solarSystemID", new PyInt(cur.second.systemID));
324  dict->SetItemString("constellationID", new PyInt(cur.second.constellationID));
325  dict->SetItemString("regionID", new PyInt(cur.second.regionID));
326  dict->SetItemString("security", new PyFloat(cur.second.security));
327 
328  dict->SetItemString("graphicID", new PyInt(cur.second.graphicID)); //invTypes.graphicID
329  dict->SetItemString("description", new PyString(cur.second.description)); //staOperations.description
330  dict->SetItemString("descriptionID", new PyInt(cur.second.descriptionID)); //staOperations.descriptionID
331 
332  dict->SetItemString("radius", new PyFloat(cur.second.radius)); //mapDenormalize.radius or invTypes.radius
333  dict->SetItemString("orbitID", new PyInt(cur.second.orbitID)); //mapDenormalize.orbitID
334 
335  m_stationPyData.emplace(cur.first, new PyObject("util.KeyVal", dict));
336  }
337 }
338 
Base Python wire object.
Definition: PyRep.h:66
int32 officeRentalFee
std::string description
uint32 corporationID
const char * GetText(uint32 index) const
Definition: dbcore.h:104
std::map< uint32, PyObject * > m_stationPyData
#define _log(type, fmt,...)
Definition: logsys.h:124
#define IsOfficeFolder(itemID)
Definition: EVE_Defines.h:309
uint16 graphicID
float GetFloat(uint32 index) const
Definition: dbcore.cpp:682
PyObject * GetStationPyData(uint32 stationID)
Python string.
Definition: PyRep.h:430
int32 GetInt(uint32 index) const
Definition: dbcore.cpp:635
float dockingCostPerVolume
bool GetStationData(uint32 stationID, StationData &data)
uint32 folderID
Python's dictionary.
Definition: PyRep.h:719
uint32 stationID
uint32 GetUInt(uint32 index) const
Definition: dbcore.cpp:658
double GetDouble(uint32 index) const
Definition: dbcore.cpp:693
uint32 GetOfficeIDForCorp(uint32 stationID, uint32 corpID)
Python floating point number.
Definition: PyRep.h:292
double GetDockPosY(uint32 stationID)
Python tuple.
Definition: PyRep.h:567
uint32 GetOfficeRentalFee(uint32 stationID)
static void GetOperationServiceIDs(DBQueryResult &res)
Definition: StationDB.cpp:175
uint32 GetStationSystemID(uint32 stationID)
void SafeDelete(T *&p)
Deletes and nullifies a pointer.
Definition: SafeMem.h:83
bool GetRow(DBResultRow &into)
Definition: dbcore.cpp:552
bool GetBool(uint32 index) const
Definition: dbcore.cpp:647
Python boolean.
Definition: PyRep.h:323
#define sLog
Evaluates to a NewLog instance.
Definition: LogNew.h:250
Definition: gpoint.h:33
std::map< int8, int32 > m_serviceMask
uint32 GetOwnerID(uint32 stationID)
uint16 descriptionID
int64 expiryTime
double GetTimeMSeconds()
Definition: utils_time.cpp:104
uint32 stationID
Python object.
Definition: PyRep.h:826
void SetItem(size_t index, PyRep *object)
Stores Python object.
Definition: PyRep.h:610
float reprocessingStationsTake
std::string name
uint32 officeID
Python integer.
Definition: PyRep.h:231
static void GetStationData(DBQueryResult &res)
Definition: StationDB.cpp:138
void LoadOffices(uint32 stationID, std::map< uint32, OfficeData > &data)
std::multimap< uint32, OfficeData > m_stationOfficeData
#define PyStatic
Definition: PyRep.h:1209
void AddOffice(uint32 stationID, OfficeData &data)
uint32 corporationID
unsigned __int32 uint32
Definition: eve-compat.h:50
#define PyIncRef(op)
Definition: PyRep.h:56
#define IsOfficeID(itemID)
Definition: EVE_Defines.h:253
GPoint dockPosition
#define STATION_OFFICE_OFFSET
Definition: EVE_Defines.h:177
GPoint dockEntry
PyRep * GetStationItemBits(uint32 stationID)
#define PySafeDecRef(op)
Definition: PyRep.h:61
Definition: gpoint.h:70
GVector dockOrientation
std::map< uint32, StationData > m_stationData
uint16 hangarGraphicID
void GetStationOfficeIDs(uint32 locationID, std::vector< OfficeData > &data)
uint32 maxShipVolumeDockable
int64 GetInt64(uint32 index) const
Definition: dbcore.cpp:670
uint16 reprocessingHangarFlag
uint32 constellationID
float reprocessingEfficiency
std::string GetStationName(uint32 stationID)
void SetItemString(const char *key, PyRep *value)
SetItemString adds or sets a database entry.
Definition: PyRep.h:812
static void GetStationOfficeData(DBQueryResult &res)
Definition: StationDB.cpp:97
#define sDataMgr