From 871775182103101d01b6cb910991fa3ee3209cbb Mon Sep 17 00:00:00 2001
From: Jorge Camarero Vera <jorge.camarero@cern.ch>
Date: Thu, 2 Feb 2023 15:18:23 +0100
Subject: [PATCH] Resolve "Trim SQL query length in catalogue DB failure
 reason"

---
 ReleaseNotes.md                               |  8 +++++++
 catalogue/rdbms/RdbmsAdminUserCatalogue.cpp   |  8 +++----
 .../rdbms/RdbmsArchiveRouteCatalogue.cpp      |  8 +++----
 catalogue/rdbms/RdbmsCatalogueUtils.cpp       | 13 +++++++-----
 catalogue/rdbms/RdbmsCatalogueUtils.hpp       |  3 ++-
 .../rdbms/RdbmsDiskInstanceCatalogue.cpp      |  8 +++----
 .../rdbms/RdbmsDiskInstanceSpaceCatalogue.cpp |  8 +++----
 catalogue/rdbms/RdbmsDiskSystemCatalogue.cpp  |  8 +++----
 catalogue/rdbms/RdbmsDriveStateCatalogue.cpp  |  6 +++---
 .../rdbms/RdbmsFileRecycleLogCatalogue.cpp    |  4 ++--
 .../rdbms/RdbmsLogicalLibraryCatalogue.cpp    | 13 ++++++------
 catalogue/rdbms/RdbmsMediaTypeCatalogue.cpp   |  8 +++----
 catalogue/rdbms/RdbmsMountPolicyCatalogue.cpp |  8 +++----
 ...bmsRequesterActivityMountRuleCatalogue.cpp |  8 +++----
 .../RdbmsRequesterGroupMountRuleCatalogue.cpp |  8 +++----
 .../RdbmsRequesterMountRuleCatalogue.cpp      |  8 +++----
 .../rdbms/RdbmsStorageClassCatalogue.cpp      |  8 +++----
 catalogue/rdbms/RdbmsTapeCatalogue.cpp        | 21 +++++++++----------
 catalogue/rdbms/RdbmsTapePoolCatalogue.cpp    |  8 +++----
 .../RdbmsVirtualOrganizationCatalogue.cpp     |  8 +++----
 20 files changed, 91 insertions(+), 81 deletions(-)

diff --git a/ReleaseNotes.md b/ReleaseNotes.md
index 18df0a8259..810f056b6c 100644
--- a/ReleaseNotes.md
+++ b/ReleaseNotes.md
@@ -1,3 +1,11 @@
+# v4.NEXT
+
+## Summary
+### Features
+- cta/CTA#250 - Trim SQL query length in catalogue DB failure reason
+### Bug Fixes
+### Continuous Integration
+
 # v4.8.5-1
 
 ## Summary
