From 57b5f3fdbc97bffeff41fbf6f6d4ec892e639483 Mon Sep 17 00:00:00 2001 From: Steven Murray <steven.murray@cern.ch> Date: Wed, 3 Aug 2016 11:03:10 +0200 Subject: [PATCH] Added RdbmsCatalogue::modifyStorageClassComment() --- catalogue/CatalogueTest.cpp | 52 ++++++++++++++++++++++++++++++++++++ catalogue/RdbmsCatalogue.cpp | 27 +++++++++++++++++-- 2 files changed, 77 insertions(+), 2 deletions(-) diff --git a/catalogue/CatalogueTest.cpp b/catalogue/CatalogueTest.cpp index bfcea3063d..d015e5d6d2 100644 --- a/catalogue/CatalogueTest.cpp +++ b/catalogue/CatalogueTest.cpp @@ -854,6 +854,58 @@ TEST_P(cta_catalogue_CatalogueTest, modifyStorageClassNbCopies) { } } +TEST_P(cta_catalogue_CatalogueTest, modifyStorageClassComment) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getStorageClasses().empty()); + + common::dataStructures::StorageClass storageClass; + storageClass.diskInstance = "disk_instance"; + storageClass.name = "storage_class"; + storageClass.nbCopies = 2; + storageClass.comment = "Create storage class"; + m_catalogue->createStorageClass(m_cliSI, storageClass); + + { + const std::list<common::dataStructures::StorageClass> storageClasses = m_catalogue->getStorageClasses(); + + ASSERT_EQ(1, storageClasses.size()); + + ASSERT_EQ(storageClass.diskInstance, storageClasses.front().diskInstance); + ASSERT_EQ(storageClass.name, storageClasses.front().name); + ASSERT_EQ(storageClass.nbCopies, storageClasses.front().nbCopies); + ASSERT_EQ(storageClass.comment, storageClasses.front().comment); + + const common::dataStructures::EntryLog creationLog = storageClasses.front().creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = storageClasses.front().lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + + const std::string modifiedComment = "Modified comment"; + m_catalogue->modifyStorageClassComment(m_cliSI, storageClass.diskInstance, storageClass.name, modifiedComment); + + { + const std::list<common::dataStructures::StorageClass> storageClasses = m_catalogue->getStorageClasses(); + + ASSERT_EQ(1, storageClasses.size()); + + ASSERT_EQ(storageClass.diskInstance, storageClasses.front().diskInstance); + ASSERT_EQ(storageClass.name, storageClasses.front().name); + ASSERT_EQ(storageClass.nbCopies, storageClasses.front().nbCopies); + ASSERT_EQ(modifiedComment, storageClasses.front().comment); + + const common::dataStructures::EntryLog creationLog = storageClasses.front().creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = storageClasses.front().lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } +} + TEST_P(cta_catalogue_CatalogueTest, createTapePool) { using namespace cta; diff --git a/catalogue/RdbmsCatalogue.cpp b/catalogue/RdbmsCatalogue.cpp index cf79f5c94c..9a3ac7b587 100644 --- a/catalogue/RdbmsCatalogue.cpp +++ b/catalogue/RdbmsCatalogue.cpp @@ -621,8 +621,31 @@ void RdbmsCatalogue::modifyStorageClassNbCopies(const common::dataStructures::Se //------------------------------------------------------------------------------ // modifyStorageClassComment //------------------------------------------------------------------------------ -void RdbmsCatalogue::modifyStorageClassComment(const common::dataStructures::SecurityIdentity &cliIdentity, const std::string &instanceName, const std::string &name, const std::string &comment) { - throw exception::Exception(std::string(__FUNCTION__) + " not implemented"); +void RdbmsCatalogue::modifyStorageClassComment(const common::dataStructures::SecurityIdentity &cliIdentity, + const std::string &instanceName, const std::string &name, const std::string &comment) { + try { + const time_t now = time(nullptr); + const char *const sql = + "UPDATE STORAGE_CLASS SET " + "USER_COMMENT = :USER_COMMENT," + "LAST_UPDATE_USER_NAME = :LAST_UPDATE_USER_NAME," + "LAST_UPDATE_HOST_NAME = :LAST_UPDATE_HOST_NAME," + "LAST_UPDATE_TIME = :LAST_UPDATE_TIME " + "WHERE " + "DISK_INSTANCE_NAME = :DISK_INSTANCE_NAME AND " + "STORAGE_CLASS_NAME = :STORAGE_CLASS_NAME"; + auto conn = m_connPool.getConn(); + auto stmt = conn->createStmt(sql, rdbms::Stmt::AutocommitMode::ON); + stmt->bindString(":USER_COMMENT", comment); + stmt->bindString(":LAST_UPDATE_USER_NAME", cliIdentity.username); + stmt->bindString(":LAST_UPDATE_HOST_NAME", cliIdentity.host); + stmt->bindUint64(":LAST_UPDATE_TIME", now); + stmt->bindString(":DISK_INSTANCE_NAME", instanceName); + stmt->bindString(":STORAGE_CLASS_NAME", name); + stmt->executeNonQuery(); + } catch(exception::Exception &ex) { + throw exception::Exception(std::string(__FUNCTION__) + " failed: " + ex.getMessage().str()); + } } //------------------------------------------------------------------------------ -- GitLab