bool ProcedureController::UpdateProcedure(const Procedure &procedure) { QSqlQuery procedureUpdate = GetDb().CreateQuery(); procedureUpdate.prepare("UPDATE \"Procedure\" " "SET \"Description\"=:description " "WHERE \"ProcedureId\"=:procedureId;"); procedureUpdate.bindValue(":procedureId", procedure.GetProcedureId()); procedureUpdate.bindValue(":description", procedure.GetDescription()); if(!procedureUpdate.exec()) { return false; } if(!procedure.IsTemplateProcedure()) { QSqlQuery projectProcedureUpdate = GetDb().CreateQuery(); projectProcedureUpdate.prepare("UPDATE \"ProjectProcedure\" " "SET \"IsDone\"=:isDone " "WHERE \"ProjectProcedureId\"=:projectProcedureId;"); projectProcedureUpdate.bindValue(":projectProcedureId", procedure.GetProjectProcedureId()); projectProcedureUpdate.bindValue(":isDone", procedure.GetDoneState() ? 1 : 0); if(!projectProcedureUpdate.exec()) { return false; } emit sigProcedureModified(procedure); } // Update linked project procedures from template. if(procedure.IsPureTemplateProcedure()) { qint32 templateProcedureId = procedure.GetProcedureId(); if(m_proceduresFromTemplate.count(templateProcedureId) != 0) { std::set<qint32> &procedureSet = m_proceduresFromTemplate.at(templateProcedureId); for(auto it = procedureSet.begin(); it != procedureSet.end(); it++) { qint32 projectProcedureId = *it; ProcedureCacheKey key(ProcedureType::PT_PROJECT, projectProcedureId); std::shared_ptr<Procedure> projectProcedure = m_cache.Lookup(key); if(!projectProcedure) { continue; } projectProcedure->SetDescription(procedure.GetDescription()); emit sigProcedureModified(*projectProcedure); } } emit sigProcedureModified(procedure); } return true; }