backup
[platform/upstream/libzypp.git] / zypp / sat / Pool.cc
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/sat/Pool.cc
10  *
11 */
12
13 extern "C"
14 {
15 #include <stdio.h>
16 #include <satsolver/repo_solv.h>
17 #include <satsolver/pool.h>
18 }
19 #include <cstdio>
20 #include <iostream>
21 #include <set>
22
23 #include "zypp/base/Logger.h"
24 #include "zypp/base/Gettext.h"
25 #include "zypp/base/Exception.h"
26
27 #include "zypp/sat/Pool.h"
28 #include "zypp/sat/Repo.h"
29
30 ///////////////////////////////////////////////////////////////////
31 namespace zypp
32 { /////////////////////////////////////////////////////////////////
33   ///////////////////////////////////////////////////////////////////
34   namespace sat
35   { /////////////////////////////////////////////////////////////////
36
37     ///////////////////////////////////////////////////////////////////
38     //
39     //  CLASS NAME : Pool
40     //
41     ///////////////////////////////////////////////////////////////////
42
43     ///////////////////////////////////////////////////////////////////
44     //
45     //  METHOD NAME : Pool::Pool
46     //  METHOD TYPE : Ctor
47     //
48     Pool::Pool()
49       : _raii( ::pool_create(), ::pool_free )
50       , _pool( *_raii.value() )
51     {
52       if ( _raii == NULL )
53       {
54         _raii.resetDispose(); // no call to ::pool_free
55         ZYPP_THROW( Exception( _("Can not create sat-pool.") ) );
56       }
57     }
58
59     ///////////////////////////////////////////////////////////////////
60     //
61     //  METHOD NAME : Pool::~Pool
62     //  METHOD TYPE : Dtor
63     //
64     Pool::~Pool()
65     {}
66
67     unsigned Pool::reposSize() const
68     { return _pool.nrepos; }
69
70     RepoIterator Pool::reposBegin() const
71     { return make_transform_iterator( _pool.repos, detail::mkRepo() ); }
72
73     RepoIterator Pool::reposEnd() const
74     { return make_transform_iterator( _pool.repos+_pool.nrepos, detail::mkRepo() ); }
75
76
77     unsigned Pool::solvablesSize() const
78     { return _pool.nsolvables;}
79
80     SolvableIterator Pool::solvablesBegin() const
81     { return SolvableIterator( _pool.solvables ); }
82
83     SolvableIterator Pool::solvablesEnd() const
84     { return SolvableIterator( _pool.solvables+_pool.nsolvables ); }
85
86
87     void Pool::t() const
88     {
89       if ( _pool.nrepos )
90       {
91         SEC << (void*)(*_pool.repos)<< Repo( *_pool.repos ) << " " << (*_pool.repos)->name << std::endl;
92       }
93       else
94       {
95         SEC << "NOREPO" << std::endl;
96       }
97
98     }
99
100     Repo Pool::addRepoSolv( const Pathname & file_r )
101     {
102       AutoDispose<FILE*> file( ::fopen( file_r.c_str(), "r" ), ::fclose );
103       if ( file == NULL )
104       {
105         file.resetDispose();
106         return Repo();
107       }
108
109 #warning Workaround sat-repo not doing strdup on name.
110       // simply spend a static array of reponames
111       static std::set<std::string> _reponames;
112       return ::pool_addrepo_solv( &_pool, file, _reponames.insert( file_r.asString() ).first->c_str() );
113     }
114
115     /******************************************************************
116     **
117     **  FUNCTION NAME : operator<<
118     **  FUNCTION TYPE : std::ostream &
119     */
120     std::ostream & operator<<( std::ostream & str, const Pool & obj )
121     {
122       return str << "sat::pool(){"
123           << obj.reposSize() << "repos|"
124           << obj.solvablesSize() << "slov}";
125
126     }
127
128     /////////////////////////////////////////////////////////////////
129   } // namespace sat
130   ///////////////////////////////////////////////////////////////////
131   /////////////////////////////////////////////////////////////////
132 } // namespace zypp
133 ///////////////////////////////////////////////////////////////////