3
0

DataCache.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #include <AzCore/JSON/rapidjson.h>
  10. #include <AzCore/JSON/document.h>
  11. #include <AzCore/std/containers/map.h>
  12. #include <AzCore/std/smart_ptr/shared_ptr.h>
  13. #include <AzCore/Math/Vector3.h>
  14. #include <string>
  15. #include <vector>
  16. namespace Metastream
  17. {
  18. class DataCache
  19. {
  20. public:
  21. DataCache() {}
  22. void AddToCache(const std::string & tableName, const std::string & key, const char *value);
  23. void AddToCache(const std::string & tableName, const std::string & key, bool value);
  24. void AddToCache(const std::string & tableName, const std::string & key, const AZ::Vector3& value);
  25. void AddToCache(const std::string & tableName, const std::string & key, double value);
  26. void AddToCache(const std::string & tableName, const std::string & key, AZ::u64 value);
  27. void AddToCache(const std::string & tableName, const std::string & key, AZ::s64 value);
  28. void AddToArray(const std::string & tableName, const std::string & arrayName, const char* value);
  29. void AddToArray(const std::string & tableName, const std::string & arrayName, bool value);
  30. void AddToArray(const std::string & tableName, const std::string & arrayName, const AZ::Vector3& value);
  31. void AddToArray(const std::string & tableName, const std::string & arrayName, double value);
  32. void AddToArray(const std::string & tableName, const std::string & arrayName, AZ::u64 value);
  33. void AddToArray(const std::string & tableName, const std::string & arrayName, AZ::s64 value);
  34. void AddToObject(const std::string & tableName, const std::string & objName, const std::string & key, const char* value);
  35. void AddToObject(const std::string & tableName, const std::string & objName, const std::string & key, bool value);
  36. void AddToObject(const std::string & tableName, const std::string & objName, const std::string & key, const AZ::Vector3& value);
  37. void AddToObject(const std::string & tableName, const std::string & objName, const std::string & key, double value);
  38. void AddToObject(const std::string & tableName, const std::string & objName, const std::string & key, AZ::u64 value);
  39. void AddToObject(const std::string & tableName, const std::string & objName, const std::string & key, AZ::s64 value);
  40. void AddArrayToCache(const std::string & tableName, const std::string & key, const std::string & arrayName);
  41. void AddObjectToCache(const std::string & tableName, const std::string & key, const std::string & objectName);
  42. void AddArrayToObject(const std::string & tableName, const std::string & destObjName, const std::string & key, const std::string & srcArrayName);
  43. void AddObjectToArray(const std::string & tableName, const std::string & destArrayName, const std::string & srcObjectName);
  44. void AddObjectToObject(const std::string & tableName, const std::string & destObjName, const std::string & key, const std::string & srcObjName);
  45. std::string GetDatabasesJSON() const;
  46. std::string GetTableKeysJSON(const std::string& tableName) const;
  47. std::string GetTableKeyValuesJSON(const std::string& tableName, const std::vector<std::string>& keyList) const;
  48. void ClearCache();
  49. private:
  50. class Document
  51. {
  52. public:
  53. Document();
  54. virtual ~Document();
  55. std::string GetKeysJSON() const;
  56. std::string GetKeyValuesJSON(const std::vector<std::string>& keyList) const;
  57. std::string GetJSON() const;
  58. void Add(const std::string & key, rapidjson::Value & value);
  59. void AddToArray(const std::string & arrayName, rapidjson::Value & value);
  60. void AddToObject(const std::string & objName, const std::string & keyName, rapidjson::Value & value);
  61. void AddArray(const std::string & key, const std::string & arrayName);
  62. void AddObject(const std::string & key, const std::string & objectName);
  63. void AddArrayToObject(const std::string & destObjName, const std::string & key, const std::string & srcArrayName);
  64. void AddObjectToObject(const std::string & destObjName, const std::string & key, const std::string & srcObjName);
  65. void AddObjectToArray(const std::string & destArrayName, const std::string & srcObjectName);
  66. rapidjson::Value ToJson(const std::string & value);
  67. rapidjson::Value ToJson(const char * value);
  68. rapidjson::Value ToJson(bool value);
  69. rapidjson::Value ToJson(const AZ::Vector3& value);
  70. rapidjson::Value ToJson(double value);
  71. rapidjson::Value ToJson(AZ::u64 value);
  72. rapidjson::Value ToJson(AZ::s64 value);
  73. private:
  74. typedef AZStd::shared_ptr<rapidjson::Value> rapidJsonValuePtr;
  75. typedef AZStd::map<std::string, rapidJsonValuePtr> JsonValueMap;
  76. enum class ValueType {Array, Object};
  77. rapidJsonValuePtr FindValue(const std::string & name, ValueType type);
  78. void RemoveValue(const std::string &objectName, ValueType type);
  79. private:
  80. mutable AZStd::mutex m_mutex;
  81. mutable AZStd::mutex m_mutexJsonArray;
  82. rapidjson::Document m_jsonDoc;
  83. rapidjson::Document::AllocatorType & m_allocator;
  84. JsonValueMap m_jsonValues;
  85. };
  86. typedef AZStd::shared_ptr<Document> DocumentPtr;
  87. typedef AZStd::map<std::string, DocumentPtr> Database;
  88. DocumentPtr FindDoc(const std::string & tableName);
  89. private:
  90. mutable AZStd::mutex m_mutexDatabase;
  91. Database m_database;
  92. };
  93. } // namespace Metastream