diff --git a/catalogue/rdbms/RdbmsAdminUserCatalogue.cpp b/catalogue/rdbms/RdbmsAdminUserCatalogue.cpp
index ff1b31a375..ebe73d3adb 100644
--- a/catalogue/rdbms/RdbmsAdminUserCatalogue.cpp
+++ b/catalogue/rdbms/RdbmsAdminUserCatalogue.cpp
@@ -47,7 +47,7 @@ void RdbmsAdminUserCatalogue::createAdminUser(
     if (comment.empty()) {
       throw UserSpecifiedAnEmptyStringComment("Cannot create admin user because the comment is an empty string");
     }
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
 
     auto conn = m_connPool->getConn();
     if (adminUserExists(conn, username)) {
@@ -84,7 +84,7 @@ void RdbmsAdminUserCatalogue::createAdminUser(
 
     stmt.bindString(":ADMIN_USER_NAME", username);
 
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
 
     stmt.bindString(":CREATION_LOG_USER_NAME", admin.username);
     stmt.bindString(":CREATION_LOG_HOST_NAME", admin.host);
@@ -200,7 +200,7 @@ void RdbmsAdminUserCatalogue::modifyAdminUserComment(const common::dataStructure
     if (comment.empty()) {
       throw UserSpecifiedAnEmptyStringComment("Cannot modify admin user because the comment is an empty string");
     }
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
 
     const time_t now = time(nullptr);
     const char *const sql =
@@ -213,7 +213,7 @@ void RdbmsAdminUserCatalogue::modifyAdminUserComment(const common::dataStructure
         "ADMIN_USER_NAME = :ADMIN_USER_NAME";
     auto conn = m_connPool->getConn();
     auto stmt = conn.createStmt(sql);
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
     stmt.bindString(":LAST_UPDATE_USER_NAME", admin.username);
     stmt.bindString(":LAST_UPDATE_HOST_NAME", admin.host);
     stmt.bindUint64(":LAST_UPDATE_TIME", now);
diff --git a/catalogue/rdbms/RdbmsArchiveRouteCatalogue.cpp b/catalogue/rdbms/RdbmsArchiveRouteCatalogue.cpp
index 46cc5fae2f..9dde06a35b 100644
--- a/catalogue/rdbms/RdbmsArchiveRouteCatalogue.cpp
+++ b/catalogue/rdbms/RdbmsArchiveRouteCatalogue.cpp
@@ -55,7 +55,7 @@ void RdbmsArchiveRouteCatalogue::createArchiveRoute(const common::dataStructures
     if(comment.empty()) {
       throw UserSpecifiedAnEmptyStringComment("Cannot create archive route because comment is an empty string");
     }
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
 
     const time_t now = time(nullptr);
     auto conn = m_connPool->getConn();
@@ -127,7 +127,7 @@ void RdbmsArchiveRouteCatalogue::createArchiveRoute(const common::dataStructures
     stmt.bindUint64(":COPY_NB", copyNb);
     stmt.bindString(":TAPE_POOL_NAME", tapePoolName);
 
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
 
     stmt.bindString(":CREATION_LOG_USER_NAME", admin.username);
     stmt.bindString(":CREATION_LOG_HOST_NAME", admin.host);
@@ -364,7 +364,7 @@ void RdbmsArchiveRouteCatalogue::modifyArchiveRouteTapePoolName(const common::da
 void RdbmsArchiveRouteCatalogue::modifyArchiveRouteComment(const common::dataStructures::SecurityIdentity &admin,
   const std::string &storageClassName, const uint32_t copyNb, const std::string &comment) {
   try {
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
     const time_t now = time(nullptr);
     const char *const sql =
       "UPDATE ARCHIVE_ROUTE SET "
@@ -383,7 +383,7 @@ void RdbmsArchiveRouteCatalogue::modifyArchiveRouteComment(const common::dataStr
         "COPY_NB = :COPY_NB";
     auto conn = m_connPool->getConn();
     auto stmt = conn.createStmt(sql);
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
     stmt.bindString(":LAST_UPDATE_USER_NAME", admin.username);
     stmt.bindString(":LAST_UPDATE_HOST_NAME", admin.host);
     stmt.bindUint64(":LAST_UPDATE_TIME", now);
diff --git a/catalogue/rdbms/RdbmsCatalogueUtils.cpp b/catalogue/rdbms/RdbmsCatalogueUtils.cpp
index b0e5fda3d6..13b97de3b0 100644
--- a/catalogue/rdbms/RdbmsCatalogueUtils.cpp
+++ b/catalogue/rdbms/RdbmsCatalogueUtils.cpp
@@ -51,17 +51,20 @@ bool RdbmsCatalogueUtils::diskSystemExists(rdbms::Conn &conn, const std::string
   }
 }
 
-void RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(const std::optional<std::string>& str, log::Logger* log) {
+std::optional<std::string> RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(const std::optional<std::string>& str,
+  log::Logger* log) {
   const size_t MAX_CHAR_COMMENT = 1000;
-  if (!str.has_value()) return;
+  if (!str.has_value()) return std::nullopt;
+  if (str.value().empty()) return std::nullopt;
   if (str.value().length() > MAX_CHAR_COMMENT) {
     log::LogContext lc(*log);
     log::ScopedParamContainer spc(lc);
     spc.add("Large_Message: ", str.value());
-    lc.log(log::ERR, "The reason or comment has more characters than the maximun allowed.");
-    throw CommentOrReasonWithMoreSizeThanMaximunAllowed(
-      "The comment or reason string value has more than 1000 characters");
+    lc.log(log::WARNING, "The reason or comment has more characters than the maximum allowed, 1000 characters."
+      " It will be truncated");
+    return str.value().substr(0, MAX_CHAR_COMMENT);
   }
+  return str;
 }
 
 bool RdbmsCatalogueUtils::storageClassExists(rdbms::Conn &conn, const std::string &storageClassName) {
diff --git a/catalogue/rdbms/RdbmsCatalogueUtils.hpp b/catalogue/rdbms/RdbmsCatalogueUtils.hpp
index 638cd2723f..b5ee9710ae 100644
--- a/catalogue/rdbms/RdbmsCatalogueUtils.hpp
+++ b/catalogue/rdbms/RdbmsCatalogueUtils.hpp
@@ -47,7 +47,8 @@ CTA_GENERATE_EXCEPTION_CLASS(CommentOrReasonWithMoreSizeThanMaximunAllowed);
 class RdbmsCatalogueUtils {
 public:
   static bool diskSystemExists(rdbms::Conn &conn, const std::string &name);
-  static void checkCommentOrReasonMaxLength(const std::optional<std::string>& str, log::Logger* log);
+  [[nodiscard]] static std::optional<std::string> checkCommentOrReasonMaxLength(const std::optional<std::string>& str,
+    log::Logger* log);
   static bool storageClassExists(rdbms::Conn &conn, const std::string &storageClassName);
   static bool virtualOrganizationExists(rdbms::Conn &conn, const std::string &voName);
   static bool mediaTypeExists(rdbms::Conn &conn, const std::string &name);
diff --git a/catalogue/rdbms/RdbmsDiskInstanceCatalogue.cpp b/catalogue/rdbms/RdbmsDiskInstanceCatalogue.cpp
index 4da97ff49e..e3ddf13211 100644
--- a/catalogue/rdbms/RdbmsDiskInstanceCatalogue.cpp
+++ b/catalogue/rdbms/RdbmsDiskInstanceCatalogue.cpp
@@ -42,7 +42,7 @@ void RdbmsDiskInstanceCatalogue::createDiskInstance(const common::dataStructures
     if(comment.empty()) {
       throw UserSpecifiedAnEmptyStringComment("Cannot create disk system because the comment is an empty string");
     }
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
 
     auto conn = m_connPool->getConn();
     if(RdbmsCatalogueUtils::diskInstanceExists(conn, name)) {
@@ -80,7 +80,7 @@ void RdbmsDiskInstanceCatalogue::createDiskInstance(const common::dataStructures
 
    stmt.bindString(":DISK_INSTANCE_NAME", name);
 
-   stmt.bindString(":USER_COMMENT", comment);
+   stmt.bindString(":USER_COMMENT", trimmedComment);
 
    stmt.bindString(":CREATION_LOG_USER_NAME", admin.username);
    stmt.bindString(":CREATION_LOG_HOST_NAME", admin.host);
@@ -140,7 +140,7 @@ void RdbmsDiskInstanceCatalogue::modifyDiskInstanceComment(const common::dataStr
       throw UserSpecifiedAnEmptyStringComment("Cannot modify disk instance "
         "because the new comment is an empty string");
     }
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
 
     const time_t now = time(nullptr);
     const char *const sql =
@@ -153,7 +153,7 @@ void RdbmsDiskInstanceCatalogue::modifyDiskInstanceComment(const common::dataStr
         "DISK_INSTANCE_NAME = :DISK_INSTANCE_NAME";
     auto conn = m_connPool->getConn();
     auto stmt = conn.createStmt(sql);
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
     stmt.bindString(":LAST_UPDATE_USER_NAME", admin.username);
     stmt.bindString(":LAST_UPDATE_HOST_NAME", admin.host);
     stmt.bindUint64(":LAST_UPDATE_TIME", now);
diff --git a/catalogue/rdbms/RdbmsDiskInstanceSpaceCatalogue.cpp b/catalogue/rdbms/RdbmsDiskInstanceSpaceCatalogue.cpp
index 51ecbadd43..e9346d1fbe 100644
--- a/catalogue/rdbms/RdbmsDiskInstanceSpaceCatalogue.cpp
+++ b/catalogue/rdbms/RdbmsDiskInstanceSpaceCatalogue.cpp
@@ -86,7 +86,7 @@ void RdbmsDiskInstanceSpaceCatalogue::createDiskInstanceSpace(const common::data
     if(comment.empty()) {
       throw UserSpecifiedAnEmptyStringComment("Cannot create disk instance space because the comment is an empty string");
     }
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
 
     auto conn = m_connPool->getConn();
     if(!RdbmsCatalogueUtils::diskInstanceExists(conn, diskInstance)) {
@@ -146,7 +146,7 @@ void RdbmsDiskInstanceSpaceCatalogue::createDiskInstanceSpace(const common::data
    stmt.bindUint64(":LAST_REFRESH_TIME", 0);
    stmt.bindUint64(":FREE_SPACE", 0);
 
-   stmt.bindString(":USER_COMMENT", comment);
+   stmt.bindString(":USER_COMMENT", trimmedComment);
 
    stmt.bindString(":CREATION_LOG_USER_NAME", admin.username);
    stmt.bindString(":CREATION_LOG_HOST_NAME", admin.host);
@@ -227,7 +227,7 @@ void RdbmsDiskInstanceSpaceCatalogue::modifyDiskInstanceSpaceComment(
       throw UserSpecifiedAnEmptyStringComment("Cannot modify disk instance space "
         "because the new comment is an empty string");
     }
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
     const time_t now = time(nullptr);
     const char *const sql =
       "UPDATE DISK_INSTANCE_SPACE SET "
@@ -241,7 +241,7 @@ void RdbmsDiskInstanceSpaceCatalogue::modifyDiskInstanceSpaceComment(
         "DISK_INSTANCE_SPACE_NAME = :DISK_INSTANCE_SPACE_NAME";
     auto conn = m_connPool->getConn();
     auto stmt = conn.createStmt(sql);
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
     stmt.bindString(":LAST_UPDATE_USER_NAME", admin.username);
     stmt.bindString(":LAST_UPDATE_HOST_NAME", admin.host);
     stmt.bindUint64(":LAST_UPDATE_TIME", now);
diff --git a/catalogue/rdbms/RdbmsDiskSystemCatalogue.cpp b/catalogue/rdbms/RdbmsDiskSystemCatalogue.cpp
index 83c4209164..93c95ef841 100644
--- a/catalogue/rdbms/RdbmsDiskSystemCatalogue.cpp
+++ b/catalogue/rdbms/RdbmsDiskSystemCatalogue.cpp
@@ -58,7 +58,7 @@ void RdbmsDiskSystemCatalogue::createDiskSystem(const common::dataStructures::Se
     if(comment.empty()) {
       throw UserSpecifiedAnEmptyStringComment("Cannot create disk system because the comment is an empty string");
     }
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
 
     auto conn = m_connPool->getConn();
     if(RdbmsCatalogueUtils::diskSystemExists(conn, name)) {
@@ -111,7 +111,7 @@ void RdbmsDiskSystemCatalogue::createDiskSystem(const common::dataStructures::Se
    stmt.bindUint64(":TARGETED_FREE_SPACE", targetedFreeSpace);
    stmt.bindUint64(":SLEEP_TIME", sleepTime);
 
-   stmt.bindString(":USER_COMMENT", comment);
+   stmt.bindString(":USER_COMMENT", trimmedComment);
 
    stmt.bindString(":CREATION_LOG_USER_NAME", admin.username);
    stmt.bindString(":CREATION_LOG_HOST_NAME", admin.host);
@@ -321,7 +321,7 @@ void RdbmsDiskSystemCatalogue::modifyDiskSystemComment(const common::dataStructu
       throw UserSpecifiedAnEmptyStringComment("Cannot modify disk system "
         "because the new comment is an empty string");
     }
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
 
     const time_t now = time(nullptr);
     const char *const sql =
@@ -334,7 +334,7 @@ void RdbmsDiskSystemCatalogue::modifyDiskSystemComment(const common::dataStructu
         "DISK_SYSTEM_NAME = :DISK_SYSTEM_NAME";
     auto conn = m_connPool->getConn();
     auto stmt = conn.createStmt(sql);
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
     stmt.bindString(":LAST_UPDATE_USER_NAME", admin.username);
     stmt.bindString(":LAST_UPDATE_HOST_NAME", admin.host);
     stmt.bindUint64(":LAST_UPDATE_TIME", now);
diff --git a/catalogue/rdbms/RdbmsDriveStateCatalogue.cpp b/catalogue/rdbms/RdbmsDriveStateCatalogue.cpp
index ed144736d7..0a39bc73c2 100644
--- a/catalogue/rdbms/RdbmsDriveStateCatalogue.cpp
+++ b/catalogue/rdbms/RdbmsDriveStateCatalogue.cpp
@@ -609,7 +609,7 @@ std::optional<common::dataStructures::TapeDrive> RdbmsDriveStateCatalogue::getTa
 void RdbmsDriveStateCatalogue::setDesiredTapeDriveState(const std::string& tapeDriveName,
   const common::dataStructures::DesiredDriveState &desiredState) {
   try {
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(desiredState.reason, &m_log);
+    const auto trimmedReason = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(desiredState.reason, &m_log);
     std::string sql =
       "UPDATE DRIVE_STATE SET "
         "DESIRED_UP = :DESIRED_UP,"
@@ -630,8 +630,8 @@ void RdbmsDriveStateCatalogue::setDesiredTapeDriveState(const std::string& tapeD
     stmt.bindString(":DRIVE_NAME", tapeDriveName);
     stmt.bindBool(":DESIRED_UP", desiredState.up);
     stmt.bindBool(":DESIRED_FORCE_DOWN", desiredState.forceDown);
-    if (desiredState.reason && !desiredState.reason.value().empty()) {
-      stmt.bindString(":REASON_UP_DOWN", desiredState.reason.value());
+    if (trimmedReason&& !trimmedReason.value().empty()) {
+      stmt.bindString(":REASON_UP_DOWN", trimmedReason.value());
     }
     stmt.executeNonQuery();
 
diff --git a/catalogue/rdbms/RdbmsFileRecycleLogCatalogue.cpp b/catalogue/rdbms/RdbmsFileRecycleLogCatalogue.cpp
index 8da3d6387e..c5db93d129 100644
--- a/catalogue/rdbms/RdbmsFileRecycleLogCatalogue.cpp
+++ b/catalogue/rdbms/RdbmsFileRecycleLogCatalogue.cpp
@@ -230,7 +230,7 @@ void RdbmsFileRecycleLogCatalogue::deleteTapeFileCopyFromRecycleBin(cta::rdbms::
 void RdbmsFileRecycleLogCatalogue::insertFileInFileRecycleLog(rdbms::Conn& conn,
   const InsertFileRecycleLog& fileRecycleLog) const {
   try{
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(fileRecycleLog.reasonLog, &m_log);
+    const auto trimmedReason = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(fileRecycleLog.reasonLog, &m_log);
     uint64_t fileRecycleLogId = getNextFileRecyleLogId(conn);
     const char *const sql =
     "INSERT INTO FILE_RECYCLE_LOG("
@@ -292,7 +292,7 @@ void RdbmsFileRecycleLogCatalogue::insertFileInFileRecycleLog(rdbms::Conn& conn,
     stmt.bindUint64(":TAPE_FILE_CREATION_TIME",fileRecycleLog.tapeFileCreationTime);
     stmt.bindString(":DISK_FILE_PATH",fileRecycleLog.diskFilePath);
     stmt.bindUint64(":ARCHIVE_FILE_ID",fileRecycleLog.archiveFileId);
-    stmt.bindString(":REASON_LOG",fileRecycleLog.reasonLog);
+    stmt.bindString(":REASON_LOG",trimmedReason);
     stmt.bindUint64(":RECYCLE_LOG_TIME",fileRecycleLog.recycleLogTime);
     stmt.bindUint64(":ARCHIVE_FILE_ID_2",fileRecycleLog.archiveFileId);
     stmt.executeNonQuery();
diff --git a/catalogue/rdbms/RdbmsLogicalLibraryCatalogue.cpp b/catalogue/rdbms/RdbmsLogicalLibraryCatalogue.cpp
index 8be68dea41..f124f06ca9 100644
--- a/catalogue/rdbms/RdbmsLogicalLibraryCatalogue.cpp
+++ b/catalogue/rdbms/RdbmsLogicalLibraryCatalogue.cpp
@@ -40,7 +40,7 @@ RdbmsLogicalLibraryCatalogue::RdbmsLogicalLibraryCatalogue(log::Logger &log, std
 void RdbmsLogicalLibraryCatalogue::createLogicalLibrary(const common::dataStructures::SecurityIdentity &admin,
   const std::string &name, const bool isDisabled, const std::string &comment) {
   try {
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
     auto conn = m_connPool->getConn();
     if(RdbmsCatalogueUtils::logicalLibraryExists(conn, name)) {
       throw exception::UserError(std::string("Cannot create logical library ") + name +
@@ -83,7 +83,7 @@ void RdbmsLogicalLibraryCatalogue::createLogicalLibrary(const common::dataStruct
     stmt.bindString(":LOGICAL_LIBRARY_NAME", name);
     stmt.bindBool(":IS_DISABLED", isDisabled);
 
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
 
     stmt.bindString(":CREATION_LOG_USER_NAME", admin.username);
     stmt.bindString(":CREATION_LOG_HOST_NAME", admin.host);
@@ -236,7 +236,7 @@ void RdbmsLogicalLibraryCatalogue::modifyLogicalLibraryName(const common::dataSt
 void RdbmsLogicalLibraryCatalogue::modifyLogicalLibraryComment(const common::dataStructures::SecurityIdentity &admin,
   const std::string &name, const std::string &comment) {
   try {
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
     const time_t now = time(nullptr);
     const char *const sql =
       "UPDATE LOGICAL_LIBRARY SET "
@@ -248,7 +248,7 @@ void RdbmsLogicalLibraryCatalogue::modifyLogicalLibraryComment(const common::dat
         "LOGICAL_LIBRARY_NAME = :LOGICAL_LIBRARY_NAME";
     auto conn = m_connPool->getConn();
     auto stmt = conn.createStmt(sql);
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
     stmt.bindString(":LAST_UPDATE_USER_NAME", admin.username);
     stmt.bindString(":LAST_UPDATE_HOST_NAME", admin.host);
     stmt.bindUint64(":LAST_UPDATE_TIME", now);
@@ -269,7 +269,7 @@ void RdbmsLogicalLibraryCatalogue::modifyLogicalLibraryComment(const common::dat
 void RdbmsLogicalLibraryCatalogue::modifyLogicalLibraryDisabledReason(
   const common::dataStructures::SecurityIdentity &admin, const std::string &name, const std::string &disabledReason) {
   try {
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(disabledReason, &m_log);
+    const auto trimmedReason = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(disabledReason, &m_log);
     const time_t now = time(nullptr);
     const char *const sql =
       "UPDATE LOGICAL_LIBRARY SET "
@@ -281,8 +281,7 @@ void RdbmsLogicalLibraryCatalogue::modifyLogicalLibraryDisabledReason(
         "LOGICAL_LIBRARY_NAME = :LOGICAL_LIBRARY_NAME";
     auto conn = m_connPool->getConn();
     auto stmt = conn.createStmt(sql);
-    stmt.bindString(":DISABLED_REASON",
-      disabledReason.empty() ? std::nullopt : std::optional<std::string>(disabledReason));
+    stmt.bindString(":DISABLED_REASON", trimmedReason);
     stmt.bindString(":LAST_UPDATE_USER_NAME", admin.username);
     stmt.bindString(":LAST_UPDATE_HOST_NAME", admin.host);
     stmt.bindUint64(":LAST_UPDATE_TIME", now);
diff --git a/catalogue/rdbms/RdbmsMediaTypeCatalogue.cpp b/catalogue/rdbms/RdbmsMediaTypeCatalogue.cpp
index 55fe09a493..d41b431e7d 100644
--- a/catalogue/rdbms/RdbmsMediaTypeCatalogue.cpp
+++ b/catalogue/rdbms/RdbmsMediaTypeCatalogue.cpp
@@ -51,7 +51,7 @@ void RdbmsMediaTypeCatalogue::createMediaType(const common::dataStructures::Secu
       throw UserSpecifiedAnEmptyStringComment(std::string("Cannot create media type ") + mediaType.name +
         " because the comment is an empty string");
     }
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(mediaType.comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(mediaType.comment, &m_log);
     if (mediaType.capacityInBytes == 0){
       throw UserSpecifiedAZeroCapacity(std::string("Cannot create media type ") + mediaType.name
         + " because the capacity is zero");
@@ -116,7 +116,7 @@ void RdbmsMediaTypeCatalogue::createMediaType(const common::dataStructures::Secu
     stmt.bindUint64(":MIN_LPOS", mediaType.minLPos);
     stmt.bindUint64(":MAX_LPOS", mediaType.maxLPos);
 
-    stmt.bindString(":USER_COMMENT", mediaType.comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
 
     stmt.bindString(":CREATION_LOG_USER_NAME", admin.username);
     stmt.bindString(":CREATION_LOG_HOST_NAME", admin.host);
@@ -541,7 +541,7 @@ void RdbmsMediaTypeCatalogue::modifyMediaTypeMaxLPos(const common::dataStructure
 void RdbmsMediaTypeCatalogue::modifyMediaTypeComment(const common::dataStructures::SecurityIdentity &admin,
   const std::string &name, const std::string &comment) {
   try {
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
     const time_t now = time(nullptr);
     const char *const sql =
       "UPDATE MEDIA_TYPE SET "
@@ -553,7 +553,7 @@ void RdbmsMediaTypeCatalogue::modifyMediaTypeComment(const common::dataStructure
         "MEDIA_TYPE_NAME = :MEDIA_TYPE_NAME";
     auto conn = m_connPool->getConn();
     auto stmt = conn.createStmt(sql);
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
     stmt.bindString(":LAST_UPDATE_USER_NAME", admin.username);
     stmt.bindString(":LAST_UPDATE_HOST_NAME", admin.host);
     stmt.bindUint64(":LAST_UPDATE_TIME", now);
diff --git a/catalogue/rdbms/RdbmsMountPolicyCatalogue.cpp b/catalogue/rdbms/RdbmsMountPolicyCatalogue.cpp
index b494941223..114e58366c 100644
--- a/catalogue/rdbms/RdbmsMountPolicyCatalogue.cpp
+++ b/catalogue/rdbms/RdbmsMountPolicyCatalogue.cpp
@@ -41,7 +41,7 @@ void RdbmsMountPolicyCatalogue::createMountPolicy(const common::dataStructures::
   const CreateMountPolicyAttributes & mountPolicy) {
   std::string name = mountPolicy.name;
   try {
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(mountPolicy.comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(mountPolicy.comment, &m_log);
     auto conn = m_connPool->getConn();
     if (RdbmsCatalogueUtils::mountPolicyExists(conn, name)) {
       throw exception::UserError(std::string("Cannot create mount policy ") + name +
@@ -95,7 +95,7 @@ void RdbmsMountPolicyCatalogue::createMountPolicy(const common::dataStructures::
     stmt.bindUint64(":RETRIEVE_PRIORITY", mountPolicy.retrievePriority);
     stmt.bindUint64(":RETRIEVE_MIN_REQUEST_AGE", mountPolicy.minRetrieveRequestAge);
 
-    stmt.bindString(":USER_COMMENT", mountPolicy.comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
 
     stmt.bindString(":CREATION_LOG_USER_NAME", admin.username);
     stmt.bindString(":CREATION_LOG_HOST_NAME", admin.host);
@@ -448,7 +448,7 @@ void RdbmsMountPolicyCatalogue::modifyMountPolicyRetrieveMinRequestAge(const com
 void RdbmsMountPolicyCatalogue::modifyMountPolicyComment(const common::dataStructures::SecurityIdentity &admin,
   const std::string &name, const std::string &comment) {
   try {
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
     const time_t now = time(nullptr);
     const char *const sql =
       "UPDATE MOUNT_POLICY SET "
@@ -460,7 +460,7 @@ void RdbmsMountPolicyCatalogue::modifyMountPolicyComment(const common::dataStruc
         "MOUNT_POLICY_NAME = :MOUNT_POLICY_NAME";
     auto conn = m_connPool->getConn();
     auto stmt = conn.createStmt(sql);
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
     stmt.bindString(":LAST_UPDATE_USER_NAME", admin.username);
     stmt.bindString(":LAST_UPDATE_HOST_NAME", admin.host);
     stmt.bindUint64(":LAST_UPDATE_TIME", now);
diff --git a/catalogue/rdbms/RdbmsRequesterActivityMountRuleCatalogue.cpp b/catalogue/rdbms/RdbmsRequesterActivityMountRuleCatalogue.cpp
index e086d471f6..9c9fc0394a 100644
--- a/catalogue/rdbms/RdbmsRequesterActivityMountRuleCatalogue.cpp
+++ b/catalogue/rdbms/RdbmsRequesterActivityMountRuleCatalogue.cpp
@@ -75,7 +75,7 @@ void RdbmsRequesterActivityMountRuleCatalogue::modifyRequesterActivityMountRuleC
   const common::dataStructures::SecurityIdentity &admin, const std::string &instanceName,
   const std::string &requesterName, const std::string &activityRegex, const std::string &comment) {
   try {
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
     const time_t now = time(nullptr);
     const char *const sql =
       "UPDATE REQUESTER_ACTIVITY_MOUNT_RULE SET "
@@ -89,7 +89,7 @@ void RdbmsRequesterActivityMountRuleCatalogue::modifyRequesterActivityMountRuleC
         "ACTIVITY_REGEX = :ACTIVITY_REGEX";
     auto conn = m_connPool->getConn();
     auto stmt = conn.createStmt(sql);
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
     stmt.bindString(":LAST_UPDATE_USER_NAME", admin.username);
     stmt.bindString(":LAST_UPDATE_HOST_NAME", admin.host);
     stmt.bindUint64(":LAST_UPDATE_TIME", now);
@@ -115,7 +115,7 @@ void RdbmsRequesterActivityMountRuleCatalogue::createRequesterActivityMountRule(
   const std::string &mountPolicyName, const std::string &diskInstanceName, const std::string &requesterName,
   const std::string &activityRegex, const std::string &comment) {
    try {
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
     auto conn = m_connPool->getConn();
     if(RdbmsCatalogueUtils::requesterActivityMountRuleExists(conn, diskInstanceName, requesterName, activityRegex)) {
       throw exception::UserError(std::string("Cannot create rule to assign mount-policy ") + mountPolicyName +
@@ -172,7 +172,7 @@ void RdbmsRequesterActivityMountRuleCatalogue::createRequesterActivityMountRule(
     stmt.bindString(":MOUNT_POLICY_NAME", mountPolicyName);
     stmt.bindString(":ACTIVITY_REGEX", activityRegex);
 
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
 
     stmt.bindString(":CREATION_LOG_USER_NAME", admin.username);
     stmt.bindString(":CREATION_LOG_HOST_NAME", admin.host);
diff --git a/catalogue/rdbms/RdbmsRequesterGroupMountRuleCatalogue.cpp b/catalogue/rdbms/RdbmsRequesterGroupMountRuleCatalogue.cpp
index a5f6036177..8c69d63115 100644
--- a/catalogue/rdbms/RdbmsRequesterGroupMountRuleCatalogue.cpp
+++ b/catalogue/rdbms/RdbmsRequesterGroupMountRuleCatalogue.cpp
@@ -74,7 +74,7 @@ void RdbmsRequesterGroupMountRuleCatalogue::modifyRequesterGroupMountRuleComment
   const common::dataStructures::SecurityIdentity &admin, const std::string &instanceName,
   const std::string &requesterGroupName, const std::string &comment) {
   try {
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
     const time_t now = time(nullptr);
     const char *const sql =
       "UPDATE REQUESTER_GROUP_MOUNT_RULE SET "
@@ -87,7 +87,7 @@ void RdbmsRequesterGroupMountRuleCatalogue::modifyRequesterGroupMountRuleComment
         "REQUESTER_GROUP_NAME = :REQUESTER_GROUP_NAME";
     auto conn = m_connPool->getConn();
     auto stmt = conn.createStmt(sql);
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
     stmt.bindString(":LAST_UPDATE_USER_NAME", admin.username);
     stmt.bindString(":LAST_UPDATE_HOST_NAME", admin.host);
     stmt.bindUint64(":LAST_UPDATE_TIME", now);
@@ -114,7 +114,7 @@ void RdbmsRequesterGroupMountRuleCatalogue::createRequesterGroupMountRule(
   const std::string &requesterGroupName,
   const std::string &comment) {
   try {
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
     auto conn = m_connPool->getConn();
     {
       const auto group = Group(diskInstanceName, requesterGroupName);
@@ -172,7 +172,7 @@ void RdbmsRequesterGroupMountRuleCatalogue::createRequesterGroupMountRule(
     stmt.bindString(":REQUESTER_GROUP_NAME", requesterGroupName);
     stmt.bindString(":MOUNT_POLICY_NAME", mountPolicyName);
 
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
 
     stmt.bindString(":CREATION_LOG_USER_NAME", admin.username);
     stmt.bindString(":CREATION_LOG_HOST_NAME", admin.host);
diff --git a/catalogue/rdbms/RdbmsRequesterMountRuleCatalogue.cpp b/catalogue/rdbms/RdbmsRequesterMountRuleCatalogue.cpp
index 90f2dfe967..6a0cb3e505 100644
--- a/catalogue/rdbms/RdbmsRequesterMountRuleCatalogue.cpp
+++ b/catalogue/rdbms/RdbmsRequesterMountRuleCatalogue.cpp
@@ -74,7 +74,7 @@ void RdbmsRequesterMountRuleCatalogue::modifyRequesteMountRuleComment(
   const common::dataStructures::SecurityIdentity &admin, const std::string &instanceName,
   const std::string &requesterName, const std::string &comment) {
   try {
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
     const time_t now = time(nullptr);
     const char *const sql =
       "UPDATE REQUESTER_MOUNT_RULE SET "
@@ -87,7 +87,7 @@ void RdbmsRequesterMountRuleCatalogue::modifyRequesteMountRuleComment(
         "REQUESTER_NAME = :REQUESTER_NAME";
     auto conn = m_connPool->getConn();
     auto stmt = conn.createStmt(sql);
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
     stmt.bindString(":LAST_UPDATE_USER_NAME", admin.username);
     stmt.bindString(":LAST_UPDATE_HOST_NAME", admin.host);
     stmt.bindUint64(":LAST_UPDATE_TIME", now);
@@ -111,7 +111,7 @@ void RdbmsRequesterMountRuleCatalogue::createRequesterMountRule(const common::da
   const std::string &mountPolicyName, const std::string &diskInstanceName, const std::string &requesterName,
   const std::string &comment) {
   try {
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
     const auto user = User(diskInstanceName, requesterName);
     auto conn = m_connPool->getConn();
     const auto mountPolicyCatalogue = static_cast<RdbmsMountPolicyCatalogue*>(m_rdbmsCatalogue->MountPolicy().get());
@@ -168,7 +168,7 @@ void RdbmsRequesterMountRuleCatalogue::createRequesterMountRule(const common::da
     stmt.bindString(":REQUESTER_NAME", requesterName);
     stmt.bindString(":MOUNT_POLICY_NAME", mountPolicyName);
 
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
 
     stmt.bindString(":CREATION_LOG_USER_NAME", admin.username);
     stmt.bindString(":CREATION_LOG_HOST_NAME", admin.host);
diff --git a/catalogue/rdbms/RdbmsStorageClassCatalogue.cpp b/catalogue/rdbms/RdbmsStorageClassCatalogue.cpp
index 738088a698..5d072f07d7 100644
--- a/catalogue/rdbms/RdbmsStorageClassCatalogue.cpp
+++ b/catalogue/rdbms/RdbmsStorageClassCatalogue.cpp
@@ -50,7 +50,7 @@ void RdbmsStorageClassCatalogue::createStorageClass(
     if (storageClass.comment.empty()) {
       throw UserSpecifiedAnEmptyStringComment("Cannot create storage class because the comment is an empty string");
     }
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(storageClass.comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(storageClass.comment, &m_log);
     std::string vo = storageClass.vo.name;
 
     if(vo.empty()) {
@@ -106,7 +106,7 @@ void RdbmsStorageClassCatalogue::createStorageClass(
     stmt.bindUint64(":NB_COPIES", storageClass.nbCopies);
     stmt.bindString(":VO",vo);
 
-    stmt.bindString(":USER_COMMENT", storageClass.comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
 
     stmt.bindString(":CREATION_LOG_USER_NAME", admin.username);
     stmt.bindString(":CREATION_LOG_HOST_NAME", admin.host);
@@ -310,7 +310,7 @@ void RdbmsStorageClassCatalogue::modifyStorageClassNbCopies(const common::dataSt
 void RdbmsStorageClassCatalogue::modifyStorageClassComment(const common::dataStructures::SecurityIdentity &admin,
   const std::string &name, const std::string &comment) {
   try {
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
 
     const time_t now = time(nullptr);
     const char *const sql =
@@ -323,7 +323,7 @@ void RdbmsStorageClassCatalogue::modifyStorageClassComment(const common::dataStr
         "STORAGE_CLASS_NAME = :STORAGE_CLASS_NAME";
     auto conn = m_connPool->getConn();
     auto stmt = conn.createStmt(sql);
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
     stmt.bindString(":LAST_UPDATE_USER_NAME", admin.username);
     stmt.bindString(":LAST_UPDATE_HOST_NAME", admin.host);
     stmt.bindUint64(":LAST_UPDATE_TIME", now);
diff --git a/catalogue/rdbms/RdbmsTapeCatalogue.cpp b/catalogue/rdbms/RdbmsTapeCatalogue.cpp
index 7a792c01b4..1d78c2863b 100644
--- a/catalogue/rdbms/RdbmsTapeCatalogue.cpp
+++ b/catalogue/rdbms/RdbmsTapeCatalogue.cpp
@@ -64,10 +64,10 @@ void RdbmsTapeCatalogue::createTape(const common::dataStructures::SecurityIdenti
     bool full = tape.full;
     // Translate an empty comment string to a NULL database value
     const std::optional<std::string> tapeComment = tape.comment && tape.comment->empty() ? std::nullopt : tape.comment;
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(tapeComment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(tapeComment, &m_log);
     const std::optional<std::string> stateReason = tape.stateReason
       && cta::utils::trimString(tape.stateReason.value()).empty() ? std::nullopt : tape.stateReason;
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(stateReason, &m_log);
+    const auto trimmedReason = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(stateReason, &m_log);
     if(vid.empty()) {
       throw UserSpecifiedAnEmptyStringVid("Cannot create tape because the VID is an empty string");
     }
@@ -197,11 +197,11 @@ void RdbmsTapeCatalogue::createTape(const common::dataStructures::SecurityIdenti
     stmt.bindBool(":IS_FULL", full);
     stmt.bindBool(":IS_FROM_CASTOR", isFromCastor);
 
-    stmt.bindString(":USER_COMMENT", tapeComment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
 
     std::string stateModifiedBy = RdbmsCatalogueUtils::generateTapeStateModifiedBy(admin);
     stmt.bindString(":TAPE_STATE",cta::common::dataStructures::Tape::stateToString(tape.state));
-    stmt.bindString(":STATE_REASON",stateReason);
+    stmt.bindString(":STATE_REASON",trimmedReason);
     stmt.bindUint64(":STATE_UPDATE_TIME",now);
     stmt.bindString(":STATE_MODIFIED_BY", stateModifiedBy);
 
@@ -857,8 +857,7 @@ void RdbmsTapeCatalogue::modifyTapeState(const common::dataStructures::SecurityI
     using namespace common::dataStructures;
     const time_t now = time(nullptr);
 
-    const std::optional<std::string> stateReasonCopy = stateReason && cta::utils::trimString(stateReason.value()).empty() ? std::nullopt : stateReason;
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(stateReasonCopy, &m_log);
+    const auto trimmedReason = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(stateReason, &m_log);
 
     std::string stateStr;
     try {
@@ -880,7 +879,7 @@ void RdbmsTapeCatalogue::modifyTapeState(const common::dataStructures::SecurityI
 
     //Check the reason is set for all the status except the ACTIVE one, this is the only state that allows the reason to be set to null.
     if(state != Tape::State::ACTIVE){
-      if(!stateReasonCopy){
+      if(!trimmedReason){
         throw UserSpecifiedAnEmptyStringReasonWhenTapeStateNotActive(std::string("Cannot modify the state of the tape ") + vid + " to " + stateStr + " because the reason has not been provided.");
       }
     }
@@ -902,7 +901,7 @@ void RdbmsTapeCatalogue::modifyTapeState(const common::dataStructures::SecurityI
     auto stmt = conn.createStmt(sql);
 
     stmt.bindString(":TAPE_STATE", stateStr);
-    stmt.bindString(":STATE_REASON", stateReasonCopy);
+    stmt.bindString(":STATE_REASON", trimmedReason);
     stmt.bindUint64(":STATE_UPDATE_TIME", now);
     stmt.bindString(":STATE_MODIFIED_BY", RdbmsCatalogueUtils::generateTapeStateModifiedBy(admin));
     stmt.bindString(":VID",vid);
@@ -1183,7 +1182,7 @@ void RdbmsTapeCatalogue::setTapeDirty(const std::string & vid) {
 void RdbmsTapeCatalogue::modifyTapeComment(const common::dataStructures::SecurityIdentity &admin,
   const std::string &vid, const std::optional<std::string> &comment) {
   try {
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
     const time_t now = time(nullptr);
     const char *const sql =
       "UPDATE TAPE SET "
@@ -1195,7 +1194,7 @@ void RdbmsTapeCatalogue::modifyTapeComment(const common::dataStructures::Securit
         "VID = :VID";
     auto conn = m_connPool->getConn();
     auto stmt = conn.createStmt(sql);
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
     stmt.bindString(":LAST_UPDATE_USER_NAME", admin.username);
     stmt.bindString(":LAST_UPDATE_HOST_NAME", admin.host);
     stmt.bindUint64(":LAST_UPDATE_TIME", now);
@@ -1210,7 +1209,7 @@ void RdbmsTapeCatalogue::modifyTapeComment(const common::dataStructures::Securit
     log::LogContext lc(m_log);
     log::ScopedParamContainer spc(lc);
     spc.add("vid", vid)
-       .add("userComment", comment ? comment.value() : "")
+       .add("userComment", trimmedComment ? trimmedComment.value() : "")
        .add("lastUpdateUserName", admin.username)
        .add("lastUpdateHostName", admin.host)
        .add("lastUpdateTime", now);
diff --git a/catalogue/rdbms/RdbmsTapePoolCatalogue.cpp b/catalogue/rdbms/RdbmsTapePoolCatalogue.cpp
index 58f181cb51..62a7cfa320 100644
--- a/catalogue/rdbms/RdbmsTapePoolCatalogue.cpp
+++ b/catalogue/rdbms/RdbmsTapePoolCatalogue.cpp
@@ -56,7 +56,7 @@ void RdbmsTapePoolCatalogue::createTapePool(const common::dataStructures::Securi
     if (comment.empty()) {
       throw UserSpecifiedAnEmptyStringComment("Cannot create tape pool because the comment is an empty string");
     }
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
 
     auto conn = m_connPool->getConn();
 
@@ -118,7 +118,7 @@ void RdbmsTapePoolCatalogue::createTapePool(const common::dataStructures::Securi
     stmt.bindBool(":IS_ENCRYPTED", encryptionValue);
     stmt.bindString(":SUPPLY", supply);
 
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
 
     stmt.bindString(":CREATION_LOG_USER_NAME", admin.username);
     stmt.bindString(":CREATION_LOG_HOST_NAME", admin.host);
@@ -524,7 +524,7 @@ void RdbmsTapePoolCatalogue::modifyTapePoolComment(const common::dataStructures:
     if(comment.empty()) {
       throw UserSpecifiedAnEmptyStringComment("Cannot modify tape pool because the new comment is an empty string");
     }
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
 
     const time_t now = time(nullptr);
     const char *const sql =
@@ -537,7 +537,7 @@ void RdbmsTapePoolCatalogue::modifyTapePoolComment(const common::dataStructures:
         "TAPE_POOL_NAME = :TAPE_POOL_NAME";
     auto conn = m_connPool->getConn();
     auto stmt = conn.createStmt(sql);
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
     stmt.bindString(":LAST_UPDATE_USER_NAME", admin.username);
     stmt.bindString(":LAST_UPDATE_HOST_NAME", admin.host);
     stmt.bindUint64(":LAST_UPDATE_TIME", now);
diff --git a/catalogue/rdbms/RdbmsVirtualOrganizationCatalogue.cpp b/catalogue/rdbms/RdbmsVirtualOrganizationCatalogue.cpp
index b9d5da8194..6afa12fe53 100644
--- a/catalogue/rdbms/RdbmsVirtualOrganizationCatalogue.cpp
+++ b/catalogue/rdbms/RdbmsVirtualOrganizationCatalogue.cpp
@@ -46,7 +46,7 @@ void RdbmsVirtualOrganizationCatalogue::createVirtualOrganization(const common::
     if (vo.comment.empty()) {
       throw UserSpecifiedAnEmptyStringComment("Cannot create virtual organization because the comment is an empty string");
     }
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(vo.comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(vo.comment, &m_log);
     if (vo.diskInstanceName.empty()) {
       throw UserSpecifiedAnEmptyStringDiskInstanceName("Cannot create virtual organization because the disk instance is an empty string");
     }
@@ -107,7 +107,7 @@ void RdbmsVirtualOrganizationCatalogue::createVirtualOrganization(const common::
 
     stmt.bindString(":DISK_INSTANCE_NAME", vo.diskInstanceName);
 
-    stmt.bindString(":USER_COMMENT", vo.comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
 
     stmt.bindString(":CREATION_LOG_USER_NAME", admin.username);
     stmt.bindString(":CREATION_LOG_HOST_NAME", admin.host);
@@ -468,7 +468,7 @@ void RdbmsVirtualOrganizationCatalogue::modifyVirtualOrganizationMaxFileSize(
 void RdbmsVirtualOrganizationCatalogue::modifyVirtualOrganizationComment(
   const common::dataStructures::SecurityIdentity &admin, const std::string &voName, const std::string &comment) {
   try {
-    RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
+    const auto trimmedComment = RdbmsCatalogueUtils::checkCommentOrReasonMaxLength(comment, &m_log);
     const time_t now = time(nullptr);
     const char *const sql =
       "UPDATE VIRTUAL_ORGANIZATION SET "
@@ -481,7 +481,7 @@ void RdbmsVirtualOrganizationCatalogue::modifyVirtualOrganizationComment(
     auto conn = m_connPool->getConn();
 
     auto stmt = conn.createStmt(sql);
-    stmt.bindString(":USER_COMMENT", comment);
+    stmt.bindString(":USER_COMMENT", trimmedComment);
     stmt.bindString(":LAST_UPDATE_USER_NAME", admin.username);
     stmt.bindString(":LAST_UPDATE_HOST_NAME", admin.host);
     stmt.bindUint64(":LAST_UPDATE_TIME", now);
-- 
GitLab