~thopiekar/zypper/libzypp-manual-import

« back to all changes in this revision

Viewing changes to zypp/sat/Pool.cc

  • Committer: Thomas-Karl Pietrowski
  • Date: 2015-08-15 15:59:50 UTC
  • Revision ID: thopiekar@googlemail.com-20150815155950-j66qn38efmvn289t
syncing with "changes 15.13.0 (11)"  #9a0aca7e3a21d768491b141a8ae86ef0c3fbc227
* https://github.com/openSUSE/libzypp/commit/9a0aca7e3a21d768491b141a8ae86ef0c3fbc227

Show diffs side-by-side

added added

removed removed

Lines of Context:
9
9
/** \file       zypp/sat/Pool.cc
10
10
 *
11
11
*/
 
12
#include <sys/types.h>
 
13
#include <sys/stat.h>
 
14
#include <fcntl.h>
 
15
 
 
16
extern "C"
 
17
{
 
18
#include <solv/pool.h>
 
19
#include <solv/repo.h>
 
20
#include <solv/solvable.h>
 
21
}
12
22
 
13
23
#include <iostream>
 
24
#include <fstream>
14
25
 
15
26
#include "zypp/base/Easy.h"
16
27
#include "zypp/base/Logger.h"
23
34
#include "zypp/sat/Pool.h"
24
35
#include "zypp/sat/LookupAttr.h"
25
36
 
 
37
using std::endl;
 
38
 
26
39
///////////////////////////////////////////////////////////////////
27
40
namespace zypp
28
41
{ /////////////////////////////////////////////////////////////////
214
227
    bool Pool::isRequestedLocale( const Locale & locale_r ) const
215
228
    { return myPool().isRequestedLocale( locale_r ); }
216
229
 
 
230
    void Pool::initRequestedLocales( const LocaleSet & locales_r )      { myPool().initRequestedLocales( locales_r ); }
 
231
    const LocaleSet & Pool::getAddedRequestedLocales() const            { return myPool().getAddedRequestedLocales(); }
 
232
    const LocaleSet & Pool::getRemovedRequestedLocales() const          { return myPool().getRemovedRequestedLocales(); }
 
233
 
217
234
    const LocaleSet & Pool::getAvailableLocales() const
218
235
    {  return myPool().getAvailableLocales(); }
219
236
 
220
237
    bool Pool::isAvailableLocale( const Locale & locale_r ) const
221
238
    { return myPool().isAvailableLocale( locale_r ); }
222
239
 
223
 
    bool Pool::multiversionEmpty() const                        { return myPool().multiversionList().empty(); }
224
 
    size_t Pool::multiversionSize() const                       { return myPool().multiversionList().size(); }
225
 
    Pool::MultiversionIterator Pool::multiversionBegin() const  { return myPool().multiversionList().begin(); }
226
 
    Pool::MultiversionIterator Pool::multiversionEnd() const    { return myPool().multiversionList().end(); }
227
 
    bool Pool::isMultiversion( IdString ident_r ) const         { return myPool().isMultiversion( ident_r ); }
 
240
    const  Pool::MultiversionList &  Pool::multiversion() const
 
241
    { return myPool().multiversionList(); }
228
242
 
229
243
    Queue Pool::autoInstalled() const                           { return myPool().autoInstalled(); }
230
244
    void Pool::setAutoInstalled( const Queue & autoInstalled_r ){ myPool().setAutoInstalled( autoInstalled_r ); }
243
257
    }
244
258
 
245
259
    /////////////////////////////////////////////////////////////////
 
260
    #undef ZYPP_BASE_LOGGER_LOGGROUP
 
261
    #define ZYPP_BASE_LOGGER_LOGGROUP "solvidx"
 
262
 
 
263
    void updateSolvFileIndex( const Pathname & solvfile_r )
 
264
    {
 
265
      AutoDispose<FILE*> solv( ::fopen( solvfile_r.c_str(), "re" ), ::fclose );
 
266
      if ( solv == NULL )
 
267
      {
 
268
        solv.resetDispose();
 
269
        ERR << "Can't open solv-file: " << solv << endl;
 
270
        return;
 
271
      }
 
272
 
 
273
      std::string solvidxfile( solvfile_r.extend(".idx").asString() );
 
274
      if ( ::unlink( solvidxfile.c_str() ) == -1 && errno != ENOENT )
 
275
      {
 
276
        ERR << "Can't unlink solv-idx: " << Errno() << endl;
 
277
        return;
 
278
      }
 
279
      {
 
280
        int fd = ::open( solvidxfile.c_str(), O_CREAT|O_EXCL|O_WRONLY|O_TRUNC, 0644 );
 
281
        if ( fd == -1 )
 
282
        {
 
283
          ERR << "Can't create solv-idx: " << Errno() << endl;
 
284
          return;
 
285
        }
 
286
        ::close( fd );
 
287
      }
 
288
      std::ofstream idx( solvidxfile.c_str() );
 
289
 
 
290
 
 
291
      ::_Pool * _pool = ::pool_create();
 
292
      ::_Repo * _repo = ::repo_create( _pool, "" );
 
293
      if ( ::repo_add_solv( _repo, solv, 0 ) == 0 )
 
294
      {
 
295
        int _id = 0;
 
296
        ::_Solvable * _solv = nullptr;
 
297
        FOR_REPO_SOLVABLES( _repo, _id, _solv )
 
298
        {
 
299
          if ( _solv )
 
300
          {
 
301
#define SEP '\t'
 
302
#define idstr(V) pool_id2str( _pool, _solv->V )
 
303
            if ( _solv->arch == ARCH_SRC || _solv->arch == ARCH_NOSRC )
 
304
              idx << "srcpackage:" << idstr(name) << SEP << idstr(evr) << SEP << "noarch" << endl;
 
305
            else
 
306
              idx << idstr(name) << SEP << idstr(evr) << SEP << idstr(arch) << endl;
 
307
          }
 
308
        }
 
309
      }
 
310
      else
 
311
      {
 
312
        ERR << "Can't read solv-file: " << ::pool_errstr( _pool ) << endl;
 
313
      }
 
314
      ::repo_free( _repo, 0 );
 
315
      ::pool_free( _pool );
 
316
    }
 
317
 
 
318
    /////////////////////////////////////////////////////////////////
246
319
  } // namespace sat
247
320
  ///////////////////////////////////////////////////////////////////
248
321
  /////////////////////////////////////////////////////////////////