Imported Upstream version 17.16.0
[platform/upstream/libzypp.git] / zypp / sat / Pool.cc
index a710aae..04beca0 100644 (file)
@@ -9,13 +9,19 @@
 /** \file      zypp/sat/Pool.cc
  *
 */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
 
 extern "C"
 {
-#include <satsolver/pool.h>
-#include <satsolver/repo.h>
+#include <solv/pool.h>
+#include <solv/repo.h>
+#include <solv/solvable.h>
 }
+
 #include <iostream>
+#include <fstream>
 
 #include "zypp/base/Easy.h"
 #include "zypp/base/Logger.h"
@@ -28,6 +34,8 @@ extern "C"
 #include "zypp/sat/Pool.h"
 #include "zypp/sat/LookupAttr.h"
 
+using std::endl;
+
 ///////////////////////////////////////////////////////////////////
 namespace zypp
 { /////////////////////////////////////////////////////////////////
@@ -38,7 +46,7 @@ namespace zypp
     const std::string & Pool::systemRepoAlias()
     { return detail::PoolImpl::systemRepoAlias(); }
 
-    ::_Pool * Pool::get() const
+    detail::CPool * Pool::get() const
     { return myPool().getPool(); }
 
     Pool::size_type Pool::capacity() const
@@ -47,17 +55,34 @@ namespace zypp
     const SerialNumber & Pool::serial() const
     { return myPool().serial(); }
 
+    const SerialNumber & Pool::serialIDs() const
+    { return myPool().serialIDs(); }
+
     void Pool::prepare() const
     { return myPool().prepare(); }
 
+    Pathname Pool::rootDir() const
+    { return myPool().rootDir(); }
+
+    void Pool::rootDir( const Pathname & root_r )
+    { return myPool().rootDir( root_r ); }
+
     bool Pool::reposEmpty() const
-    { return ! myPool()->nrepos; }
+    { return ! myPool()->urepos; }
 
     Pool::size_type Pool::reposSize() const
-    { return myPool()->nrepos; }
+    { return myPool()->urepos; }
 
     Pool::RepositoryIterator Pool::reposBegin() const
-    { return RepositoryIterator( myPool()->repos ); }
+    {
+      if ( myPool()->urepos )
+      { // repos[0] == NULL
+       for_( it, myPool()->repos+1, myPool()->repos+myPool()->nrepos )
+         if ( *it )
+           return RepositoryIterator( it );
+      }
+      return reposEnd();
+    }
 
     Pool::RepositoryIterator Pool::reposEnd() const
     { return RepositoryIterator( myPool()->repos+myPool()->nrepos ); }
@@ -94,6 +119,27 @@ namespace zypp
     Pool::SolvableIterator Pool::solvablesEnd() const
     { return SolvableIterator(); }
 
+    sat::Queue Pool::whatMatchesDep( const SolvAttr &attr, const Capability &cap ) const
+    {
+      sat::Queue q;
+      pool_whatmatchesdep( get(), attr.id(), cap.id(), q, 0);
+      return q;
+    }
+
+    Queue Pool::whatMatchesSolvable( const SolvAttr &attr, const Solvable &solv ) const
+    {
+      sat::Queue q;
+      pool_whatmatchessolvable( get(), attr.id(), static_cast<Id>( solv.id() ), q, 0 );
+      return q;
+    }
+
+    Queue Pool::whatContainsDep( const SolvAttr &attr, const Capability &cap ) const
+    {
+      sat::Queue q;
+      pool_whatcontainsdep( get(), attr.id(), cap.id(), q, 0 );
+      return q;
+    }
+
     Repository Pool::reposInsert( const std::string & alias_r )
     {
       Repository ret( reposFind( alias_r ) );
@@ -184,6 +230,9 @@ namespace zypp
 
    /////////////////////////////////////////////////////////////////
 
+    void Pool::setTextLocale( const Locale & locale_r )
+    { myPool().setTextLocale( locale_r ); }
+
     void Pool::setRequestedLocales( const LocaleSet & locales_r )
     { myPool().setRequestedLocales( locales_r ); }
 
@@ -199,12 +248,24 @@ namespace zypp
     bool Pool::isRequestedLocale( const Locale & locale_r ) const
     { return myPool().isRequestedLocale( locale_r ); }
 
+    void Pool::initRequestedLocales( const LocaleSet & locales_r )     { myPool().initRequestedLocales( locales_r ); }
+    const LocaleSet & Pool::getAddedRequestedLocales() const           { return myPool().getAddedRequestedLocales(); }
+    const LocaleSet & Pool::getRemovedRequestedLocales() const         { return myPool().getRemovedRequestedLocales(); }
+
     const LocaleSet & Pool::getAvailableLocales() const
     {  return myPool().getAvailableLocales(); }
 
     bool Pool::isAvailableLocale( const Locale & locale_r ) const
     { return myPool().isAvailableLocale( locale_r ); }
 
+    const  Pool::MultiversionList &  Pool::multiversion() const
+    { return myPool().multiversionList(); }
+
+    Queue Pool::autoInstalled() const                          { return myPool().autoInstalled(); }
+    void Pool::setAutoInstalled( const Queue & autoInstalled_r ){ myPool().setAutoInstalled( autoInstalled_r ); }
+
+    void Pool::setNeedrebootSpec( sat::SolvableSpec needrebootSpec_r ) { myPool().setNeedrebootSpec( std::move(needrebootSpec_r) ); }
+
    /******************************************************************
     **
     ** FUNCTION NAME : operator<<
@@ -215,7 +276,66 @@ namespace zypp
       return str << "sat::pool(" << obj.serial() << ")["
           << obj.capacity() << "]{"
           << obj.reposSize() << "repos|"
-         << obj.solvablesSize() << "slov}";
+         << obj.solvablesSize() << "solv}";
+    }
+
+    /////////////////////////////////////////////////////////////////
+    #undef ZYPP_BASE_LOGGER_LOGGROUP
+    #define ZYPP_BASE_LOGGER_LOGGROUP "solvidx"
+
+    void updateSolvFileIndex( const Pathname & solvfile_r )
+    {
+      AutoDispose<FILE*> solv( ::fopen( solvfile_r.c_str(), "re" ), ::fclose );
+      if ( solv == NULL )
+      {
+       solv.resetDispose();
+       ERR << "Can't open solv-file: " << solv << endl;
+       return;
+      }
+
+      std::string solvidxfile( solvfile_r.extend(".idx").asString() );
+      if ( ::unlink( solvidxfile.c_str() ) == -1 && errno != ENOENT )
+      {
+       ERR << "Can't unlink solv-idx: " << Errno() << endl;
+       return;
+      }
+      {
+       int fd = ::open( solvidxfile.c_str(), O_CREAT|O_EXCL|O_WRONLY|O_TRUNC, 0644 );
+       if ( fd == -1 )
+       {
+         ERR << "Can't create solv-idx: " << Errno() << endl;
+         return;
+       }
+       ::close( fd );
+      }
+      std::ofstream idx( solvidxfile.c_str() );
+
+
+      detail::CPool * _pool = ::pool_create();
+      detail::CRepo * _repo = ::repo_create( _pool, "" );
+      if ( ::repo_add_solv( _repo, solv, 0 ) == 0 )
+      {
+       int _id = 0;
+       detail::CSolvable * _solv = nullptr;
+       FOR_REPO_SOLVABLES( _repo, _id, _solv )
+       {
+         if ( _solv )
+         {
+#define SEP '\t'
+#define        idstr(V) pool_id2str( _pool, _solv->V )
+           if ( _solv->arch == ARCH_SRC || _solv->arch == ARCH_NOSRC )
+             idx << "srcpackage:" << idstr(name) << SEP << idstr(evr) << SEP << "noarch" << endl;
+           else
+             idx << idstr(name) << SEP << idstr(evr) << SEP << idstr(arch) << endl;
+         }
+       }
+      }
+      else
+      {
+       ERR << "Can't read solv-file: " << ::pool_errstr( _pool ) << endl;
+      }
+      ::repo_free( _repo, 0 );
+      ::pool_free( _pool );
     }
 
     /////////////////////////////////////////////////////////////////