OpenPKG CVS Repository
  http://cvs.openpkg.org/
  ____________________________________________________________________________

  Server: cvs.openpkg.org                  Name:   Thomas Lotterer
  Root:   /v/openpkg/cvs                   Email:  [EMAIL PROTECTED]
  Module: openpkg-registry                 Date:   22-Nov-2005 13:16:49
  Branch: HEAD                             Handle: 2005112212164900

  Modified files:
    openpkg-registry        registry-db.pl

  Log:
    handle database upgrades, assuming that patches do not require changes
    in schema

  Summary:
    Revision    Changes     Path
    1.3         +69 -12     openpkg-registry/registry-db.pl
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: openpkg-registry/registry-db.pl
  ============================================================================
  $ cvs diff -u -r1.2 -r1.3 registry-db.pl
  --- openpkg-registry/registry-db.pl   19 Nov 2005 22:13:07 -0000      1.2
  +++ openpkg-registry/registry-db.pl   22 Nov 2005 12:16:49 -0000      1.3
  @@ -40,6 +40,18 @@
   my $progvers="0.0.16";
   my $progdate="19-Nov-2005";
   
  +#   derive data version from program version
  +my $datavers={};
  +$datavers->{value} = $progvers;
  +if ($datavers->{value} =~ m/^([0-9]+)\.([0-9]+)\.([0-9]+)$/) {
  +    $datavers->{major}=$1;
  +    $datavers->{minor}=$2;
  +    $datavers->{patch}=$3;
  +}
  +else {
  +    die "cannot derive datavers major.minor.patch triple from progvers=" . 
$progvers;
  +}
  +
   #   determine path to OpenPKG instance
   my $PREFIX='@l_prefix@';
   $PREFIX=$ENV{OPENPKG_PREFIX} if ($ENV{OPENPKG_PREFIX} ne "");
  @@ -127,13 +139,54 @@
           $reg_config->{version}->{minor}=$2;
           $reg_config->{version}->{patch}=$3;
       }
  +    else {
  +        die "cannot derive database major.minor.patch triple from 
value=".$reg_config->{version}->{value};
  +    }
   
  -    if($reg_config->{version}->{value} eq $progvers) {
  -        print "database=" . %{$rv}->{version}->{value} . " is at my 
version=" .  $progvers . "\n";
  +    #   program data version and database version already match
  +    #
  +    if    (    $reg_config->{version}->{major} == $datavers->{major}
  +           and $reg_config->{version}->{minor} == $datavers->{minor}
  +           and $reg_config->{version}->{patch} == $datavers->{patch}) {
  +        print "database=" . %{$rv}->{version}->{major} . "."
  +                          . %{$rv}->{version}->{minor} . "."
  +                          . %{$rv}->{version}->{patch}
  +                          . " is at exactly program datavers="
  +                          . $datavers->{major} . "."
  +                          . $datavers->{minor} . "."
  +                          . $datavers->{patch}
  +                          . "\n";
           return 0;
       }
  -    elsif ($reg_config->{version}->{major} == 0 and 
$reg_config->{version}->{minor} == 0 and $reg_config->{version}->{patch} == 0) {
  -        print "upgrading from version=" . %{$rv}->{version}->{value} . "\n";
  +
  +    #   program data version and database version only differ in patchlevel 
- just uprev the number
  +    #
  +    elsif (    $reg_config->{version}->{major} == $datavers->{major}
  +           and $reg_config->{version}->{minor} == $datavers->{minor}
  +           and $reg_config->{version}->{patch} <  $datavers->{patch}) {
  +        print "database=" . %{$rv}->{version}->{major} . "."
  +                          . %{$rv}->{version}->{minor} . "."
  +                          . %{$rv}->{version}->{patch}
  +                          . " is at program major/minor datavers="
  +                          . $datavers->{major} . "."
  +                          . $datavers->{minor} . "."
  +                          . $datavers->{patch}
  +                          . "\n";
  +        $sql = sprintf("UPDATE reg_config SET value = '%s.%s.%s' WHERE ( key 
= 'version' );",
  +                            $datavers->{major},
  +                            $datavers->{minor},
  +                            $datavers->{patch});
  +        $rv = $dbh->do($sql);
  +        print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n"; die if 
($dbh->errstr =~ m|ERROR|);
  +        return 1;
  +    }
  +
  +    #   database has no version and needs initialization from scratch
  +    #
  +    elsif (    $reg_config->{version}->{major} == 0
  +           and $reg_config->{version}->{minor} == 0
  +           and $reg_config->{version}->{patch} == 0) {
  +        print "initializing database\n";
           $dbh->{AutoCommit} = 0;
           $dbh->begin_work;
           $sql = &schema();
  @@ -141,19 +194,23 @@
           $sql .= &sample() if ($progvers =~ m/^0\.0\./);
           $rv = $dbh->do($sql);
           $dbh->commit;
  -        print "[schema]\nrv=".$rv." message=".$dbh->errstr."\n\n";
  +        print "[schema]\nrv=".$rv." message=".$dbh->errstr."\n\n"; die if 
($dbh->errstr =~ m|ERROR|);
           $dbh->{AutoCommit} = 1;
           return 1;
       }
  -    elsif ($reg_config->{version}->{major} == 0 and 
$reg_config->{version}->{minor} == 0) {
  -        print "upgrading from version=" . %{$rv}->{version}->{value} . "\n";
  -        $sql .= "INSERT INTO reg_config VALUES ( 'version', '".$progvers."' 
);";
  -        $rv = $dbh->do($sql);
  -        print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n";
  -        return 0;
  -    }
  +
  +    #   unsupported upgrade case
  +    #
       else {
           print "program version=" . $progvers . " cannot handle database 
version=" . %{$rv}->{version}->{value} . "\n";
  +        print "database=" . %{$rv}->{version}->{major} . "."
  +                          . %{$rv}->{version}->{minor} . "."
  +                          . %{$rv}->{version}->{patch}
  +                          . " cannot be upgraded by this program which uses 
datavers="
  +                          . $datavers->{major} . "."
  +                          . $datavers->{minor} . "."
  +                          . $datavers->{patch}
  +                          . "\n";
           return 0;
       }
       die
  @@ .
______________________________________________________________________
The OpenPKG Project                                    www.openpkg.org
CVS Repository Commit List                     [email protected]

Reply via email to