entry: use AdditionalData2 for serialization

Prefer the `map<std::string, std::string>` for serialization of
metadata over the `vector<std::string>` format.  Add backwards
compatible parsing of the `vector<std::string>` format.

Tested: Loaded a "version 5" entry.  Created a new entry and verified
it was "version 6" in the binary dump.  Reloading the daemon restores
both version 5 and 6 objects.

Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Change-Id: I39b8a4099ad61161d52c3784d6325df7da031011
diff --git a/config/config.h.meson b/config/config.h.meson
index f852bab..0c3bb6d 100644
--- a/config/config.h.meson
+++ b/config/config.h.meson
@@ -34,7 +34,8 @@
 static constexpr auto FIRST_CEREAL_CLASS_VERSION_WITH_UPDATE_TS = "3";
 static constexpr auto FIRST_CEREAL_CLASS_VERSION_WITH_EVENTID = "4";
 static constexpr auto FIRST_CEREAL_CLASS_VERSION_WITH_RESOLUTION = "5";
-static constexpr size_t CLASS_VERSION = 5;
+static constexpr auto FIRST_CEREAL_CLASS_VERSION_WITH_METADATA_DICT = "6";
+static constexpr size_t CLASS_VERSION = 6;
 
 static constexpr bool LG2_COMMIT_DBUS = @lg2_commit_dbus@;
 static constexpr bool LG2_COMMIT_JOURNAL = @lg2_commit_journal@;
diff --git a/elog_serialize.cpp b/elog_serialize.cpp
index 1fd5a1f..6a2dac4 100644
--- a/elog_serialize.cpp
+++ b/elog_serialize.cpp
@@ -3,6 +3,7 @@
 #include "elog_serialize.hpp"
 
 #include <cereal/archives/binary.hpp>
+#include <cereal/types/map.hpp>
 #include <cereal/types/string.hpp>
 #include <cereal/types/tuple.hpp>
 #include <cereal/types/vector.hpp>
@@ -30,7 +31,7 @@
 template <class Archive>
 void save(Archive& a, const Entry& e, const std::uint32_t /*version*/)
 {
-    a(e.id(), e.severity(), e.timestamp(), e.message(), e.additionalData(),
+    a(e.id(), e.severity(), e.timestamp(), e.message(), e.additionalData2(),
       e.associations(), e.resolved(), e.version(), e.updateTimestamp(),
       e.eventId(), e.resolution());
 }
@@ -51,7 +52,7 @@
     Entry::Level severity{};
     uint64_t timestamp{};
     std::string message{};
-    std::vector<std::string> additionalData{};
+    std::map<std::string, std::string> additionalData{};
     bool resolved{};
     AssociationList associations{};
     std::string fwVersion{};
@@ -61,25 +62,41 @@
 
     if (version < std::stoul(FIRST_CEREAL_CLASS_VERSION_WITH_FWLEVEL))
     {
-        a(id, severity, timestamp, message, additionalData, associations,
+        std::vector<std::string> additionalData_old{};
+        a(id, severity, timestamp, message, additionalData_old, associations,
           resolved);
         updateTimestamp = timestamp;
+        additionalData = util::additional_data::parse(additionalData_old);
     }
     else if (version < std::stoul(FIRST_CEREAL_CLASS_VERSION_WITH_UPDATE_TS))
     {
-        a(id, severity, timestamp, message, additionalData, associations,
+        std::vector<std::string> additionalData_old{};
+        a(id, severity, timestamp, message, additionalData_old, associations,
           resolved, fwVersion);
         updateTimestamp = timestamp;
+        additionalData = util::additional_data::parse(additionalData_old);
     }
     else if (version < std::stoul(FIRST_CEREAL_CLASS_VERSION_WITH_EVENTID))
     {
-        a(id, severity, timestamp, message, additionalData, associations,
+        std::vector<std::string> additionalData_old{};
+        a(id, severity, timestamp, message, additionalData_old, associations,
           resolved, fwVersion, updateTimestamp);
+        additionalData = util::additional_data::parse(additionalData_old);
     }
     else if (version < std::stoul(FIRST_CEREAL_CLASS_VERSION_WITH_RESOLUTION))
     {
-        a(id, severity, timestamp, message, additionalData, associations,
+        std::vector<std::string> additionalData_old{};
+        a(id, severity, timestamp, message, additionalData_old, associations,
           resolved, fwVersion, updateTimestamp, eventId);
+        additionalData = util::additional_data::parse(additionalData_old);
+    }
+    else if (version <
+             std::stoul(FIRST_CEREAL_CLASS_VERSION_WITH_METADATA_DICT))
+    {
+        std::vector<std::string> additionalData_old{};
+        a(id, severity, timestamp, message, additionalData_old, associations,
+          resolved, fwVersion, updateTimestamp, eventId, resolution);
+        additionalData = util::additional_data::parse(additionalData_old);
     }
     else
     {
@@ -91,8 +108,8 @@
     e.severity(severity, true);
     e.timestamp(timestamp, true);
     e.message(message, true);
-    e.additionalData(additionalData, true);
-    e.additionalData2(util::additional_data::parse(additionalData), true);
+    e.additionalData(util::additional_data::combine(additionalData), true);
+    e.additionalData2(additionalData, true);
     e.sdbusplus::server::xyz::openbmc_project::logging::Entry::resolved(
         resolved, true);
     e.associations(associations, true);
diff --git a/test/serialization_test_properties.cpp b/test/serialization_test_properties.cpp
index d7d5455..60fc6ae 100644
--- a/test/serialization_test_properties.cpp
+++ b/test/serialization_test_properties.cpp
@@ -13,7 +13,7 @@
 {
     auto id = 99;
     phosphor::logging::AssociationList assocations{};
-    std::vector<std::string> testData{"additional", "data"};
+    std::vector<std::string> testData{"additional=1", "data=yes"};
     uint64_t timestamp{100};
     std::string message{"test error"};
     std::string fwLevel{"level42"};