#include "zypp/base/Regex.h"
#include "zypp/base/String.h"
-#include "zypp/base/LogTools.h"
+#include "zypp/base/Logger.h"
#include "zypp/base/IOStream.h"
#include "zypp/PoolItem.h"
#include "zypp/PoolQueryUtil.tcc"
return _instance;
}
-typedef std::set<PoolQuery> LockSet;
-
-template <typename TPredicate>
-void remove_if( LockSet & lockset_r, TPredicate pred_r )
-{
- LockSet::iterator first = lockset_r.begin();
- LockSet::iterator last = lockset_r.end();
- while ( first != last )
- {
- LockSet::iterator next = first;
- ++next;
- if ( pred_r( *first ) )
- lockset_r.erase( first );
- first = next;
- }
-}
-
class Locks::Impl
{
public:
- LockSet toAdd;
- LockSet toRemove;
+ LockList locks;
+ LockList toAdd;
+ LockList toRemove;
bool locksDirty;
bool mergeList(callback::SendReport<SavingLocksReport>& report);
- Impl()
- : locksDirty( false )
- , _APIdirty( false )
- {}
-
-
- // need to control manip locks _locks to maintain the legacy API LockList::iterator begin/end
-
- const LockSet & locks() const
- { return _locks; }
-
- LockSet & MANIPlocks()
- { if ( !_APIdirty ) _APIdirty = true; return _locks; }
-
- const LockList & APIlocks() const
- {
- if ( _APIdirty )
- {
- _APIlocks.clear();
- _APIlocks.insert( _APIlocks.end(), _locks.begin(), _locks.end() );
- _APIdirty = false;
- }
- return _APIlocks;
- }
-
-private:
- // need to control manip in ordert to maintain the legacy API LockList::iterator begin/end
- LockSet _locks;
- mutable LockList _APIlocks;
- mutable bool _APIdirty;
+ Impl():locksDirty(false){}
};
Locks::Locks() : _pimpl(new Impl){}
Locks::const_iterator Locks::begin() const
-{ return _pimpl->APIlocks().begin(); }
+{ return _pimpl->locks.begin(); }
Locks::const_iterator Locks::end() const
-{ return _pimpl->APIlocks().end(); }
+{ return _pimpl->locks.end(); }
Locks::LockList::size_type Locks::size() const
-{ return _pimpl->locks().size(); }
+{ return _pimpl->locks.size(); }
bool Locks::empty() const
-{ return _pimpl->locks().empty(); }
+{ return _pimpl->locks.empty(); }
struct ApplyLock
{
void operator()(const PoolQuery& query) const
{
- for_( it,query.begin(),query.end() )
+ for ( const PoolItem & item : query.poolItem() )
{
- PoolItem item(*it);
item.status().setLock(true,ResStatus::USER);
- DBG << "lock "<< item.resolvable()->name();
+ DBG << "lock "<< item.name();
}
}
};
PathInfo pinfo(file);
if ( pinfo.isExist() )
{
- std::insert_iterator<LockSet> ii( _pimpl->MANIPlocks(), _pimpl->MANIPlocks().end() );
- LockingOutputIterator<std::insert_iterator<LockSet> > lout(ii);
+ std::insert_iterator<LockList> ii( _pimpl->locks, _pimpl->locks.end() );
+ LockingOutputIterator<std::insert_iterator<LockList> > lout(ii);
readPoolQueriesFromFile( file, boost::make_function_output_iterator(lout) );
}
else
- MIL << "file does not exist(or cannot be stat), no lock added." << endl;
+ MIL << "file not exist(or cannot be stat), no lock added." << endl;
}
MIL << "read locks from "<<file << endl;
PathInfo pinfo(file);
if ( pinfo.isExist() )
- readPoolQueriesFromFile( file, std::insert_iterator<LockSet>(_pimpl->MANIPlocks(), _pimpl->MANIPlocks().end()) );
+ readPoolQueriesFromFile( file, std::insert_iterator<LockList>(_pimpl->locks, _pimpl->locks.end()) );
else
- MIL << "file does not exist(or cannot be stat), no lock added." << endl;
+ MIL << "file not exist(or cannot be stat), no lock added." << endl;
}
void Locks::apply() const
{
DBG << "apply locks" << endl;
- for_each(_pimpl->locks().begin(), _pimpl->locks().end(), ApplyLock());
+ for_each(begin(), end(), ApplyLock());
}
PoolItem item(*it);
item.status().setLock(true,ResStatus::USER);
}
- if ( _pimpl->toRemove.erase( query ) )
+ LockList::iterator i = find(_pimpl->toRemove.begin(),
+ _pimpl->toRemove.end(), query);
+ if ( i != _pimpl->toRemove.end() )
{
DBG << "query removed from toRemove" << endl;
+ _pimpl->toRemove.erase(i);
}
else
{
DBG << "query added as new" << endl;
- _pimpl->toAdd.insert( query );
+ _pimpl->toAdd.push_back( query );
}
}
item.status().setLock(false,ResStatus::USER);
}
- if ( _pimpl->toAdd.erase( query ) )
+ LockList::iterator i = find(_pimpl->toAdd.begin(),
+ _pimpl->toAdd.end(), query);
+ if ( i != _pimpl->toAdd.end() )
{
DBG << "query removed from added" << endl;
+ _pimpl->toAdd.erase(i);
}
else
{
- DBG << "need to remove some old lock" << endl;
- _pimpl->toRemove.insert( query );
+ DBG << "needed remove some old lock" << endl;
+ _pimpl->toRemove.push_back( query );
}
}
q.addKind( kind_r );
q.setMatchExact();
q.setCaseSensitive(true);
- DBG << "remove lock by Selectable" << endl;
+ q.requireAll();
+ DBG << "remove lock by selectactable" << endl;
removeLock(q);
}
bool Locks::existEmpty() const
{
- for_( it, _pimpl->locks().begin(), _pimpl->locks().end() )
+ for_( it, _pimpl->locks.begin(), _pimpl->locks.end() )
{
if( it->empty() )
return true;
bool aborted(){ return skip_rest; }
- bool operator()( const PoolQuery & q )
+ bool operator()(PoolQuery& q)
{
if( skip_rest )
return false;
case CleanEmptyLocksReport::IGNORE:
return false;
default:
- INT << "Unexpected return value from callback. Need to adapt switch statement." << std::endl;
+ WAR << "Unknown returned value. Callback have more value then"
+ << " this switch. Need correct handle all enum values." << std::endl;
}
return false;
void Locks::removeEmpty()
{
- MIL << "clean of locks" << endl;
+ MIL << "cleaning of locks" << endl;
callback::SendReport<CleanEmptyLocksReport> report;
report->start();
- size_t sum = _pimpl->locks().size();
+ size_t sum = _pimpl->locks.size();
LocksCleanPredicate p(sum, report);
- remove_if( _pimpl->MANIPlocks(), p );
+ _pimpl->locks.remove_if(p);
if( p.aborted() )
{
}
- if ( sum != _pimpl->locks().size() ) //some locks has been removed
+ if ( sum != _pimpl->locks.size() ) //some locks has been removed
_pimpl->locksDirty = true;
}
DBG << "skip lock" << endl;
return false;
}
- INT << "Unexpected return value from callback. Need to adapt switch statement." << std::endl;
+ WAR << "should not reached, some state is missing" << endl;
return false;
}
bool Locks::Impl::mergeList(callback::SendReport<SavingLocksReport>& report)
{
- MIL << "merge list old: " << locks().size()
+ MIL << "merging list old: " << locks.size()
<< " to add: " << toAdd.size() << "to remove: " << toRemove.size() << endl;
for_(it,toRemove.begin(),toRemove.end())
{
std::set<sat::Solvable> s(it->begin(),it->end());
- remove_if( MANIPlocks(), LocksRemovePredicate(s,*it, report) );
+ locks.remove_if(LocksRemovePredicate(s,*it, report));
}
if (!report->progress())
return false;
- MANIPlocks().insert( toAdd.begin(), toAdd.end() );
+ for_( it, toAdd.begin(), toAdd.end() )
+ {
+ if( std::find( locks.begin(), locks.end(), *it ) == locks.end() )
+ locks.push_back( *it );
+ }
toAdd.clear();
toRemove.clear();
}
}
- DBG << "wrote "<< _pimpl->locks().size() << "locks" << endl;
- writePoolQueriesToFile( file, _pimpl->locks().begin(), _pimpl->locks().end() );
+ DBG << "writed "<< _pimpl->locks.size() << "locks" << endl;
+ writePoolQueriesToFile( file, _pimpl->locks.begin(), _pimpl->locks.end() );
report->finish(SavingLocksReport::NO_ERROR);
}
void Locks::removeDuplicates()
-{ /* NOP since implementation uses std::set */ }
+{
+ size_type sum = size();
+ for_(it,_pimpl->locks.begin(),_pimpl->locks.end())
+ {
+ if ( find(_pimpl->locks.begin(),it,*it) != it )
+ _pimpl->locks.erase(it--); //-- to avoid using break iterator
+ }
+
+ if (sum!=size())
+ _pimpl->locksDirty = true;
+}
} // ns zypp