460acf781d08b41815ac349689d0d7479c3d4200
[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_r, bool fromCache_r )
84     {
85       ManagedFile ret;
86       if ( fromCache_r )
87       {
88         repo::PackageProvider pkgProvider( _impl->_access, pi_r, _impl->_packageProviderPolicy );
89         ret = pkgProvider.providePackageFromCache();
90       }
91       else if ( pi_r.satSolvable().isKind<Package>() )  // may make use of deltas
92       {
93         repo::DeltaCandidates deltas( _impl->_repos, pi_r.satSolvable().name() );
94         repo::PackageProvider pkgProvider( _impl->_access, pi_r, deltas, _impl->_packageProviderPolicy );
95         return pkgProvider.providePackage();
96       }
97       else      // SrcPackage or throws
98       {
99         repo::PackageProvider pkgProvider( _impl->_access, pi_r, _impl->_packageProviderPolicy );
100         return pkgProvider.providePackage();
101       }
102       return ret;
103     }
104
105     ///////////////////////////////////////////////////////////////////
106     //
107     //  CLASS NAME : CommitPackageCache
108     //
109     ///////////////////////////////////////////////////////////////////
110
111     CommitPackageCache::CommitPackageCache( Impl * pimpl_r )
112     : _pimpl( pimpl_r )
113     {
114       assert( _pimpl );
115     }
116
117     CommitPackageCache::CommitPackageCache( const Pathname &        rootDir_r,
118                                             const PackageProvider & packageProvider_r )
119     {
120       if ( getenv("ZYPP_COMMIT_NO_PACKAGE_CACHE") )
121         {
122           MIL << "$ZYPP_COMMIT_NO_PACKAGE_CACHE is set." << endl;
123           _pimpl.reset( new Impl( packageProvider_r ) ); // no cache
124         }
125       else
126         {
127           _pimpl.reset( new CommitPackageCacheReadAhead( rootDir_r, packageProvider_r ) );
128         }
129       assert( _pimpl );
130     }
131
132     CommitPackageCache::~CommitPackageCache()
133     {}
134
135     void CommitPackageCache::setCommitList( std::vector<sat::Solvable> commitList_r )
136     { _pimpl->setCommitList( commitList_r ); }
137
138     ManagedFile CommitPackageCache::get( const PoolItem & citem_r )
139     { return _pimpl->get( citem_r ); }
140
141     bool CommitPackageCache::preloaded() const
142     { return _pimpl->preloaded(); }
143
144     void CommitPackageCache::preloaded( bool newval_r )
145     { _pimpl->preloaded( newval_r ); }
146
147     /******************************************************************
148     **
149     **  FUNCTION NAME : operator<<
150     **  FUNCTION TYPE : std::ostream &
151     */
152     std::ostream & operator<<( std::ostream & str, const CommitPackageCache & obj )
153     { return str << *obj._pimpl; }
154
155     /////////////////////////////////////////////////////////////////
156   } // namespace target
157   ///////////////////////////////////////////////////////////////////
158   /////////////////////////////////////////////////////////////////
159 } // namespace zypp
160 ///////////////////////////////////////////////////////////////////