47 std::shared_ptr<armem::gui::model::MemoryViewerModel>
model)
49 _model = std::move(
model);
72 QThread* thread =
new QThread;
73 QObject* worker =
new QObject;
75 worker->moveToThread(thread);
80 [
this, thread, worker, directory]()
85 loadFromDisk(directory.toStdString());
87 QTimer::singleShot(0,
this, [
this, thread, worker]()
90 _diskIOView->loadFinished();
95 worker->deleteLater();
96 thread->deleteLater();
110 auto memoryData = _model->memoryDataCopy();
111 auto enabledMemories = _model->getEnabledMemories();
112 for (
auto it = memoryData.begin(); it != memoryData.end();)
114 if (std::find(enabledMemories.begin(), enabledMemories.end(), it->first) ==
115 enabledMemories.end())
117 it = memoryData.erase(it);
124 std::vector<wm::Memory> memoryDataVec = simox::alg::get_values(memoryData);
125 storeOnDisk(directory, memoryDataVec, &
status);
127 _statusLabel->setText(QString::fromStdString(
status));
131 static const std::string&
132 handleSingular(
int num,
const std::string& singular,
const std::string& plural)
134 return num == 1 ? singular : plural;
138 DiskIOController::storeOnDisk(QString directory,
139 const std::vector<wm::Memory> memoryData,
140 std::string* outStatus)
142 std::filesystem::path path(directory.toUtf8().constData());
146 if (std::filesystem::is_regular_file(path))
148 status <<
"Could not export memories contents to " << path
149 <<
": Cannot overwrite existing file.";
154 for (
const auto&
data : memoryData)
156 std::string name =
data.id().memoryName;
157 if (std::filesystem::is_regular_file(path / name))
159 status <<
"Could not export memory '" << name <<
"' to " << path
160 <<
": Cannot overwrite existing file.\n";
164 std::string defaultIdent =
"DefaultDisk";
165 std::string exportName =
"MemoryExport";
166 std::shared_ptr<armem::server::ltm::persistence::DiskPersistence>
168 std::make_shared<armem::server::ltm::persistence::DiskPersistence>(
169 defaultIdent, exportName, path);
173 if (
memory.getPersistenceStrategy())
175 memory.getPersistenceStrategy()->addStrategy(diskPersistence);
181 redundantPersistence = std::make_shared<
184 memory.setPersistenceStrategy(redundantPersistence);
185 memory.getPersistenceStrategy()->
addStrategy(diskPersistence);
188 memory.directlyStore(data);
193 status <<
"Exported " << numStored <<
" "
194 << handleSingular(numStored,
"memory",
"memories") <<
" to " << path <<
".";
199 *outStatus =
status.str();
204 DiskIOController::loadFromDisk(
const std::string& directory)
208 std::filesystem::path path(directory);
210 std::map<std::filesystem::path, wm::Memory> memoryData;
212 if (not std::filesystem::is_directory(path))
214 ARMARX_WARNING <<
"You are trying to load data from a path which does not exist";
222 bool isSingleMemory =
false;
223 for (
auto i = std::filesystem::recursive_directory_iterator(path);
224 i != std::filesystem::recursive_directory_iterator();
232 <<
"You are trying to import a directory which does not contain memory data";
239 if (std::filesystem::is_regular_file(dir.path()) &&
240 simox::alg::starts_with(dir.path().filename(),
"data.aron"))
250 auto loadMemory = [&](
const std::filesystem::path& p)
252 if (std::filesystem::is_directory(p))
254 std::string defaultIdent =
"DefaultDisk";
255 std::string exportFolderName = p.parent_path().filename();
256 ARMARX_INFO <<
"Name of the folder trying to import: " << exportFolderName;
257 std::string exportName = exportFolderName;
258 std::shared_ptr<armem::server::ltm::persistence::DiskPersistence> diskPersistence =
259 std::make_shared<armem::server::ltm::persistence::DiskPersistence>(
260 defaultIdent, exportName, p.parent_path().parent_path());
262 armem::server::ltm::Memory ltm(exportName, p.filename());
263 if (ltm.getPersistenceStrategy())
265 ltm.getPersistenceStrategy()->addStrategy(diskPersistence);
269 std::shared_ptr<armem::server::ltm::persistence::RedundantPersistenceStrategy>
270 redundantPersistence = std::make_shared<
271 armem::server::ltm::persistence::RedundantPersistenceStrategy>();
273 ltm.setPersistenceStrategy(redundantPersistence);
274 ltm.getPersistenceStrategy()->addStrategy(diskPersistence);
277 armem::wm::Memory memory =
278 ltm.loadAllAndResolve();
279 memoryData[p] = std::move(memory);
292 for (
const auto& dir : std::filesystem::directory_iterator(path))
294 loadMemory(dir.path());
298 for (
auto& [path, memory] : memoryData)
300 std::string name = memory.id().memoryName;
303 if (
auto writers = _model->memoryWritersCopy(); writers.count(name) > 0)
310 writers.at(name).commit(commit);
312 catch (
const Ice::Exception& ex)
314 ARMARX_ERROR <<
"Commit failed due to Ice Exception: " << ex.what();
316 catch (
const std::exception& ex)
324 <<
"' available for commit. Create new virtual memory.";
329 std::string virtualMemoryName = name;
330 memory.id().memoryName = virtualMemoryName;
331 memoryData[virtualMemoryName] = std::move(memory);