/** * Marker object * $Id$ * $HeadURL$ * $Author$ * Created by hjl, SLSE, 2016-04-12 */ #include "object_marker.h" #include "dds_handler.h" #include namespace MarkerManagement { ObjectMarker::ObjectMarker(const std::shared_ptr &ddsHandler, const std::shared_ptr &db) : m_ddsHandler(ddsHandler) , m_db(db) , m_logger(getLogger("ObjectMarker")) { } // end of ctor() //----------------------------------------------------------------------------- ObjectMarker::~ObjectMarker() { m_ddsHandler->dts()->removeMarkerByKey(m_dataMarkerObject.id()); } // end of dtor() //----------------------------------------------------------------------------- Core::FunctionReplyObject ObjectMarker::createObject(const Marker &data) { m_dataMarkerObject = data; if (data.id() <= 0) { Database::MrkMarker dbDataMarker = toDbData(data); DBTransaction trans(m_db->database()); if (!m_db->insert(dbDataMarker)) return Core::FunctionReplyObject(0, tr_lts("dds", "Error inserting MrkMarker-data into database")); // Neue DB Id in lokale Struktur uebernehmen m_dataMarkerObject.id(dbDataMarker.id); DEBUG_LOG(m_logger) << "New MarkerId: " << dbDataMarker.id; DEBUG_LOG(m_logger) << "Handle MarkerDescription for markerId:" << dbDataMarker.id << " number of depending descriptions: " << data.descriptions().size(); // Behandlung von MarkerDescription for (size_t i = 0; i < data.descriptions().size(); ++i) { MarkerDescription &mrkDesc = m_dataMarkerObject.descriptions()[i]; Database::MrkMarkerDescription dbDataDesc = toDbData(mrkDesc); // Struct MarkerDescription vorbereiten dbDataDesc.markerId = dbDataMarker.id; // FK auf MarkerId dbDataDesc.id = 0; if (!m_db->insert(dbDataDesc)) return Core::FunctionReplyObject(0, tr_lts("dds", "Error inserting MarkerDescription-data into database")); // Neue DB Id in lokale Struktur uebernehmen mrkDesc.id(dbDataDesc.id); } trans.commit(); } // Publish Data via DTS onPublishData(); return Core::FunctionReplyObject(m_dataMarkerObject.id()); } // end of createObject() //----------------------------------------------------------------------------- Core::FunctionReplyObject ObjectMarker::updateObject(const Marker &data) { if (!isValid()) return Core::FunctionReplyObject(data.id(), tr_lts("dds", "Object not valid/blocked")); const Database::MrkMarker dbDataMarker = toDbData(data); auto newData = data; DBTransaction trans(m_db->database()); if (!m_db->update(dbDataMarker)) return Core::FunctionReplyObject(data.id(), tr_lts("dds", "Error updating MrkMarker-data into database")); DEBUG_LOG(m_logger) << "Data changed for markerId: " << m_dataMarkerObject.id(); INFO_LOG(m_logger) << "Handle MarkerDescriptions for markerId:" << data.id() << ". Number of pending descriptions (new/previous):" << data.descriptions().size() << "/" << m_dataMarkerObject.descriptions().size(); // Descriptions mit id -> schon vorhanden // Desctiptions ohne id -> neu einfügen for (auto &desc : newData.descriptions()) { Database::MrkMarkerDescription dbDesc = toDbData(desc); dbDesc.markerId = dbDataMarker.id; // FK auf MarkerId if (desc.id() > 0) { // immer update ... if (!m_db->update(dbDesc)) return Core::FunctionReplyObject(data.id(), tr_lts("dds", "Error updating MrkMarkerDescription-data into database")); } else { if (!m_db->insert(dbDesc)) return Core::FunctionReplyObject(data.id(), tr_lts("dds", "Error inserting MarkerDescription-data into database")); desc.id(dbDesc.id); } } // jetzt noch prüfen ob ggf. etwas rausgefallen ist for (const auto &oldDesc : m_dataMarkerObject.descriptions()) { bool bFound = false; for (const auto &newDesc : newData.descriptions()) { if (newDesc.id() == oldDesc.id()) { bFound = true; break; } } if (!bFound) { DEBUG_LOG(m_logger) << "Description with id " << oldDesc.id() << " was removed - removing from db"; if (!m_db->removeMrkMarkerDescription(oldDesc.id())) return Core::FunctionReplyObject(data.id(), tr_lts("dds", "MarkerDescription with id %1 can not be removed")) .arg(oldDesc.id()); } } trans.commit(); m_dataMarkerObject = newData; // Publish Data via DTS onPublishData(); return Core::FunctionReplyObject(m_dataMarkerObject.id()); } // end of updateObject() //----------------------------------------------------------------------------- Core::FunctionReplyObject ObjectMarker::removeObject() { if (isUsed()) return Core::FunctionReplyObject(m_dataMarkerObject.id(), tr_lts("dds", "Marker still in use")); // MarkerDescription werden automatisch entfernt (ON DELETE CASCADE) if (!m_db->removeMrkMarker(m_dataMarkerObject.id())) return Core::FunctionReplyObject(m_dataMarkerObject.id(), tr_lts("dds", "Marker with id %1 can not be removed")).arg(m_dataMarkerObject.id()); m_ddsHandler->dts()->removeMarkerByKey(m_dataMarkerObject.id()); return Core::FunctionReplyObject(m_dataMarkerObject.id()); } // end of removeObject() //----------------------------------------------------------------------------- Core::FunctionReplyObject ObjectMarker::setUsed(bool isUsed) { if (!isValid()) return Core::FunctionReplyObject(m_dataMarkerObject.id(), tr_lts("dds", "Trying to update an already removed Marker object")); m_dataMarkerObject.isUsed(isUsed); // Publish Data via DTS onPublishData(); return Core::FunctionReplyObject(m_dataMarkerObject.id()); } // end of setUsed() //----------------------------------------------------------------------------- bool ObjectMarker::isValid() const { return m_dataMarkerObject.id() > 0; } // end of isValid() //----------------------------------------------------------------------------- bool ObjectMarker::isUsed() const { return m_dataMarkerObject.isUsed(); } // end of isUsed() //----------------------------------------------------------------------------- void ObjectMarker::onPublishData() { INFO_LOG(m_logger) << "Publish MrkMarker-data to dds markerId:" << m_dataMarkerObject.id() ; if (!m_ddsHandler->dts()->publish(m_dataMarkerObject)) WARNING_LOG(m_logger) << "Error publishing MrkMarker-data to dds"; } // end of onPublishData() //----------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // convert methods // ---------------------------------------------------------------------------- // MarkerManagement::Marker => Database::MrkMarker Database::MrkMarker ObjectMarker::toDbData(const Marker &ddsData) { Database::MrkMarker dbData; dbData.id = ddsData.id(); dbData.operatorId = ddsData.operatorId(); dbData.note = QString::fromStdString(ddsData.note()); dbData.timeStamp = ddsData.timeStamp(); dbData.timeStampOffset = ddsData.timeStampOffset(); dbData.mapSettings = QString::fromStdString(ddsData.mapSettings()); dbData.filter = QString::fromStdString(ddsData.filter()); dbData.position.setX(ddsData.position().lon()); dbData.position.setY(ddsData.position().lat()); dbData.fileContentId = ddsData.fileContentId(); return dbData; } // end of toDbData() //----------------------------------------------------------------------------- //Database::MrkMarker => MarkerManagement::Marker Marker ObjectMarker::toDdsData(const Database::MrkMarker &dbData) { Marker ddsData; ddsData.id(dbData.id); ddsData.operatorId(dbData.operatorId); ddsData.note(dbData.note.toStdString()); ddsData.timeStamp(dbData.timeStamp); ddsData.timeStampOffset(dbData.timeStampOffset); ddsData.mapSettings(dbData.mapSettings.toStdString()); ddsData.filter(dbData.filter.toStdString()); ddsData.position(Core::GeoPosition(dbData.position.x(), dbData.position.y(), 0.0)); ddsData.fileContentId(dbData.fileContentId); // init data not in db ddsData.isDeleted(false); ddsData.isUsed(false); return ddsData; } // end of toDdsData() //----------------------------------------------------------------------------- // MarkerManagement::MarkerDescription => Database::MrkMarkerDescription Database::MrkMarkerDescription ObjectMarker::toDbData(const MarkerDescription &ddsData) { Database::MrkMarkerDescription dbData; dbData.id = ddsData.id(); dbData.markerTypeId = ddsData.markerType(); dbData.content = QString::fromStdString(ddsData.content()); return dbData; } // end of toDbData() //----------------------------------------------------------------------------- //Database::MrkMarkerDescription => MarkerManagement::MarkerDescription MarkerDescription ObjectMarker::toDdsData(const Database::MrkMarkerDescription &dbData) { MarkerDescription ddsData; ddsData.id(dbData.id); ddsData.markerType(dbData.markerTypeId); ddsData.content(dbData.content.toStdString()); return ddsData; } // end of toDdsData() //----------------------------------------------------------------------------- } // namespace MarkerManagement