Initial commit

This commit is contained in:
torsten committed 2026-08-13 18:33:10 +02:00
commit b7d90b9afe
16245 files changed
+3396666

No files matched your search

@@ -0,0 +1,351 @@
/**
* @RDE_HEADER@
* ISM Object Mounting Point Schedule
* $Id$
* $HeadURL$
* $Author$
* Created by Iuliana Ojog, SLSE, 2016-11-26
*/
#include "object_main_schedule.h"
#include <ngldb/dbtransaction.h>
#include <QTimer>
using namespace InfrastructureManagement;
//----------------------------------------------------------------------------------------------------
ObjectMainSchedule::ObjectMainSchedule(MainHandler *mainHandler)
: Base(mainHandler, getLogger("ObjectMainSchedule"))
{
}
//----------------------------------------------------------------------------------------------------
ObjectMainSchedule::~ObjectMainSchedule()
{
}
//----------------------------------------------------------------------------------------------------
bool ObjectMainSchedule::isValid() const
{
return m_data.id() > 0;
}
//----------------------------------------------------------------------------------------------------
bool ObjectMainSchedule::isUsed() const
{
return m_data.isUsed();
}
//----------------------------------------------------------------------------------------------------
Core::FunctionReplyObject ObjectMainSchedule::createObject(const MainSchedule &data)
{
m_data = data;
if (m_data.id() <= 0)
{
// This is a brand new Item to push into the Database
m_data.isUsed(false);
Database::IsmMountingPointSchedule dbData;
dbData = toDbData(data);
if (!db()->insert(dbData))
return Core::FunctionReplyObject(0, tr_lts("dds", "Error inserting IsmMainSchedule-data into database"));
m_data.id(dbData.id);
DEBUG_LOG(m_logger) << "New Id: " << m_data.id();
// Publish Data via DTS
dts()->publish(m_data);
}
// If this is a replicated item from the Database, elements() must be filled with loadMountingPointPlans()
// by the calling class!
// Cannot be done within createObject as the SQL Janitor prevents this!
// Therefore, this item is not published in this case, but within loadMountingPointPlans()!
return Core::FunctionReplyObject(m_data.id());
}
// Cannot be done within createObject as the SQL Janitor prevents this!
bool ObjectMainSchedule::loadMountingPointPlans()
{
m_data.elements().clear();
// Data from DB is pushed in here, we just need to update MPPs
auto cbMps = [this] (const Database::IsmMountingPointPlan &data)
{
MountingPointPlan ddsData = ObjectMainSchedule::toDdsData(data);
m_data.elements().push_back(ddsData);
m_mppMap.insert(ddsData.structureElementId(), ddsData);
};
// create Mounting Point Schedule objects
if (!db()->selectByMountingPointScheduleId(cbMps,m_data.id()))
return false;
return dts()->publish(m_data);
}
//----------------------------------------------------------------------------------------------------
// ---- .elements() is ignored here intentionally!!!! ----
Core::FunctionReplyObject ObjectMainSchedule::updateObject(const MainSchedule &data)
{
if (!isValid())
return Core::FunctionReplyObject(data.id(), tr_lts("dds", "Object not valid/blocked"));
Database::IsmMountingPointSchedule dbData;
dbData = toDbData(data);
if (!db()->update(dbData))
return Core::FunctionReplyObject(data.id(), tr_lts("dds", "Error updating IsmMainSchedule-data into database"));
// Change state if different
if (m_data.statusId() != data.statusId())
setScheduleStatus(data.statusId());
// If elements are not saved, a MainSchedule with 0 elements will be published.
std::vector< InfrastructureManagement::MountingPointPlan > tempElements = m_data.elements();
m_data = data;
m_data.elements(tempElements);
DEBUG_LOG(m_logger) << "Data changed for Id: " << m_data.id();
// Publish Data via DTS
dts()->publish(m_data);
return Core::FunctionReplyObject(m_data.id());
}
//----------------------------------------------------------------------------------------------------
Core::FunctionReplyObject ObjectMainSchedule::copyObject(qint32 scheduleId)
{
int newId = db()->copySchedule(scheduleId);
if (newId <= 0)
return Core::FunctionReplyObject(0, tr_lts("dds", "Error on copy IsmMainSchedule"));
Database::IsmMountingPointSchedule dbData;
if (!db()->selectIsmMountingPointSchedule(newId, dbData))
return Core::FunctionReplyObject(newId, tr_lts("dds", "Error selecting copy id from database"));
m_data = toDdsData(dbData);
//
// An Object initialized by this method is not used, but only getId() is called afterwards (right now)
// Therefore, expensive selection of MPPs is avoided. Uncomment if needed (MD, 07.02.23)
//
// auto cbMps = [this] (const Database::IsmMountingPointPlan &data)
// {
// InfrastructureManagement::MountingPointPlan ddsData = ObjectMainSchedule::toDdsData(data);
// m_data.elements().push_back(ddsData);
// };
// // create Mounting Point Schedule objects
// if (!db()->selectByMountingPointScheduleId(cbMps,m_data.id()))
// {
// return Core::FunctionReplyObject(0, tr_lts("dds", "Error inserting IsmMountingPointPlan-data into DDS Structure"));
// }
return Core::FunctionReplyObject(newId);
}
Core::FunctionReplyObject ObjectMainSchedule::updateElements(const std::vector<MountingPointPlan> &newElements)
{
std::vector<Database::IsmMountingPointPlan> insert;
DBTransaction trans(db()->database());
bool retVal = true;
for (const MountingPointPlan &mpp : newElements)
{
int seId = mpp.structureElementId();
if (m_mppMap.contains(seId))
{
if (mpp.mountingPointState() == MountingPointState_def::Idle)
{
retVal &= db()->deleteMountingPointPlan(m_data.id(), seId);
m_mppMap.remove(seId);
}
else
{
retVal &= db()->updateMountingPointPlan(m_data.id(), seId, mpp.mountingPointState());
m_mppMap[seId] = mpp;
}
}
else
{
auto copy = toDbData(m_data.id(), mpp);
m_mppMap[seId] = mpp;
// Do this as a bulk....
insert.push_back(copy);
}
}
retVal &= db()->insertMountingPointPlans(insert);
trans.commit();
m_data.elements().clear();
m_data.elements().reserve(m_mppMap.size());
std::copy(m_mppMap.begin(), m_mppMap.end(),std::back_inserter(m_data.elements()));
QTimer::singleShot(50, [this](){dts()->publish(m_data);});
if (!retVal)
return Core::FunctionReplyObject(m_data.id(), tr_lts("dds", "Error on updating MountingPoint Plans."));
return Core::FunctionReplyObject(m_data.id());
}
//----------------------------------------------------------------------------------------------------
Core::FunctionReplyObject ObjectMainSchedule::setUsed(bool isUsed)
{
if (!isValid())
return Core::FunctionReplyObject(m_data.id(), tr_lts("dds", "Trying to update an already removed IsmMainSchedule object"));
m_data.isUsed(isUsed);
// Publish Data via DTS
//onPublishData();
return Core::FunctionReplyObject(m_data.id());
}
//----------------------------------------------------------------------------------------------------
Core::FunctionReplyObject ObjectMainSchedule::removeObject()
{
if (isUsed())
return Core::FunctionReplyObject(m_data.id(), tr_lts("dds", "MainSchedule still in use"));
if (!db()->removeIsmMountingPointSchedule(m_data.id()))
return Core::FunctionReplyObject(m_data.id(), tr_lts("dds", "MainSchedule with id %1 can not be removed from DB")).arg(m_data.id());
if (!dts()->removeMainScheduleByKey(m_data.id()))
return Core::FunctionReplyObject(m_data.id(), tr_lts("dds", "MainSchedule with id %1 can not be removed from DDS")).arg(m_data.id());
return Core::FunctionReplyObject(m_data.id());
}
//----------------------------------------------------------------------------------------------------
bool ObjectMainSchedule::setScheduleStatus(const ScheduleStatus &status)
{
if (m_data.statusId() == status)
return true;
if (!isValid())
{
WARNING_LOG(m_logger) << "Trying to update an already removed MainSchedule object";
return false;
}
DEBUG_LOG(m_logger) << "## old status = " << m_data.statusId();
DEBUG_LOG(m_logger) << "## new status = " << status;
m_data.statusId() = status;
QDateTime changed = QDateTime::currentDateTimeUtc();
if (m_data.timeCreated() <= 0)
m_data.timeCreated() = changed.toMSecsSinceEpoch();
switch (m_data.statusId().underlying())
{
case ScheduleStatus::Active:
m_data.timeStart() = changed.toMSecsSinceEpoch();
break;
case ScheduleStatus::Inactive:
m_data.timeEnd() = changed.toMSecsSinceEpoch();
break;
default:
break;
}
Database::IsmMountingPointSchedule dbData;
dbData = toDbData(m_data);
if (!db()->update(dbData))
{
ERROR_LOG(m_logger) << "Error updating MainSchedule-data in database (ScheduleStatus) for id = " << m_data.id() << " : " << db()->getLastError().text();;
return false;
}
Database::IsmScheduleStatusChange stateChange;
stateChange.id = 0;
stateChange.scheduleId = m_data.id();
stateChange.changedAt = changed.currentMSecsSinceEpoch();
// record stateChange
if (!db()->insert(stateChange))
WARNING_LOG(m_logger) << "Recording change of ScheduleStatusChange failed: " << db()->getLastError().text();;
// Publish Data via DTS
//onPublishData();
return true;
}
// -------------------------------------------------------------------------------------------------------
// convert methods
// -------------------------------------------------------------------------------------------------------
// InfrastructureManagement::MainSchedule => Database::IsmMountingPointSchedule
//----------------------------------------------------------------------------------------------------
Database::IsmMountingPointSchedule ObjectMainSchedule::toDbData(const MainSchedule &ddsData)
{
Database::IsmMountingPointSchedule dbData;
dbData.id = ddsData.id();
dbData.name = QString::fromStdString(ddsData.name());
dbData.timeCreated = QDateTime::fromMSecsSinceEpoch(ddsData.timeCreated());
dbData.statusId = ddsData.statusId();
if (ddsData.timeStart().is_set() && ddsData.timeStart().get() > 0)
dbData.timeStart = QDateTime::fromMSecsSinceEpoch(ddsData.timeStart().get());
else
dbData.timeStart = QDateTime();
if (ddsData.timeEnd().is_set() && ddsData.timeEnd().get() > 0)
dbData.timeEnd = QDateTime::fromMSecsSinceEpoch(ddsData.timeEnd().get());
else
dbData.timeEnd = QDateTime();
if (ddsData.exerciseId().is_set() && ddsData.exerciseId().get() > 0)
dbData.exerciseId = ddsData.exerciseId().get();
return dbData;
}
// InfrastructureManagement::MountingPointPlan => Database::IsmMountingPointPlan
Database::IsmMountingPointPlan ObjectMainSchedule::toDbData(int scheduleId, const MountingPointPlan &ddsData)
{
Database::IsmMountingPointPlan dbData;
dbData.structureElementId = ddsData.structureElementId();
dbData.mountingPointScheduleId = scheduleId;
dbData.mountingPointState= ddsData.mountingPointState();
return dbData;
}
// -------------------------------------------------------------------------------------------------------
// Database::IsmMountingPointSchedule => InfrastructureManagement::MainSchedule
//----------------------------------------------------------------------------------------------------
MainSchedule ObjectMainSchedule::toDdsData(const Database::IsmMountingPointSchedule &dbData)
{
MainSchedule ddsData;
ddsData.id(dbData.id);
ddsData.name(dbData.name.toStdString());
ddsData.statusId(dbData.statusId);
if (!dbData.timeStart.isNull() && dbData.timeStart.isValid() && dbData.timeStart.toMSecsSinceEpoch() > 0)
ddsData.timeStart(dbData.timeStart.toMSecsSinceEpoch());
if (!dbData.timeEnd.isNull() && dbData.timeEnd.isValid() && dbData.timeEnd.toMSecsSinceEpoch() > 0)
ddsData.timeEnd(dbData.timeEnd.toMSecsSinceEpoch());
ddsData.timeCreated(dbData.timeCreated.toMSecsSinceEpoch());
if (!dbData.exerciseId.isNull() && dbData.exerciseId.canConvert<int>())
ddsData.exerciseId(dbData.exerciseId.toInt());
// init data not in db
ddsData.isDeleted(false);
ddsData.isUsed(false);
return ddsData;
}
MountingPointPlan ObjectMainSchedule::toDdsData(const Database::IsmMountingPointPlan &dbData)
{
MountingPointPlan ddsData;
ddsData.mountingPointState(dbData.mountingPointState);
ddsData.structureElementId(dbData.structureElementId);
return ddsData;
}
// -------------------------------------------------------------------------------------------------------