/** * DbReader for RecordingManagement * $Id$ * $HeadURL$ * $Author$ */ #include "db_reader.h" #include "logger.h" #include #include #include namespace SituationReplay { DbReader::DbReader(const std::shared_ptr &ddsConnector, int exerciseId, bool bCanHandleSchemas) : m_exerciseId(exerciseId) , m_query(nullptr) , m_ddsConnector(ddsConnector) , m_bCanHandleSchemas(bCanHandleSchemas) , m_logger(getLogger("DbReader")) {} DbReader::~DbReader() { delete m_query; LtsPluginManager::LtsPluginLoader::getInstance()->unloadAllPlugins(); m_plugins.clear(); } bool DbReader::loadPlugin(const LtsPluginManager::PluginInstance &pi) { RecordReplay::RecordReplayPlugin *recPlugin = qobject_cast(pi.plugin); if (!recPlugin) { ERROR_LOG(m_logger) << "Cannot load RecordReplayPlugin " << pi.fileName; return false; } if (!recPlugin->initDts(m_ddsConnector, m_exerciseId, m_bCanHandleSchemas, *m_query)) { ERROR_LOG(m_logger) << "Initialisation for RecordReplayPlugin " << pi.fileName << " failed "; return false; } INFO_LOG(m_logger) << "Loaded record replay plugin " << recPlugin->pluginName(); m_plugins.push_back(recPlugin); return true; } bool DbReader::init(const QSqlDatabase &db) { delete m_query; m_query = new NSqlQuery(db); auto cb = [this](const LtsPluginManager::PluginInstance &pi) { return loadPlugin(pi); }; LtsPluginManager::LtsPluginLoader::getInstance()->loadPlugins(LtsPluginManager::PluginType::SPECIAL, cb, QStringList(), QStringLiteral("recordreplay")); return true; } bool DbReader::setReplayStartTime(qint64 startTime) { INFO_LOG(m_logger) << "IN setReplayStartTime " << startTime; if (!m_query) { WARNING_LOG(m_logger) << "Internal error - no query!"; return false; } for (RecordReplay::RecordReplayPlugin *recPlugin : m_plugins) { INFO_LOG(m_logger) << "IN setReplayStartTime, current Plugin: " << recPlugin->pluginName() << " typename=" << typeid(*recPlugin).name(); if (!recPlugin->setReplayStartTime(*m_query, startTime)) { WARNING_LOG(m_logger) << "setReplayStartTime for plugin " << recPlugin->svcShortName() << " failed!"; return false; } } INFO_LOG(m_logger) << "IN setReplayStartTime " << startTime << " DONE"; return true; } bool DbReader::readData(qint64 fromTime, qint64 toTime) { INFO_LOG(m_logger) << "IN readData " << fromTime << " to " << toTime; if (!m_query) { WARNING_LOG(m_logger) << "Internal error - no query!"; return false; } for (RecordReplay::RecordReplayPlugin *recPlugin : m_plugins) { if (!recPlugin->ddsTopicsFromDatabase(*m_query, fromTime, toTime)) { WARNING_LOG(m_logger) << "ddsTopicsFromDatabase for plugin " << recPlugin->svcShortName() << " failed!"; return false; } } INFO_LOG(m_logger) << "IN readData " << fromTime << " to " << toTime << " DONE"; return true; } void DbReader::publish(qint64 desiredTime) { INFO_LOG(m_logger) << "IN publish " << desiredTime; for (RecordReplay::RecordReplayPlugin *recPlugin : m_plugins) if (!recPlugin->publishData(desiredTime)) WARNING_LOG(m_logger) << "publishData for plugin " << recPlugin->svcShortName() << " failed!"; INFO_LOG(m_logger) << "IN publish " << desiredTime << " DONE"; } void DbReader::waitForAsyncOperations(qint64 desiredTime) { INFO_LOG(m_logger) << "IN waitForAsyncOperations " << desiredTime; for (RecordReplay::RecordReplayPlugin *recPlugin : m_plugins) if (!recPlugin->waitForAsyncOperations(desiredTime)) WARNING_LOG(m_logger) << "waitForAsyncOperations for plugin " << recPlugin->svcShortName() << " failed!"; } void DbReader::clearData() { INFO_LOG(m_logger) << "IN clearData"; for (RecordReplay::RecordReplayPlugin *recPlugin : m_plugins) recPlugin->clearData(); } } // RecordingManagement