22 #undef ZYPP_BASE_LOGGER_LOGGROUP
23 #define ZYPP_BASE_LOGGER_LOGGROUP "librpmDb"
41 D & operator=(
const D & );
56 D(
const Pathname & root_r,
const Pathname & dbPath_r,
bool readonly_r )
63 ::addMacro( NULL,
"_dbpath", NULL, _dbPath.asString().c_str(), RMIL_CMDLINE );
65 _ts = ::rpmtsCreate();
66 ::rpmtsSetRootDir( _ts,
_root.c_str() );
69 PathInfo master(
_root + _dbPath +
"Packages" );
70 if ( ! master.isFile() )
79 int res = ::rpmtsInitDB( _ts, 0644 );
82 ERR <<
"rpmdbInit error(" << res <<
"): " << *
this << endl;
90 int res = ::rpmtsOpenDB( _ts, (readonly_r ? O_RDONLY : O_RDWR ));
93 ERR <<
"rpmdbOpen error(" << res <<
"): " << *
this << endl;
100 DBG <<
"DBACCESS " << *
this << endl;
120 Pathname librpmDb::_defaultRoot (
"/" );
121 Pathname librpmDb::_defaultDbPath(
"/var/lib/rpm" );
123 bool librpmDb::_dbBlocked (
true );
131 bool librpmDb::globalInit()
133 static bool initialized =
false;
138 int rc = ::rpmReadConfigFiles( NULL, NULL );
141 ERR <<
"rpmReadConfigFiles returned " << rc << endl;
147 #define OUTVAL(n) << " (" #n ":" << expand( "%{" #n "}" ) << ")"
148 MIL <<
"librpm init done:"
162 std::string librpmDb::expand(
const std::string & macro_r )
164 if ( ! globalInit() )
167 char * val = ::rpmExpand( macro_r.c_str(), NULL );
182 librpmDb * librpmDb::newLibrpmDb( Pathname root_r, Pathname dbPath_r,
bool readonly_r )
185 if ( ! (root_r.absolute() && dbPath_r.absolute()) )
191 if ( ! globalInit() )
200 ret =
new librpmDb( root_r, dbPath_r, readonly_r );
218 void librpmDb::dbAccess(
const Pathname & root_r,
const Pathname & dbPath_r )
221 if ( ! (root_r.absolute() && dbPath_r.absolute()) )
229 if ( _defaultRoot == root_r && _defaultDbPath == dbPath_r )
238 _defaultRoot = root_r;
239 _defaultDbPath = dbPath_r;
240 MIL <<
"Set new database location: " <<
stringPath( _defaultRoot, _defaultDbPath ) << endl;
251 void librpmDb::dbAccess()
261 _defaultDb = newLibrpmDb( _defaultRoot, _defaultDbPath,
true );
292 unsigned librpmDb::dbRelease(
bool force_r )
299 unsigned outstanding = _defaultDb->refCount() - 1;
301 switch ( outstanding )
306 DBG <<
"dbRelease: keep access, outstanding " << outstanding << endl;
311 DBG <<
"dbRelease: release" << (force_r && outstanding ?
"(forced)" :
"")
312 <<
", outstanding " << outstanding << endl;
314 _defaultDb->_d._error = shared_ptr<RpmAccessBlockedException>(
new RpmAccessBlockedException(_defaultDb->_d._root, _defaultDb->_d._dbPath));
329 unsigned librpmDb::blockAccess()
331 MIL <<
"Block access" << endl;
333 return dbRelease(
true );
342 void librpmDb::unblockAccess()
344 MIL <<
"Unblock access" << endl;
354 ostream & librpmDb::dumpState( ostream & str )
358 return str <<
"[librpmDb " << (_dbBlocked?
"BLOCKED":
"CLOSED") <<
" " <<
stringPath( _defaultRoot, _defaultDbPath ) <<
"]";
360 return str <<
"[" << _defaultDb <<
"]";
377 librpmDb::librpmDb(
const Pathname & root_r,
const Pathname & dbPath_r,
bool readonly_r )
378 : _d( * new
D( root_r, dbPath_r, readonly_r ) )
402 if ( refCount_r == 1 )
478 return rpmtsGetRdb(
_d.
_ts);
509 , _dbPath( dbPath_r )
512 if ( ! (root_r.absolute() && dbPath_r.absolute()) )
514 ERR <<
"Relative path for root(" <<
_root <<
") or dbPath(" <<
_dbPath <<
")" << endl;
522 DBG << *
this << endl;
538 DBG << *
this << endl;
551 str <<
"ILLEGAL: '(" << obj.
root() <<
")" << obj.
dbPath() <<
"'";
555 str <<
"'(" << obj.
root() <<
")" << obj.
dbPath() <<
"':" << endl;
556 str <<
" Dir: " << obj.
_dbDir << endl;
557 str <<
" V4: " << obj.
_dbV4 << endl;
558 str <<
" V3: " << obj.
_dbV3 << endl;
598 WAR <<
"No database access: " << _dberr << endl;
611 ::rpmdbFreeIterator( _mi );
619 bool create(
int rpmtag,
const void * keyp = NULL,
size_t keylen = 0 )
624 _mi = ::rpmtsInitIterator( _dbptr->_d._ts, rpmTag(rpmtag), keyp, keylen );
636 _mi = ::rpmdbFreeIterator( _mi );
639 if ( _dbptr && _dbptr->error() )
641 _dberr = _dbptr->error();
642 WAR <<
"Lost database access: " << _dberr << endl;
656 Header h = ::rpmdbNextIterator( _mi );
669 bool init(
int rpmtag,
const void * keyp = NULL,
size_t keylen = 0 )
671 if ( ! create( rpmtag, keyp, keylen ) )
680 bool set(
int off_r )
682 if ( ! create( RPMDBI_PACKAGES ) )
684 #warning TESTCASE: rpmdbAppendIterator and (non)sequential access?
685 #ifdef RPMFILEITERMAX // since rpm.4.12
686 ::rpmdbAppendIterator( _mi, (
const unsigned *)&off_r, 1 );
688 ::rpmdbAppendIterator( _mi, &off_r, 1 );
695 return( _mi ? ::rpmdbGetIteratorOffset( _mi ) : 0 );
702 int ret = ::rpmdbGetIteratorCount( _mi );
703 #warning TESTCASE: rpmdbGetIteratorCount returns 0 on sequential access?
704 return( ret ? ret : -1 );
723 :
_d( * new
D( dbptr_r ) )
781 return _d._dbptr->error();
794 str <<
"db_const_iterator(" << obj.
_d._dbptr
795 <<
" Size:" << obj.
_d.size()
796 <<
" HdrNum:" << obj.
_d.offset()
809 return _d.init( RPMDBI_PACKAGES );
820 return _d.init( RPMTAG_BASENAMES, file_r.c_str() );
831 return _d.init( RPMTAG_PROVIDENAME, tag_r.c_str() );
842 return _d.init( RPMTAG_REQUIRENAME, tag_r.c_str() );
853 return _d.init( RPMTAG_CONFLICTNAME, tag_r.c_str() );
864 return _d.init( RPMTAG_NAME, name_r.c_str() );
875 if ( !
_d.init( RPMTAG_NAME, name_r.c_str() ) )
878 if (
_d.size() == 1 )
884 for ( ; operator*(); operator++() )
886 if (
operator*()->tag_installtime() > itime )
889 itime = operator*()->tag_installtime();
893 return _d.set( match );
904 if ( !
_d.init( RPMTAG_NAME, name_r.c_str() ) )
907 for ( ; operator*(); operator++() )
909 if ( ed_r ==
operator*()->tag_edition() )
911 int match =
_d.offset();
912 return _d.set( match );
930 return findPackage( which_r->name(), which_r->edition() );