-// METHOD NAME : RpmDb::internal_initDatabase
-// METHOD TYPE : PMError
-//
-void RpmDb::internal_initDatabase( const Pathname & root_r, const Pathname & dbPath_r,
- DbStateInfoBits & info_r )
-{
- info_r = DbSI_NO_INIT;
-
- ///////////////////////////////////////////////////////////////////
- // Get info about the desired database dir
- ///////////////////////////////////////////////////////////////////
- librpmDb::DbDirInfo dbInfo( root_r, dbPath_r );
-
- if ( dbInfo.illegalArgs() )
- {
- // should not happen (checked in initDatabase)
- ZYPP_THROW(RpmInvalidRootException(root_r, dbPath_r));
- }
- if ( ! dbInfo.usableArgs() )
- {
- ERR << "Bad database directory: " << dbInfo.dbDir() << endl;
- ZYPP_THROW(RpmInvalidRootException(root_r, dbPath_r));
- }
-
- if ( dbInfo.hasDbV4() )
- {
- dbsi_set( info_r, DbSI_HAVE_V4 );
- MIL << "Found rpm4 database in " << dbInfo.dbDir() << endl;
- }
- else
- {
- MIL << "Creating new rpm4 database in " << dbInfo.dbDir() << endl;
- }
-
- if ( dbInfo.hasDbV3() )
- {
- dbsi_set( info_r, DbSI_HAVE_V3 );
- }
- if ( dbInfo.hasDbV3ToV4() )
- {
- dbsi_set( info_r, DbSI_HAVE_V3TOV4 );
- }
-
- DBG << "Initial state: " << info_r << ": " << stringPath( root_r, dbPath_r );
- librpmDb::dumpState( DBG ) << endl;
-
- ///////////////////////////////////////////////////////////////////
- // Access database, create if needed
- ///////////////////////////////////////////////////////////////////
-
- // creates dbdir and empty rpm4 database if not present
- librpmDb::dbAccess( root_r, dbPath_r );
-
- if ( ! dbInfo.hasDbV4() )
- {
- dbInfo.restat();
- if ( dbInfo.hasDbV4() )
- {
- dbsi_set( info_r, DbSI_HAVE_V4 | DbSI_MADE_V4 );
- }
- }
-
- DBG << "Access state: " << info_r << ": " << stringPath( root_r, dbPath_r );
- librpmDb::dumpState( DBG ) << endl;
-
- ///////////////////////////////////////////////////////////////////
- // Check whether to convert something. Create backup but do
- // not remove anything here
- ///////////////////////////////////////////////////////////////////
- librpmDb::constPtr dbptr;
- librpmDb::dbAccess( dbptr );
- bool dbEmpty = dbptr->empty();
- if ( dbEmpty )
- {
- MIL << "Empty rpm4 database " << dbInfo.dbV4() << endl;
- }
-
- if ( dbInfo.hasDbV3() )
- {
- MIL << "Found rpm3 database " << dbInfo.dbV3() << endl;
-
- if ( dbEmpty )
- {
- extern void convertV3toV4( const Pathname & v3db_r, const librpmDb::constPtr & v4db_r );
- convertV3toV4( dbInfo.dbV3().path(), dbptr );
-
- // create a backup copy
- int res = filesystem::copy( dbInfo.dbV3().path(), dbInfo.dbV3ToV4().path() );
- if ( res )
- {
- WAR << "Backup converted rpm3 database failed: error(" << res << ")" << endl;
- }
- else
- {
- dbInfo.restat();
- if ( dbInfo.hasDbV3ToV4() )
- {
- MIL << "Backup converted rpm3 database: " << dbInfo.dbV3ToV4() << endl;
- dbsi_set( info_r, DbSI_HAVE_V3TOV4 | DbSI_MADE_V3TOV4 );
- }
- }
-
- }
- else
- {
-
- WAR << "Non empty rpm3 and rpm4 database found: using rpm4" << endl;
- // set DbSI_MODIFIED_V4 as it's not a temporary which can be removed.
- dbsi_set( info_r, DbSI_MODIFIED_V4 );
-
- }
-
- DBG << "Convert state: " << info_r << ": " << stringPath( root_r, dbPath_r );
- librpmDb::dumpState( DBG ) << endl;
- }
-
- if ( dbInfo.hasDbV3ToV4() )
- {
- MIL << "Rpm3 database backup: " << dbInfo.dbV3ToV4() << endl;
- }
-}
-
-///////////////////////////////////////////////////////////////////
-//
-//
-// METHOD NAME : RpmDb::removeV4
-// METHOD TYPE : void
-//
-void RpmDb::removeV4( const Pathname & dbdir_r, bool v3backup_r )
-{
- const char * v3backup = "packages.rpm3";
- const char * master = "Packages";
- const char * index[] =
- {
- "Basenames",
- "Conflictname",
- "Depends",
- "Dirnames",
- "Filemd5s",
- "Group",
- "Installtid",
- "Name",
- "Providename",
- "Provideversion",
- "Pubkeys",
- "Requirename",
- "Requireversion",
- "Sha1header",
- "Sigmd5",
- "Triggername",
- // last entry!
- NULL
- };
-
- PathInfo pi( dbdir_r );
- if ( ! pi.isDir() )
- {
- ERR << "Can't remove rpm4 database in non directory: " << dbdir_r << endl;
- return;
- }
-
- for ( const char ** f = index; *f; ++f )
- {
- pi( dbdir_r + *f );
- if ( pi.isFile() )
- {
- filesystem::unlink( pi.path() );
- }
- }
-
- pi( dbdir_r + master );
- if ( pi.isFile() )
- {
- MIL << "Removing rpm4 database " << pi << endl;
- filesystem::unlink( pi.path() );
- }
-
- if ( v3backup_r )
- {
- pi( dbdir_r + v3backup );
- if ( pi.isFile() )
- {
- MIL << "Removing converted rpm3 database backup " << pi << endl;
- filesystem::unlink( pi.path() );
- }
- }
-}
-
-///////////////////////////////////////////////////////////////////
-//
-//
-// METHOD NAME : RpmDb::removeV3
-// METHOD TYPE : void
-//
-void RpmDb::removeV3( const Pathname & dbdir_r, bool v3backup_r )
-{
- const char * master = "packages.rpm";
- const char * index[] =
- {
- "conflictsindex.rpm",
- "fileindex.rpm",
- "groupindex.rpm",
- "nameindex.rpm",
- "providesindex.rpm",
- "requiredby.rpm",
- "triggerindex.rpm",
- // last entry!
- NULL
- };
-
- PathInfo pi( dbdir_r );
- if ( ! pi.isDir() )
- {
- ERR << "Can't remove rpm3 database in non directory: " << dbdir_r << endl;
- return;
- }
-
- for ( const char ** f = index; *f; ++f )
- {
- pi( dbdir_r + *f );
- if ( pi.isFile() )
- {
- filesystem::unlink( pi.path() );
- }
- }
-
-#warning CHECK: compare vs existing v3 backup. notify root
- pi( dbdir_r + master );
- if ( pi.isFile() )
- {
- Pathname m( pi.path() );
- if ( v3backup_r )
- {
- // backup was already created
- filesystem::unlink( m );
- Pathname b( m.extend( "3" ) );
- pi( b ); // stat backup
- }
- else
- {
- Pathname b( m.extend( ".deleted" ) );
- pi( b );
- if ( pi.isFile() )
- {
- // rempve existing backup
- filesystem::unlink( b );
- }
- filesystem::rename( m, b );
- pi( b ); // stat backup
- }
- MIL << "(Re)moved rpm3 database to " << pi << endl;
- }
-}
-
-///////////////////////////////////////////////////////////////////
-//
-//
-// METHOD NAME : RpmDb::modifyDatabase
-// METHOD TYPE : void
-//
-void RpmDb::modifyDatabase()
-{
- if ( ! initialized() )
- return;
-
- // tag database as modified
- dbsi_set( _dbStateInfo, DbSI_MODIFIED_V4 );
-
- // Move outdated rpm3 database beside.
- if ( dbsi_has( _dbStateInfo, DbSI_HAVE_V3 ) )
- {
- MIL << "Update mode: Delayed cleanup: state " << _dbStateInfo << endl;
- removeV3( _root + _dbPath, dbsi_has( _dbStateInfo, DbSI_MADE_V3TOV4 ) );
- dbsi_clr( _dbStateInfo, DbSI_HAVE_V3 );
- }
-}
-
-///////////////////////////////////////////////////////////////////
-//
-//