Imported Upstream version 16.3.2
[platform/upstream/libzypp.git] / zypp / Locks.cc
index 156dad0..b4ff9d5 100644 (file)
@@ -15,7 +15,7 @@
 
 #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"
@@ -40,87 +40,41 @@ Locks& Locks::instance()
   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();
     }
   }
 };
@@ -152,12 +106,12 @@ void Locks::readAndApply( const Pathname& file )
   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;
 
 }
 
@@ -166,16 +120,16 @@ void Locks::read( const Pathname& file )
   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());
 }
 
 
@@ -187,14 +141,17 @@ void Locks::addLock( const PoolQuery& query )
     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 );
   }
 }
 
@@ -229,14 +186,17 @@ void Locks::removeLock( const PoolQuery& 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 );
   }
 }
 
@@ -258,13 +218,14 @@ void Locks::removeLock( const ResKind &kind_r, const IdString &name_r )
   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;
@@ -286,7 +247,7 @@ public:
 
   bool aborted(){ return skip_rest; }
 
-  bool operator()( const PoolQuery & q )
+  bool operator()(PoolQuery& q)
   {
     if( skip_rest )
       return false;
@@ -311,7 +272,8 @@ public:
     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;
@@ -321,13 +283,13 @@ public:
 
 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() )
   {
@@ -340,7 +302,7 @@ void Locks::removeEmpty()
 
   }
 
-  if ( sum != _pimpl->locks().size() ) //some locks has been removed
+  if ( sum != _pimpl->locks.size() ) //some locks has been removed
     _pimpl->locksDirty = true;
 }
 
@@ -414,7 +376,7 @@ public:
       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;
   }
 
@@ -423,18 +385,22 @@ public:
 
 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();
@@ -482,12 +448,22 @@ void Locks::save( const Pathname& file )
     }
   }
 
-  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