diff --git a/Database/APR/CollectionBase/CollectionBase/CatalogCollectionCursor.h b/Database/APR/CollectionBase/CollectionBase/CatalogCollectionCursor.h index 1e8c8140e4db3e3cd9d90d41814d532851df338e..c66f08863dcd2b5a2ba3fe182d7f14d0a4a5301d 100755 --- a/Database/APR/CollectionBase/CollectionBase/CatalogCollectionCursor.h +++ b/Database/APR/CollectionBase/CollectionBase/CatalogCollectionCursor.h @@ -50,6 +50,10 @@ namespace pool { /// Default destructor. virtual ~CatalogCollectionCursor(); + /// Disable copy ctor, assignment. + CatalogCollectionCursor (const CatalogCollectionCursor&) = delete; + CatalogCollectionCursor& operator= (const CatalogCollectionCursor&) = delete; + /// Advances the cursor to the next row of the query result set of the current collection. virtual bool next(); diff --git a/Database/APR/CollectionBase/CollectionBase/CollectionDescription.h b/Database/APR/CollectionBase/CollectionBase/CollectionDescription.h index 64e3f17e56428ebc3e5e17fdfcde5fd5bce4442f..6ea5ed57953fbcfa17db518922ece96be2ad4324 100755 --- a/Database/APR/CollectionBase/CollectionBase/CollectionDescription.h +++ b/Database/APR/CollectionBase/CollectionBase/CollectionDescription.h @@ -74,7 +74,7 @@ namespace pool { * @param rhs source CollectionDescription object to copy. */ CollectionDescription& operator=( const CollectionDescription& rhs ) - { return operator=( (const ICollectionDescription&) rhs ); } + { operator=( (const ICollectionDescription&) rhs ); return *this; } /** * Equality operator. diff --git a/Database/APR/CollectionBase/CollectionBase/TokenList.h b/Database/APR/CollectionBase/CollectionBase/TokenList.h index 83d16f172e6e60dc58cf3a9bd25af30f402f98f3..560bb87dfd4775c2aed01d89e111b7e75c390233 100755 --- a/Database/APR/CollectionBase/CollectionBase/TokenList.h +++ b/Database/APR/CollectionBase/CollectionBase/TokenList.h @@ -128,10 +128,13 @@ namespace pool { iterator_base( const TokenList* list, size_t idx = 0 ) : m_list( list ), m_index( idx ) {} iterator_base( const iterator_base& rhs ) { *this = rhs; } - iterator_base& operator=( const iterator_base& rhs ) { - m_index = rhs.m_index; - m_list = rhs.m_list; - return *this; + iterator_base& operator=( const iterator_base& rhs ) + { + if (this != &rhs) { + m_index = rhs.m_index; + m_list = rhs.m_list; + } + return *this; } virtual ~iterator_base() {} diff --git a/Database/APR/CollectionBase/src/CollectionDescription.cpp b/Database/APR/CollectionBase/src/CollectionDescription.cpp index 2c217c246af0a7f39ceeae029a66b07d3e53a5f0..607a5aa419d5f81cf313d6cfbb72555c0aa71092 100755 --- a/Database/APR/CollectionBase/src/CollectionDescription.cpp +++ b/Database/APR/CollectionBase/src/CollectionDescription.cpp @@ -15,6 +15,7 @@ #include <sstream> #include <iostream> +#include <algorithm> using namespace std; pool::CollectionDescription::CollectionDescription( const std::string& name, @@ -892,7 +893,7 @@ pool::CollectionDescription::dropIndex( const std::vector<std::string>& columnNa { const std::string& methodName("dropIndex"); // Check if index already exists for input columns. - for ( std::vector< pool::CollectionIndex* >::iterator iIndex = m_indices.begin(); iIndex != m_indices.end(); ++iIndex ) + for ( std::vector< pool::CollectionIndex* >::iterator iIndex = m_indices.begin(); iIndex != m_indices.end(); ) { const pool::CollectionIndex& index = **iIndex; @@ -908,7 +909,7 @@ pool::CollectionDescription::dropIndex( const std::vector<std::string>& columnNa // Drop the index from the collection description. delete *iIndex; - m_indices.erase( iIndex ); + iIndex = m_indices.erase( iIndex ); } else { @@ -1049,7 +1050,7 @@ pool::CollectionDescription::unsetUniqueConstraint( const std::string& columnNam // Unset unique constraint on column. bool constraintFound = false; for ( std::vector< pool::CollectionUniqueConstraint* >::iterator iConstraint = - m_uniqueConstraints.begin(); iConstraint != m_uniqueConstraints.end(); ++iConstraint ) + m_uniqueConstraints.begin(); iConstraint != m_uniqueConstraints.end(); ) { pool::CollectionUniqueConstraint* constraint = *iConstraint; @@ -1058,9 +1059,11 @@ pool::CollectionDescription::unsetUniqueConstraint( const std::string& columnNam { constraintFound = true; delete constraint; - m_uniqueConstraints.erase( iConstraint ); + iConstraint = m_uniqueConstraints.erase( iConstraint ); column->setIsUnique( false ); } + else + ++iConstraint; } // Unique constraint not found. @@ -1093,7 +1096,7 @@ pool::CollectionDescription::unsetUniqueConstraint( const std::vector< std::stri // Find the constraint and drop it and unset uniqueness on columns of constraint. bool constraintFound = false; for ( std::vector< pool::CollectionUniqueConstraint* >::iterator iConstraint = - m_uniqueConstraints.begin(); iConstraint != m_uniqueConstraints.end(); ++iConstraint ) + m_uniqueConstraints.begin(); iConstraint != m_uniqueConstraints.end(); ) { const pool::CollectionUniqueConstraint& constraint = **iConstraint; @@ -1104,13 +1107,15 @@ pool::CollectionDescription::unsetUniqueConstraint( const std::vector< std::stri { constraintFound = true; delete *iConstraint; - m_uniqueConstraints.erase( iConstraint ); + iConstraint = m_uniqueConstraints.erase( iConstraint ); for ( std::map< std::string, pool::CollectionColumn* >::iterator iColumn = columnForColumnName.begin(); iColumn != columnForColumnName.end(); iColumn++ ) { iColumn->second->setIsUnique( false ); } } + else + ++iConstraint; } if ( ! constraintFound ) { @@ -1230,39 +1235,39 @@ pool::CollectionDescription::dropCollectionFragment( const std::string& fragment iColumn != columns.end(); ++iColumn ) { for ( std::vector< pool::CollectionIndex* >::iterator iIndex = m_indices.begin(); - iIndex != m_indices.end(); ++iIndex ) + iIndex != m_indices.end(); ) { pool::CollectionIndex* index = *iIndex; + bool deleted = false; for ( std::vector< std::string >::const_iterator iName = index->columnNames().begin(); iName != index->columnNames().end(); ++iName ) { if ( *iName == (*iColumn)->name() ) { delete index; - m_indices.erase( iIndex ); + iIndex = m_indices.erase( iIndex ); + deleted = true; break; } } + if (!deleted) + ++iIndex; } } // Drop description objects of all associated unique constraints. - for( std::vector< pool::CollectionColumn* >::iterator iColumn = columns.begin(); - iColumn != columns.end(); ++iColumn ) + for (pool::CollectionColumn* column : columns) { for ( std::vector< pool::CollectionUniqueConstraint* >::iterator iConstraint = - m_uniqueConstraints.begin(); iConstraint != m_uniqueConstraints.end(); ++iConstraint ) + m_uniqueConstraints.begin(); iConstraint != m_uniqueConstraints.end(); ) { pool::CollectionUniqueConstraint* constraint = *iConstraint; - for ( std::vector< std::string >::const_iterator iName = constraint->columnNames().begin(); - iName != constraint->columnNames().end(); ++iName ) - { - if ( *iName == (*iColumn)->name() ) - { - delete constraint; - m_uniqueConstraints.erase( iConstraint ); - break; - } + std::vector<std::string>& names = constraint->columnNames(); + if (std::find (names.begin(), names.end(), column->name()) != names.end()) { + delete constraint; + iConstraint = m_uniqueConstraints.erase( iConstraint ); } + else + ++iConstraint; } } diff --git a/Database/APR/CollectionBase/src/CollectionFactory.cpp b/Database/APR/CollectionBase/src/CollectionFactory.cpp index a24588feb1d609bf9d389225487756b3dc337211..e988bbb731e1bc85f8987e3d6b04c6aadfff6f2d 100755 --- a/Database/APR/CollectionBase/src/CollectionFactory.cpp +++ b/Database/APR/CollectionBase/src/CollectionFactory.cpp @@ -20,6 +20,7 @@ #else #include "Reflex/PluginService.h" #endif +#include "GAUDI_VERSION.h" #include "PersistencySvc/ISession.h" #include "POOLCore/Exception.h" @@ -66,7 +67,11 @@ pool::CollectionFactory::create_callPlugin( const pool::ICollectionDescription& { std::string type( description.type() ); #ifdef HAVE_GAUDI_PLUGINSVC +#if GAUDI_VERSION > CALC_GAUDI_VERSION(25, 3) + ICollection *coll = Gaudi::PluginService::Factory<ICollection*, const ICollectionDescription*, ICollection::OpenMode, ISession*>::create( type, &description, openMode, session ); +#else ICollection *coll = Gaudi::PluginService::Factory3<ICollection*, const ICollectionDescription*, ICollection::OpenMode, ISession*>::create( type, &description, openMode, session ); +#endif #else ICollection *coll = Reflex::PluginService::CreateWithId<ICollection*>( type, &description, openMode, session ); #endif @@ -513,8 +518,8 @@ pool::ICollectionCursor* pool::CollectionFactory::getCatalogCollectionCursor( pool::IFileCatalog* collectionCatalog, std::string collectionLevelQuery, std::string rowLevelQuery, - std::vector<std::string>* attribOutputList, std::vector<std::string>* tokenOutputList, + std::vector<std::string>* attribOutputList, int rowCacheSize, pool::ISession* session ) const { @@ -522,8 +527,8 @@ pool::CollectionFactory::getCatalogCollectionCursor( pool::IFileCatalog* collect return new pool::CatalogCollectionCursor( *collectionCatalog, collectionLevelQuery, rowLevelQuery, - attribOutputList, tokenOutputList, + attribOutputList, rowCacheSize, session ); } diff --git a/Database/APR/CollectionBase/test/Factory_test.cxx b/Database/APR/CollectionBase/test/Factory_test.cxx index 3327552acef4ce94b3a0651d2296b9df666446ae..464bc0d39ed336f6b3d8ab6772b4e949e45bc956 100644 --- a/Database/APR/CollectionBase/test/Factory_test.cxx +++ b/Database/APR/CollectionBase/test/Factory_test.cxx @@ -28,7 +28,11 @@ using namespace pool; int main(int argc, char** ) { bool crude = argc>1; - + + remove ("CollectionCatalog0.xml"); + remove ("CollectionCatalog1.xml"); + remove ("CollectionCatalog2.xml"); + // const string collConnection = "./"; const string collConnection = ""; const string collType = "RootCollection";