Imported Upstream version 16.3.2
[platform/upstream/libzypp.git] / zypp / target / CommitPackageCache.cc
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/target/CommitPackageCache.cc
10  *
11 */
12 #include <iostream>
13 #include "zypp/base/Logger.h"
14 #include "zypp/base/Exception.h"
15
16 #include "zypp/target/CommitPackageCache.h"
17 #include "zypp/target/CommitPackageCacheImpl.h"
18 #include "zypp/target/CommitPackageCacheReadAhead.h"
19
20 using std::endl;
21
22 #include "zypp/target/rpm/librpmDb.h"
23 #include "zypp/repo/PackageProvider.h"
24 #include "zypp/repo/DeltaCandidates.h"
25 #include "zypp/ResPool.h"
26
27 ///////////////////////////////////////////////////////////////////
28 namespace zypp
29 { /////////////////////////////////////////////////////////////////
30   ///////////////////////////////////////////////////////////////////
31   namespace target
32   { /////////////////////////////////////////////////////////////////
33
34     ///////////////////////////////////////////////////////////////////
35     namespace {
36       ///////////////////////////////////////////////////////////////////
37       /// \class QueryInstalledEditionHelper
38       /// \short Helper for PackageProvider queries during download.
39       ///////////////////////////////////////////////////////////////////
40       struct QueryInstalledEditionHelper
41       {
42         bool operator()( const std::string & name_r, const Edition & ed_r, const Arch & arch_r ) const
43         {
44           rpm::librpmDb::db_const_iterator it;
45           for ( it.findByName( name_r ); *it; ++it )
46           {
47             if ( arch_r == it->tag_arch()
48               && ( ed_r == Edition::noedition || ed_r == it->tag_edition() ) )
49             {
50               return true;
51             }
52           }
53           return false;
54         }
55       };
56     } // namespace
57     ///////////////////////////////////////////////////////////////////
58
59     ///////////////////////////////////////////////////////////////////
60     //
61     //  class RepoProvidePackage
62     //
63     ///////////////////////////////////////////////////////////////////
64
65     struct RepoProvidePackage::Impl
66     {
67       repo::RepoMediaAccess _access;
68       std::list<Repository> _repos;
69       repo::PackageProviderPolicy _packageProviderPolicy;
70     };
71
72     RepoProvidePackage::RepoProvidePackage()
73       : _impl( new Impl )
74     {
75        const ResPool & pool( ResPool::instance() );
76       _impl->_repos.insert( _impl->_repos.begin(), pool.knownRepositoriesBegin(), pool.knownRepositoriesEnd() );
77       _impl->_packageProviderPolicy.queryInstalledCB( QueryInstalledEditionHelper() );
78     }
79
80     RepoProvidePackage::~RepoProvidePackage()
81     {}
82
83     ManagedFile RepoProvidePackage::operator()( const PoolItem & pi, bool fromCache_r )
84     {
85       Package::constPtr p = asKind<Package>(pi.resolvable());
86       if ( fromCache_r )
87       {
88         repo::PackageProvider pkgProvider( _impl->_access, p, repo::DeltaCandidates(), _impl->_packageProviderPolicy );
89         return pkgProvider.providePackageFromCache();
90       }
91       else
92       {
93         repo::DeltaCandidates deltas( _impl->_repos, p->name() );
94         repo::PackageProvider pkgProvider( _impl->_access, p, deltas, _impl->_packageProviderPolicy );
95         return pkgProvider.providePackage();
96       }
97     }
98
99     ///////////////////////////////////////////////////////////////////
100     //
101     //  CLASS NAME : CommitPackageCache
102     //
103     ///////////////////////////////////////////////////////////////////
104
105     CommitPackageCache::CommitPackageCache( Impl * pimpl_r )
106     : _pimpl( pimpl_r )
107     {
108       assert( _pimpl );
109     }
110
111     CommitPackageCache::CommitPackageCache( const Pathname &        rootDir_r,
112                                             const PackageProvider & packageProvider_r )
113     {
114       if ( getenv("ZYPP_COMMIT_NO_PACKAGE_CACHE") )
115         {
116           MIL << "$ZYPP_COMMIT_NO_PACKAGE_CACHE is set." << endl;
117           _pimpl.reset( new Impl( packageProvider_r ) ); // no cache
118         }
119       else
120         {
121           _pimpl.reset( new CommitPackageCacheReadAhead( rootDir_r, packageProvider_r ) );
122         }
123       assert( _pimpl );
124     }
125
126     CommitPackageCache::~CommitPackageCache()
127     {}
128
129     void CommitPackageCache::setCommitList( std::vector<sat::Solvable> commitList_r )
130     { _pimpl->setCommitList( commitList_r ); }
131
132     ManagedFile CommitPackageCache::get( const PoolItem & citem_r )
133     { return _pimpl->get( citem_r ); }
134
135     bool CommitPackageCache::preloaded() const
136     { return _pimpl->preloaded(); }
137
138     void CommitPackageCache::preloaded( bool newval_r )
139     { _pimpl->preloaded( newval_r ); }
140
141     /******************************************************************
142     **
143     **  FUNCTION NAME : operator<<
144     **  FUNCTION TYPE : std::ostream &
145     */
146     std::ostream & operator<<( std::ostream & str, const CommitPackageCache & obj )
147     { return str << *obj._pimpl; }
148
149     /////////////////////////////////////////////////////////////////
150   } // namespace target
151   ///////////////////////////////////////////////////////////////////
152   /////////////////////////////////////////////////////////////////
153 } // namespace zypp
154 ///////////////////////////////////////////////////////////////////