From abe5cb2c455ec163138b2b68981c77db282c6d6d Mon Sep 17 00:00:00 2001 From: Steven Murray <steven.murray@cern.ch> Date: Wed, 3 Aug 2016 11:19:44 +0200 Subject: [PATCH] Added RdbmsCatalogue::modifyTapePoolNbPartialTapes() --- catalogue/CatalogueTest.cpp | 53 ++++++++++++++++++++++++++++++++++++ catalogue/RdbmsCatalogue.cpp | 25 +++++++++++++++-- 2 files changed, 76 insertions(+), 2 deletions(-) diff --git a/catalogue/CatalogueTest.cpp b/catalogue/CatalogueTest.cpp index d015e5d6d2..00bf93b6eb 100644 --- a/catalogue/CatalogueTest.cpp +++ b/catalogue/CatalogueTest.cpp @@ -993,6 +993,59 @@ TEST_P(cta_catalogue_CatalogueTest, deleteTapePool_non_existant) { ASSERT_THROW(m_catalogue->deleteTapePool("non_existant_tape_pool"), exception::UserError); } +TEST_P(cta_catalogue_CatalogueTest, modifyTapePoolNbPartialTapes) { + using namespace cta; + + ASSERT_TRUE(m_catalogue->getTapePools().empty()); + + const std::string tapePoolName = "tape_pool"; + const uint64_t nbPartialTapes = 2; + const bool is_encrypted = true; + const std::string comment = "Create tape pool"; + m_catalogue->createTapePool(m_cliSI, tapePoolName, nbPartialTapes, is_encrypted, comment); + + { + const std::list<common::dataStructures::TapePool> pools = m_catalogue->getTapePools(); + + ASSERT_EQ(1, pools.size()); + + const common::dataStructures::TapePool pool = pools.front(); + ASSERT_EQ(tapePoolName, pool.name); + ASSERT_EQ(nbPartialTapes, pool.nbPartialTapes); + ASSERT_EQ(is_encrypted, pool.encryption); + ASSERT_EQ(comment, pool.comment); + + const common::dataStructures::EntryLog creationLog = pool.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = pool.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } + + const uint64_t modifiedNbPartialTapes = 5; + m_catalogue->modifyTapePoolNbPartialTapes(m_cliSI, tapePoolName, modifiedNbPartialTapes); + + { + const std::list<common::dataStructures::TapePool> pools = m_catalogue->getTapePools(); + + ASSERT_EQ(1, pools.size()); + + const common::dataStructures::TapePool pool = pools.front(); + ASSERT_EQ(tapePoolName, pool.name); + ASSERT_EQ(modifiedNbPartialTapes, pool.nbPartialTapes); + ASSERT_EQ(is_encrypted, pool.encryption); + ASSERT_EQ(comment, pool.comment); + + const common::dataStructures::EntryLog creationLog = pool.creationLog; + ASSERT_EQ(m_cliSI.username, creationLog.username); + ASSERT_EQ(m_cliSI.host, creationLog.host); + + const common::dataStructures::EntryLog lastModificationLog = pool.lastModificationLog; + ASSERT_EQ(creationLog, lastModificationLog); + } +} + TEST_P(cta_catalogue_CatalogueTest, createArchiveRoute) { using namespace cta; diff --git a/catalogue/RdbmsCatalogue.cpp b/catalogue/RdbmsCatalogue.cpp index 9a3ac7b587..37f8a60ae9 100644 --- a/catalogue/RdbmsCatalogue.cpp +++ b/catalogue/RdbmsCatalogue.cpp @@ -812,8 +812,29 @@ std::list<common::dataStructures::TapePool> RdbmsCatalogue::getTapePools() const //------------------------------------------------------------------------------ // modifyTapePoolNbPartialTapes //------------------------------------------------------------------------------ -void RdbmsCatalogue::modifyTapePoolNbPartialTapes(const common::dataStructures::SecurityIdentity &cliIdentity, const std::string &name, const uint64_t nbPartialTapes) { - throw exception::Exception(std::string(__FUNCTION__) + " not implemented"); +void RdbmsCatalogue::modifyTapePoolNbPartialTapes(const common::dataStructures::SecurityIdentity &cliIdentity, + const std::string &name, const uint64_t nbPartialTapes) { + try { + const time_t now = time(nullptr); + const char *const sql = + "UPDATE TAPE_POOL SET " + "NB_PARTIAL_TAPES = :NB_PARTIAL_TAPES," + "LAST_UPDATE_USER_NAME = :LAST_UPDATE_USER_NAME," + "LAST_UPDATE_HOST_NAME = :LAST_UPDATE_HOST_NAME," + "LAST_UPDATE_TIME = :LAST_UPDATE_TIME " + "WHERE " + "TAPE_POOL_NAME = :TAPE_POOL_NAME"; + auto conn = m_connPool.getConn(); + auto stmt = conn->createStmt(sql, rdbms::Stmt::AutocommitMode::ON); + stmt->bindUint64(":NB_PARTIAL_TAPES", nbPartialTapes); + stmt->bindString(":LAST_UPDATE_USER_NAME", cliIdentity.username); + stmt->bindString(":LAST_UPDATE_HOST_NAME", cliIdentity.host); + stmt->bindUint64(":LAST_UPDATE_TIME", now); + stmt->bindString(":TAPE_POOL_NAME", name); + stmt->executeNonQuery(); + } catch(exception::Exception &ex) { + throw exception::Exception(std::string(__FUNCTION__) + " failed: " + ex.getMessage().str()); + } } //------------------------------------------------------------------------------ -- GitLab