From 83c2a3ecd7427baddfdacc813d9d2db0fda0ed62 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Wed, 22 Sep 2021 16:43:09 +0200
Subject: [PATCH] Add ltm/disk/operations.h

---
 .../RobotAPI/libraries/armem/CMakeLists.txt   |  2 +
 .../armem/server/ltm/disk/operations.cpp      | 76 +++++++++++++++++++
 .../armem/server/ltm/disk/operations.h        | 18 +++++
 3 files changed, 96 insertions(+)
 create mode 100644 source/RobotAPI/libraries/armem/server/ltm/disk/operations.cpp
 create mode 100644 source/RobotAPI/libraries/armem/server/ltm/disk/operations.h

diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt
index c524ecd93..cf8ce72df 100644
--- a/source/RobotAPI/libraries/armem/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem/CMakeLists.txt
@@ -84,6 +84,7 @@ set(LIB_FILES
     server/RemoteGuiAronDataVisitor.cpp
 
     server/ltm/LongtermMemoryBase.cpp
+    server/ltm/disk/operations.cpp
     server/ltm/disk/MemoryManager.cpp
     server/ltm/mongodb/MemoryManager.cpp
     server/ltm/mongodb/ConnectionManager.cpp
@@ -196,6 +197,7 @@ set(LIB_HEADERS
     server/RemoteGuiAronDataVisitor.h
 
     server/ltm/LongtermMemoryBase.h
+    server/ltm/disk/operations.h
     server/ltm/disk/MemoryManager.h
     server/ltm/mongodb/MemoryManager.h
     server/ltm/mongodb/ConnectionManager.h
diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/operations.cpp b/source/RobotAPI/libraries/armem/server/ltm/disk/operations.cpp
new file mode 100644
index 000000000..83d2b379d
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/operations.cpp
@@ -0,0 +1,76 @@
+#include "operations.h"
+
+#include <RobotAPI/libraries/armem/client/query/Builder.h>
+#include <RobotAPI/libraries/armem/server/ltm/disk/MemoryManager.h>
+#include <RobotAPI/libraries/armem/server/query_proc/ltm.h>
+#include <RobotAPI/libraries/armem/server/wm/memory_definitions.h>
+
+
+namespace armarx::armem::server::ltm
+{
+
+    armem::wm::Memory
+    disk::load(const std::filesystem::path& directory)
+    {
+        const std::string key = directory.filename();
+        armem::server::ltm::disk::MemoryManager manager;
+        manager.setName(key);
+        manager.setBasePath(directory);
+        manager.reload();
+
+        armem::client::QueryBuilder builder;
+        builder.all();
+        armem::client::QueryInput queryInput = builder.buildQueryInput();
+        queryInput.addQueryTargetToAll(armem::query::data::QueryTarget::LTM);
+
+        armem::server::query_proc::ltm::MemoryQueryProcessor processor;
+        armem::wm::Memory memory =
+            processor.process(queryInput.toIce(), manager.getCacheAndLutNotConverted());
+        manager.convert(memory);
+
+        return memory;
+    }
+
+
+    namespace detail
+    {
+        template <class MemoryT>
+        void
+        store(const std::filesystem::path& directory, const MemoryT& memory)
+        {
+            const std::string& name = memory.name();
+            if (std::filesystem::is_regular_file(directory / name))
+            {
+                std::stringstream ss;
+                ss << "Could not export memory '" << name << "' to " << directory << ": "
+                   << "Cannot overwrite existing file.\n";
+                throw error::IOError(directory, ss.str());
+            }
+            else
+            {
+                std::filesystem::create_directories(directory / name);
+
+                armem::server::ltm::disk::MemoryManager manager;
+                manager.setName(name);
+                manager.setBasePath(directory / name);
+                manager.reload();
+                manager.append(memory);
+            }
+        }
+    } // namespace detail
+
+
+    void
+    disk::store(const std::filesystem::path& directory, const armem::wm::Memory& memory)
+    {
+        detail::store(directory, memory);
+    }
+
+
+    void
+    disk::store(const std::filesystem::path& directory, const armem::server::wm::Memory& memory)
+    {
+        detail::store(directory, memory);
+    }
+
+} // namespace armarx::armem::server::ltm
diff --git a/source/RobotAPI/libraries/armem/server/ltm/disk/operations.h b/source/RobotAPI/libraries/armem/server/ltm/disk/operations.h
new file mode 100644
index 000000000..b18575996
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/server/ltm/disk/operations.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include <filesystem>
+
+#include <RobotAPI/libraries/armem/core/forward_declarations.h>
+#include <RobotAPI/libraries/armem/server/forward_declarations.h>
+
+
+namespace armarx::armem::server::ltm::disk
+{
+
+    armem::wm::Memory load(const std::filesystem::path& directory);
+
+    void store(const std::filesystem::path& directory, const armem::wm::Memory& memory);
+    void store(const std::filesystem::path& directory, const armem::server::wm::Memory& memory);
+
+
+} // namespace armarx::armem::server::ltm::disk
-- 
GitLab