openpkg/rpmdb

changeset 428
f880f219c566
parent 13
cb59d6afeb61
     1.1 --- a/openpkg/rpmdb	Tue Jul 31 12:12:54 2012 +0200
     1.2 +++ b/openpkg/rpmdb	Tue Jul 31 12:23:42 2012 +0200
     1.3 @@ -1,15 +1,14 @@
     1.4  #!@l_prefix@/lib/openpkg/bash
     1.5  ##
     1.6  ##  rpmdb -- OpenPKG RPM Database Administration Utility
     1.7 -##  Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/>
     1.8 -##  Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/>
     1.9 +##  Copyright (c) 2000-2012 OpenPKG GmbH <http://openpkg.com/>
    1.10  ##
    1.11 -##  Permission to use, copy, modify, and distribute this software for
    1.12 -##  any purpose with or without fee is hereby granted, provided that
    1.13 -##  the above copyright notice and this permission notice appear in all
    1.14 -##  copies.
    1.15 +##  This software is property of the OpenPKG GmbH, DE MUC HRB 160208.
    1.16 +##  All rights reserved. Licenses which grant limited permission to use,
    1.17 +##  copy, modify and distribute this software are available from the
    1.18 +##  OpenPKG GmbH.
    1.19  ##
    1.20 -##  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
    1.21 +##  THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
    1.22  ##  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    1.23  ##  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
    1.24  ##  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
    1.25 @@ -30,6 +29,8 @@
    1.26  help=""
    1.27  prefix="@l_prefix@"
    1.28  dbpath=""
    1.29 +dbapi=""
    1.30 +tmpdir=""
    1.31  rpm=""
    1.32  musr="@l_musr@"
    1.33  mgrp="@l_mgrp@"
    1.34 @@ -42,6 +43,7 @@
    1.35  ##
    1.36  
    1.37  #   iterate over argument line
    1.38 +args=""
    1.39  for opt
    1.40  do
    1.41      case $opt in
    1.42 @@ -51,6 +53,7 @@
    1.43      case $opt in
    1.44          -h|--help      ) help="Usage"  ;;
    1.45          -B|--build     ) mode=build    ;;
    1.46 +        -M|--migrate   ) mode=migrate  ;;
    1.47          -R|--rebuild   ) mode=rebuild  ;;
    1.48          -C|--cleanup   ) mode=cleanup  ;;
    1.49          -F|--fixate    ) mode=fixate   ;;
    1.50 @@ -60,14 +63,19 @@
    1.51          -v|--verbose   ) verbose=`expr $verbose + 1` ;;
    1.52          --prefix=*     ) prefix=$arg   ;;
    1.53          --dbpath=*     ) dbpath=$arg   ;;
    1.54 +        --dblib=*      ) dblib=$arg    ;;
    1.55 +        --tmpdir=*     ) tmpdir=$arg   ;;
    1.56          --rpm=*        ) rpm=$arg      ;;
    1.57          --musr=*       ) musr=$arg     ;;
    1.58          --mgrp=*       ) mgrp=$arg     ;;
    1.59 -        *              ) help="Invalid option \`$opt'"; break ;;
    1.60 +        --             ) ;;
    1.61 +        -*             ) help="Invalid option \`$opt'"; break ;;
    1.62 +        *              ) args="$args \"$opt\"" ;;
    1.63      esac
    1.64  done
    1.65 +eval "set -- $args"
    1.66  
    1.67 -#   makre sure exactly one run-time mode is specified
    1.68 +#   make sure exactly one run-time mode is specified
    1.69  if [ ".$mode" = . ]; then
    1.70      help="No or invalid run-time mode specified"
    1.71  fi
    1.72 @@ -82,6 +90,7 @@
    1.73  
    1.74    -h, --help        print usage message (this one)
    1.75    -B, --build       build new RPM database from scratch
    1.76 +  -M, --migrate     migrate RPM database to new format
    1.77    -R, --rebuild     rebuild new from old RPM database
    1.78    -C, --cleanup     cleanup existing RPM database
    1.79    -F, --fixate      fixate existing RPM database
    1.80 @@ -91,12 +100,14 @@
    1.81    -v, --verbose     operate in more verbose mode (increase verbose level)
    1.82    --prefix=PREFIX   use OpenPKG instance under PREFIX
    1.83    --dbpath=PATH     use OpenPKG RPM database under PATH
    1.84 +  --dblib=LIB       use OpenPKG RPM database backend library ("db" or "sqlite")
    1.85 +  --tmpdir=PATH     use OpenPKG temporary directory under PATH
    1.86    --rpm=PROG        use OpenPKG RPM executable PROG
    1.87    --musr=USERNAME   use OpenPKG management user USERNAME
    1.88    --mgrp=GROUPNAME  use OpenPKG management group GROUPNAME
    1.89  
    1.90  This is OpenPKG rpmdb, an RPM database administration utility, providing
    1.91 -lower-level maintainance functions for the Berkeley-DB 4.1 based RPM 4.2
    1.92 +lower-level maintainance functions for the Berkeley-DB based RPM
    1.93  database. It allows building new RPM databases from scratch, rebuilding
    1.94  a new from an old RPM database (content dumping and reloading),
    1.95  cleaning up problems on an existing RPM database (removal of DB region
    1.96 @@ -115,6 +126,12 @@
    1.97  if [ ".$dbpath" = . ]; then
    1.98      dbpath="$prefix/RPM/DB"
    1.99  fi
   1.100 +if [ ".$dblib" = . ]; then
   1.101 +    dblib="${1-db}"
   1.102 +fi
   1.103 +if [ ".$tmpdir" = . ]; then
   1.104 +    tmpdir="$prefix/RPM/TMP"
   1.105 +fi
   1.106  if [ ".$rpm" = . ]; then
   1.107      rpm="$prefix/bin/openpkg rpm"
   1.108  fi
   1.109 @@ -124,32 +141,61 @@
   1.110  ##
   1.111  
   1.112  dbfiles="
   1.113 -    hash:Basenames
   1.114 -    hash:Conflictname
   1.115 -    hash:Depends
   1.116 -    btree:Dirnames
   1.117 -    hash:Filemd5s
   1.118 -    hash:Group
   1.119 -    btree:Installtid
   1.120 -    hash:Name
   1.121 -    hash:Packages
   1.122 -    hash:Providename
   1.123 -    btree:Provideversion
   1.124 -    hash:Pubkeys
   1.125 -    hash:Requirename
   1.126 -    btree:Requireversion
   1.127 -    hash:Sha1header
   1.128 -    hash:Sigmd5
   1.129 -    hash:Triggername
   1.130 -    region:__db.001
   1.131 -    region:__db.002
   1.132 -    region:__db.003
   1.133 -    region:__db.004
   1.134 -    region:__db.005
   1.135 -    region:__db.006
   1.136 -    region:__db.007
   1.137 -    region:__db.008
   1.138 -    region:__db.009
   1.139 +    3:btree:Basenames
   1.140 +    3:btree:Conflictname
   1.141 +    3:temporary:Depends
   1.142 +    3:btree:Dirnames
   1.143 +    3:btree:Filedigests
   1.144 +    3:btree:Filepaths
   1.145 +    3:btree:Group
   1.146 +    3:btree:Installtid
   1.147 +    3:btree:Name
   1.148 +    3:hash:Packagecolor
   1.149 +    3:btree:Packages
   1.150 +    3:btree:Providename
   1.151 +    3:btree:Provideversion
   1.152 +    3:hash:Pubkeys
   1.153 +    3:btree:Requirename
   1.154 +    3:btree:Requireversion
   1.155 +    3:hash:Sha1header
   1.156 +    3:hash:Sigmd5
   1.157 +    3:btree:Triggername
   1.158 +    3:btree:Obsoletename
   1.159 +    3:btree:Nvra
   1.160 +    3:btree:Sourcepkgid
   1.161 +    3:btree:BuildEnvironment
   1.162 +    3:region:__db.001
   1.163 +    3:region:__db.002
   1.164 +    3:region:__db.003
   1.165 +    3:region:__db.004
   1.166 +    3:region:__db.005
   1.167 +    3:region:__db.006
   1.168 +    3:region:__db.007
   1.169 +    3:region:__db.008
   1.170 +    3:region:__db.009
   1.171 +    4:*:Basenames
   1.172 +    4:*:Conflictname
   1.173 +    4:temporary:Depends
   1.174 +    4:*:Dirnames
   1.175 +    4:*:Filedigests
   1.176 +    4:*:Filepaths
   1.177 +    4:*:Group
   1.178 +    4:*:Installtid
   1.179 +    4:*:Name
   1.180 +    4:*:Packagecolor
   1.181 +    4:*:Packages
   1.182 +    4:*:Providename
   1.183 +    4:*:Provideversion
   1.184 +    4:*:Pubkeys
   1.185 +    4:*:Requirename
   1.186 +    4:*:Requireversion
   1.187 +    4:*:Sha1header
   1.188 +    4:*:Sigmd5
   1.189 +    4:*:Triggername
   1.190 +    4:*:Obsoletename
   1.191 +    4:*:Nvra
   1.192 +    4:*:Sourcepkgid
   1.193 +    4:*:BuildEnvironment
   1.194  "
   1.195  
   1.196  ##
   1.197 @@ -180,8 +226,45 @@
   1.198      fi
   1.199  }
   1.200  
   1.201 +rpmdb_version_load () {
   1.202 +    if [ -f $dbpath/VERSION ]; then
   1.203 +        eval `(. $dbpath/VERSION || exit $?; echo "DBAPI=\"$DBAPI\"; DBLIB=\"$DBLIB\"; DBVER=\"$DBVER\"")`
   1.204 +    fi
   1.205 +    if [ ".$DBAPI" = . ]; then DBAPI="3";     fi
   1.206 +    if [ ".$DBLIB" = . ]; then DBLIB="db";    fi
   1.207 +    if [ ".$DBVER" = . ]; then DBVER="4.1.2"; fi
   1.208 +}
   1.209 +
   1.210 +rpmdb_version_save () {
   1.211 +    if [ ".$DBAPI" = .3 ]; then
   1.212 +        DBLIB="db"
   1.213 +        DBVER=`$rpmdb_load -V 2>&1 |\
   1.214 +            grep 'Berkeley DB [0-9][0-9]*\.[0-9][0-9]*' |\
   1.215 +            sed -e 's;^;X;' \
   1.216 +                -e 's;^X[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$;\1;' \
   1.217 +                -e 's;^X[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$;\1.0;' \
   1.218 +                -e 's;^X.*$;0.0.0;'`
   1.219 +    elif [ ".$DBAPI" = .4 ]; then
   1.220 +        DBLIB="sqlite"
   1.221 +        DBVER=`$rpmdb_sqlite --version 2>&1 |\
   1.222 +            grep '^[0-9][0-9]*\.[0-9][0-9]*' |\
   1.223 +            sed -e 's;^;X;' \
   1.224 +                -e 's;^X[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$;\1;' \
   1.225 +                -e 's;^X[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$;\1.0;' \
   1.226 +                -e 's;^X.*$;0.0.0;'`
   1.227 +    fi
   1.228 +    ( echo "DBAPI=$DBAPI"
   1.229 +      echo "DBLIB=$DBLIB"
   1.230 +      echo "DBVER=$DBVER"
   1.231 +    ) >$dbpath/VERSION.new || exit $?
   1.232 +    mv $dbpath/VERSION.new $dbpath/VERSION || exit $?
   1.233 +    chown $musr:$mgrp $dbpath/VERSION 2>/dev/null || true
   1.234 +    chmod 644 $dbpath/VERSION 2>/dev/null || true
   1.235 +}
   1.236 +
   1.237  rpm () {
   1.238 -    local opts="--dbpath `echo $dbpath | sed -e 's;/*$;;' -e 's;$;/;'`"
   1.239 +    local opts="--define '_dbpath `echo $dbpath | sed -e 's;/*$;;' -e 's;$;/;'`'"
   1.240 +    opts="$opts --define '_repackage_all_erasures 0'"
   1.241      if [ ".$force" = .yes ]; then
   1.242          opts="$opts --define '__dbi_private yes'"
   1.243      fi
   1.244 @@ -189,13 +272,9 @@
   1.245      eval "$rpm $opts \"\$@\""
   1.246  }
   1.247  
   1.248 -rpmdb_load () {
   1.249 -    $prefix/lib/openpkg/rpmdb_load ${1+"$@"}
   1.250 -}
   1.251 -
   1.252 -rpmdb_dump () {
   1.253 -    $prefix/lib/openpkg/rpmdb_dump ${1+"$@"}
   1.254 -}
   1.255 +rpmdb_load="$prefix/lib/openpkg/db_tool load"
   1.256 +rpmdb_dump="$prefix/lib/openpkg/db_tool dump"
   1.257 +rpmdb_sqlite="$prefix/lib/openpkg/sqlite3"
   1.258  
   1.259  ##
   1.260  ##  RPM DATABASE OPERATIONS
   1.261 @@ -225,60 +304,61 @@
   1.262      #   remove all known files
   1.263      verbose 2 "removing (possibly existing) old RPM database DB files"
   1.264      for dbfile in $dbfiles; do
   1.265 -        eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\)$/dbtype="\1"; dbfile="\2";/'`
   1.266 -        verbose 3 "removing database file: $dbpath/$dbfile ($dbtype)"
   1.267 +        eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'`
   1.268 +        verbose 3 "removing database file: $dbpath/$dbfile ($dbapi:$dbtype)"
   1.269          rm -f $dbpath/$dbfile
   1.270      done
   1.271  }
   1.272  
   1.273  db_init () {
   1.274      #   perform official "initdb" operation
   1.275 -    #   (is mostly a no-operation in RPM 4.2, but anyway)
   1.276      verbose 2 "creating new RPM database (built-in RPM procedure)"
   1.277      rpm --initdb
   1.278 -
   1.279 -    #   perform some real RPM work, so more database files
   1.280 -    #   magically spring into existence
   1.281 -    verbose 2 "operating on new RPM database"
   1.282 -    rpm --import $prefix/etc/openpkg/openpkg.org.pgp || true
   1.283 -    rpm -e gpg-pubkey-63c4cb9f-3c591eda --allmatches || true
   1.284 -
   1.285 -    #   perform official "rebuilddb" operation in the hope it
   1.286 -    #   creates even more database files now that we have some content
   1.287 -    verbose 2 "rebuilding new RPM database (built-in RPM procedure)"
   1.288 -    rpm --rebuilddb
   1.289 +    rpmdb_version_save
   1.290  }
   1.291  
   1.292  db_unbreak () {
   1.293 -    #   cleanup DB region files
   1.294 -    verbose 2 "cleaning up RPM database DB region files"
   1.295 +    #   cleanup DB files
   1.296 +    verbose 2 "cleaning up RPM database DB files"
   1.297      for dbfile in $dbfiles; do
   1.298 -        eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\)$/dbtype="\1"; dbfile="\2";/'`
   1.299 -        if [ ".$dbtype" = .region ]; then
   1.300 -            verbose 3 "cleaning up DB file: $dbpath/$dbfile ($dbtype)"
   1.301 -            rm -f $dbpath/$dbfile || true
   1.302 -            touch $dbpath/$dbfile || true
   1.303 +        eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'`
   1.304 +        if [ -f $dbpath/$dbfile ]; then
   1.305 +            if [ ".$dbapi" = .3 -a ".$dbtype" = .region ]; then
   1.306 +                verbose 3 "cleaning up DB file: $dbpath/$dbfile ($dbapi:$dbtype)"
   1.307 +                rm -f $dbpath/$dbfile || true
   1.308 +            elif [ ".$dbtype" = .temporary ]; then
   1.309 +                verbose 3 "cleaning up DB file: $dbpath/$dbfile ($dbapi:$dbtype)"
   1.310 +                rm -f $dbpath/$dbfile || true
   1.311 +            fi
   1.312          fi
   1.313      done
   1.314  }
   1.315  
   1.316 -db_extend () {
   1.317 -    #   make sure all RPM database DB files are present
   1.318 -    verbose 2 "making sure RPM database contains all possible DB files"
   1.319 +db_convert () {
   1.320 +    #   make sure all RPM database DB files have the correct type
   1.321 +    #   (as the type can be different during upgrading from RPM 4 to RPM 5)
   1.322 +    verbose 2 "making sure RPM database are of the correct type"
   1.323      for dbfile in $dbfiles; do
   1.324 -        eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\)$/dbtype="\1"; dbfile="\2";/'`
   1.325 -        if [ ! -f $dbpath/$dbfile ]; then
   1.326 -            verbose 3 "creating DB file: $dbpath/$dbfile ($dbtype)"
   1.327 -            if [ ".$dbtype" = .hash -o ".$dbtype" = .btree ]; then
   1.328 -                ( echo "VERSION=3"
   1.329 -                  echo "format=bytevalue"
   1.330 -                  echo "type=$dbtype"
   1.331 -                  echo "db_pagesize=16384"
   1.332 -                  echo "HEADER=END"
   1.333 -                  echo "DATA=END"
   1.334 -                ) | rpmdb_load $dbpath/$dbfile || true
   1.335 -            else
   1.336 -                touch $dbpath/$dbfile || true
   1.337 +        eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'`
   1.338 +        if [ ".$dbapi" != ".$DBAPI" ]; then
   1.339 +            continue
   1.340 +        fi
   1.341 +        if [ -f $dbpath/$dbfile ]; then
   1.342 +            if [ ".$dbapi" = .3 ] && [ ".$dbtype" = .hash -o ".$dbtype" = .btree ]; then
   1.343 +                dbtype_old="`$rpmdb_dump -h $tmpdir -r $dbpath/$dbfile | grep '^type=' | sed -e 'q' | sed -e 's/^type=//'`"
   1.344 +                if [ ".$dbtype_old" != ".$dbtype" ]; then
   1.345 +                    verbose 3 "converting DB file: $dbpath/$dbfile ($dbtype_old -> $dbtype)"
   1.346 +                    rm -f $dbpath/$dbfile.new
   1.347 +                    $rpmdb_dump -h $tmpdir -r $dbpath/$dbfile |\
   1.348 +                    sed -e "s/^type=.*/type=$dbtype/" -e '/^h_nelem=.*/d' |\
   1.349 +                    $rpmdb_load -h $tmpdir $dbpath/$dbfile.new
   1.350 +                    if $rpmdb_dump -h $tmpdir -r $dbpath/$dbfile.new >/dev/null 2>&1; then
   1.351 +                        rm -f $dbpath/$dbfile
   1.352 +                        mv $dbpath/$dbfile.new $dbpath/$dbfile
   1.353 +                    else
   1.354 +                        warning "failed to convert RPM DB file \"$dbfile\""
   1.355 +                    fi
   1.356 +                fi
   1.357              fi
   1.358          fi
   1.359      done
   1.360 @@ -289,26 +369,75 @@
   1.361      #   reloading their entire content
   1.362      verbose 2 "dumping and reloading RPM database DB file contents"
   1.363      for dbfile in $dbfiles; do
   1.364 -        eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\)$/dbtype="\1"; dbfile="\2";/'`
   1.365 -        verbose 3 "dumping and reloading DB file: $dbpath/$dbfile ($dbtype)"
   1.366 +        eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'`
   1.367 +        if [ ".$dbapi" != ".$DBAPI" ]; then
   1.368 +            continue
   1.369 +        fi
   1.370          if [ -f $dbpath/$dbfile ]; then
   1.371 -            if [ ".$dbtype" = .hash -o ".$dbtype" = .btree ]; then
   1.372 -                rpmdb_dump $dbpath/$dbfile |\
   1.373 -                rpmdb_load $dbpath/$dbfile.new
   1.374 -                rm -f $dbpath/$dbfile
   1.375 -                mv $dbpath/$dbfile.new $dbpath/$dbfile
   1.376 -            else
   1.377 -                rm -f $dbpath/$dbfile || true
   1.378 -                touch $dbpath/$dbfile || true
   1.379 +            if [ ".$dbapi" = .3 ]; then
   1.380 +                verbose 3 "dumping and reloading DB file: $dbpath/$dbfile ($dbtype)"
   1.381 +                if [ ".$dbtype" = .hash -o ".$dbtype" = .btree ]; then
   1.382 +                    rm -f $dbpath/$dbfile.new
   1.383 +                    $rpmdb_dump -h $tmpdir -r $dbpath/$dbfile |\
   1.384 +                    $rpmdb_load -h $tmpdir $dbpath/$dbfile.new
   1.385 +                    if $rpmdb_dump -h $tmpdir -r $dbpath/$dbfile.new >/dev/null 2>&1; then
   1.386 +                        rm -f $dbpath/$dbfile
   1.387 +                        mv $dbpath/$dbfile.new $dbpath/$dbfile
   1.388 +                    else
   1.389 +                        warning "failed to reload RPM DB file \"$dbfile\""
   1.390 +                    fi
   1.391 +                elif [ ".$dbtype" = .region ]; then
   1.392 +                    rm -f $dbpath/$dbfile || true
   1.393 +                elif [ ".$dbtype" = .temporary ]; then
   1.394 +                    rm -f $dbpath/$dbfile || true
   1.395 +                fi
   1.396 +            elif [ ".$dbapi" = .4 ]; then
   1.397 +                verbose 3 "dumping and reloading DB file: $dbpath/$dbfile ($dbtype)"
   1.398 +                rm -f $dbpath/$dbfile.new
   1.399 +                $rpmdb_sqlite $dbpath/$dbfile .dump |\
   1.400 +                $rpmdb_sqlite $dbpath/$dbfile.new
   1.401 +                if $rpmdb_sqlite $dbpath/$dbfile.new >/dev/null 2>&1; then
   1.402 +                    rm -f $dbpath/$dbfile
   1.403 +                    mv $dbpath/$dbfile.new $dbpath/$dbfile
   1.404 +                else
   1.405 +                    warning "failed to reload RPM DB file \"$dbfile\""
   1.406 +                fi
   1.407              fi
   1.408          fi
   1.409      done
   1.410 +    rpmdb_version_save
   1.411 +}
   1.412 +
   1.413 +db_migrate () {
   1.414 +    #   perform database migration
   1.415 +    if [ ".$1" != . ]; then
   1.416 +        dblib="$1"
   1.417 +    fi
   1.418 +    dbapi_old="$DBAPI"
   1.419 +    if [ ".$dblib" = .db ]; then
   1.420 +        dbapi_new="3"
   1.421 +    elif [ ".$dblib" = .sqlite ]; then
   1.422 +        dbapi_new="4"
   1.423 +    else
   1.424 +        error "unknown RPM database backend library \"$dblib\""
   1.425 +    fi
   1.426 +    if [ ".$dbapi_new" = ".$dbapi_old" ]; then
   1.427 +        error "RPM database already uses requested backend ($DBAPI:$DBLIB:$DBVER)"
   1.428 +    fi
   1.429 +    verbose 2 "migrating RPM database"
   1.430 +    rpm --rebuilddb --dbapi "$dbapi_old" --rebuilddbapi "$dbapi_new"
   1.431 +    verbose 3 "old RPM database format: $DBAPI:$DBLIB:$DBVER"
   1.432 +    DBAPI="$dbapi_new"
   1.433 +    rpmdb_version_save
   1.434 +    rpmdb_version_load
   1.435 +    verbose 3 "new RPM database format: $DBAPI:$DBLIB:$DBVER"
   1.436  }
   1.437  
   1.438  db_rebuild () {
   1.439      #   perform official "rebuilddb" operation
   1.440      verbose 2 "rebuilding RPM database (built-in RPM procedure)"
   1.441      rpm --rebuilddb
   1.442 +    rpmdb_version_save
   1.443  }
   1.444  
   1.445  db_operate () {
   1.446 @@ -333,17 +462,30 @@
   1.447      #   RPM database files to make sure they are consistent
   1.448      verbose 2 "making sure RPM database files have consistent attributes"
   1.449      for dbfile in $dbfiles; do
   1.450 -        eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\)$/dbtype="\1"; dbfile="\2";/'`
   1.451 +        eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'`
   1.452 +        if [ ".$dbapi" != ".$DBAPI" ]; then
   1.453 +            continue
   1.454 +        fi
   1.455          verbose 3 "fixating DB file: $dbpath/$dbfile ($dbtype)"
   1.456 -        chown $musr:$mgrp $dbpath/$dbfile 2>/dev/null || true
   1.457 -        chmod 644 $dbpath/$dbfile 2>/dev/null || true
   1.458 +        if [ -f $dbpath/$dbfile ]; then
   1.459 +            chown $musr:$mgrp $dbpath/$dbfile 2>/dev/null || true
   1.460 +            chmod 644 $dbpath/$dbfile 2>/dev/null || true
   1.461 +        fi
   1.462      done
   1.463 +    chown $musr:$mgrp $dbpath/VERSION 2>/dev/null || true
   1.464 +    chmod 644 $dbpath/VERSION 2>/dev/null || true
   1.465  }
   1.466  
   1.467  db_list () {
   1.468      #   list all database files
   1.469      for dbfile in $dbfiles; do
   1.470 -        eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\)$/dbtype="\1"; dbfile="\2";/'`
   1.471 +        eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'`
   1.472 +        if [ ".$dbapi" != ".$DBAPI" ]; then
   1.473 +            continue
   1.474 +        fi
   1.475 +        if [ ! -f "$dbpath/$dbfile" ]; then
   1.476 +            continue
   1.477 +        fi
   1.478          if [ $verbose -eq 0 ]; then
   1.479              echo "$dbfile"
   1.480          elif [ $verbose -eq 1 ]; then
   1.481 @@ -380,6 +522,9 @@
   1.482      error "OpenPKG RPM database directory \"$dbpath\" not writable"
   1.483  fi
   1.484  
   1.485 +#   load database information
   1.486 +rpmdb_version_load
   1.487 +
   1.488  ##
   1.489  ##  DISPATCH INTO COMMANDS
   1.490  ##
   1.491 @@ -389,7 +534,15 @@
   1.492          verbose 1 "BUILDING NEW RPM DATABASE FROM SCRATCH ($dbpath)"
   1.493          db_remove
   1.494          db_init
   1.495 -        db_extend
   1.496 +        db_fixate
   1.497 +        db_operate
   1.498 +        ;;
   1.499 +
   1.500 +    migrate )
   1.501 +        verbose 1 "MIGRATING RPM DATABASE FORMAT ($dbpath)"
   1.502 +        db_unbreak
   1.503 +        db_convert
   1.504 +        db_migrate
   1.505          db_rebuild
   1.506          db_fixate
   1.507          db_operate
   1.508 @@ -398,7 +551,7 @@
   1.509      rebuild )
   1.510          verbose 1 "REBUILDING NEW FROM OLD RPM DATABASE ($dbpath)"
   1.511          db_unbreak
   1.512 -        db_extend
   1.513 +        db_convert
   1.514          db_reload
   1.515          db_rebuild
   1.516          db_fixate
   1.517 @@ -408,7 +561,7 @@
   1.518      cleanup )
   1.519          verbose 1 "CLEANING UP EXISTING RPM DATABASE ($dbpath)"
   1.520          db_unbreak
   1.521 -        db_extend
   1.522 +        db_convert
   1.523          db_rebuild
   1.524          db_fixate
   1.525          db_operate
   1.526 @@ -416,9 +569,7 @@
   1.527  
   1.528      fixate )
   1.529          verbose 1 "FIXATING EXISTING RPM DATABASE ($dbpath)"
   1.530 -        db_extend
   1.531          db_fixate
   1.532 -        db_operate
   1.533          ;;
   1.534  
   1.535      list )

mercurial