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:   03-Aug-2006 01:15:35
  Branch: HEAD                             Handle: 2006080300153400

  Modified files:
    openpkg-registry        registry-db.pl

  Log:
    introduce OSSP::cfg and option parsing, leverage common registry code;
    work-off setup part using own dbdo() function with improved error
    handling and debugging and smaller footprint on usage; move "version
    already match" detection block to the beginning of update/upgrade
    procedure; fix broken version UPDATE; add manual page

  Summary:
    Revision    Changes     Path
    1.42        +339 -158   openpkg-registry/registry-db.pl
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: openpkg-registry/registry-db.pl
  ============================================================================
  $ cvs diff -u -r1.41 -r1.42 registry-db.pl
  --- openpkg-registry/registry-db.pl   2 Aug 2006 23:14:19 -0000       1.41
  +++ openpkg-registry/registry-db.pl   2 Aug 2006 23:15:34 -0000       1.42
  @@ -27,8 +27,10 @@
   use strict;
   
   use Data::Dumper;
  +use OSSP::cfg;
   use DBI;
   use DBD::Pg;
  +use Getopt::Long;
   
   #   program name, version and date
   my $progname="registry-db.pl";
  @@ -40,6 +42,15 @@
   $Data::Dumper::Indent = 1;
   $Data::Dumper::Terse  = 1;
   
  +#   determine path to OpenPKG instance
  +my $PREFIX='@l_prefix@';
  +$PREFIX=$ENV{OPENPKG_PREFIX} if ($ENV{OPENPKG_PREFIX} ne "");
  +
  +#   registry common code
  +my $pm = "registry.pm";
  +$pm = "$PREFIX/libexec/openpkg-registry/registry.pm" unless($PREFIX =~ 
m/[EMAIL PROTECTED]@$/);
  +require $pm; import registry;
  +
   #   derive data version from program version
   my $datavers={};
   $datavers->{value} = $progvers;
  @@ -52,19 +63,83 @@
       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 "");
  +#   options and defaults
  +my $opt = {};
  +$opt->{prefix}  = $PREFIX;
  +$opt->{config}  = &registry::getcfgfilename($PREFIX);
  +$opt->{debug}   = 0;
  +$opt->{help}    = 0;
  +$opt->{version} = 0;
  +
  +sub debug () {
  +    my ($txt) = @_;
  +    printf STDERR "$progname:DEBUG: %s\n", $txt if($opt->{debug});
  +}
  +
  +sub warning () {
  +    my ($txt) = @_;
  +    printf STDERR "$progname:WARNING: %s\n", $txt;
  +}
  +
  +sub error () {
  +    my ($txt) = @_;
  +    printf STDERR "$progname:ERROR: %s\n", $txt;
  +    exit(1);
  +}
   
  -#   configuration
  -my $cfg = {};
  -$cfg->{db}->{registry}->{host}="127.0.0.1";
  -$cfg->{db}->{registry}->{superuser}->{username}="postgresql";
  -$cfg->{db}->{registry}->{superuser}->{password}="postgresql";
  -$cfg->{db}->{registry}->{username}="registry";
  -$cfg->{db}->{registry}->{password}="registry";
  -$cfg->{db}->{registry}->{tablespace}="registry";
  -$cfg->{db}->{session}->{dbfile}="$PREFIX/var/openpkg-registry/ui/session.db";
  +sub version ()
  +{
  +    printf "$progname:INFO: version=%s date=%s\n", $progvers, $progdate;
  +    exit(0);
  +}
  +
  +sub usage ()
  +{
  +    my ($level) = @_;
  +    my $txt = qq{
  +        $progname:$level: Usage: $progname [options] command
  +        Available options:
  +         -p|prefix=s specifiy prefix for data ($opt->{prefix})
  +         -C|config=s specifiy config file ($opt->{config})
  +         -D|debug    turn on debugging
  +         -H|help     print out this usage page
  +         -V|version  print version
  +        Available commands:
  +         setup       setup/upgrade database
  +    };
  +    $txt =~ s/^\n//s; $txt =~ s/^[ ]{8}//mg; $txt =~ s/ *$//mg;
  +    if ($level eq "INFO") {
  +        print $txt;
  +        exit(0);
  +    }
  +    print STDERR $txt;
  +    exit(1);
  +}
  +
  +Getopt::Long::Configure("bundling");
  +my $result = GetOptions(
  +    'p|prefix=s'     => \$opt->{prefix},
  +    'C|config=s'     => \$opt->{config},
  +    'D|debug'        => \$opt->{debug},
  +    'H|help'         => \$opt->{help},
  +    'V|version'      => \$opt->{version}
  +) || &usage("ERROR");
  +&version() if ($opt->{version});
  +&usage("INFO") if ($opt->{help});
  +( $#ARGV == 0 ) || &usage("ERROR");
  +
  +#   check data prefix
  +if (   $ARGV[0] eq "setup") {
  +    &error("required data prefix empty") if ($opt->{prefix} eq "");
  +    &error("required data prefix unset") if ($opt->{prefix} =~ m/[EMAIL 
PROTECTED]@$/);
  +}
  +
  +#   handle configuration
  +my $defcfgtxt = &registry::getdefcfgtxt($opt->{prefix});
  +my $defcfg    = &registry::parsecfgtxt($defcfgtxt);
  +my $usecfgtxt = &registry::readcfgtxtfile($opt->{config});
  +my $usecfg    = &registry::parsecfgtxt($usecfgtxt);
  +my $cfg       = &registry::mergecfg($defcfg, $usecfg);
   
   #   database handle and scratch variables
   #
  @@ -76,6 +151,11 @@
   my $dbh; # database handle
   my $dbv; # database version
   
  +if    ($ARGV[0] eq "setup") {
  +    &setup();
  +}
  +exit(0);
  +
   sub dbopen($)
   {
       my ($db) = @_;
  @@ -148,55 +228,85 @@
       return $dbi;
   }
   
  -#   create user, tablespace and database
  -#
  -$dbh = &dbopen("template1");
  -die "ERROR:$0: DataBase error: ".$DBI::errstr."\n" if (not defined $dbh);
  -
  -$sql="CREATE USER registry ENCRYPTED PASSWORD 'registry' NOCREATEDB 
NOCREATEUSER;";
  -$rv = $dbh->do($sql);
  -print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n" if($dbh->errstr !~ 
/(user|role) .* already exists/);
  -
  -$sql="CREATE TABLESPACE registry OWNER registry LOCATION 
'$PREFIX/var/openpkg-registry/db';";
  -$rv = $dbh->do($sql);
  -print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n" if($dbh->errstr !~ 
/tablespace .* already exists/);
  -
  -$sql="CREATE DATABASE registry OWNER registry TABLESPACE registry;";
  -$rv = $dbh->do($sql);
  -print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n" if($dbh->errstr !~ 
/database .* already exists/);
  -
  -$dbh->disconnect(); undef $dbh;
  -
  -#   enable Pg/SQL
  -#
  -$dbh = &dbopen("registry/superuser");
  -die "ERROR:$0: DataBase error: ".$DBI::errstr."\n" if (not defined $dbh);
  -
  -$sql="";
  -$sql.="CREATE FUNCTION plpgsql_call_handler () RETURNS LANGUAGE_HANDLER AS 
'\$libdir/plpgsql' LANGUAGE C;\n";
  -$sql.="COMMENT ON FUNCTION plpgsql_call_handler () IS 'PL/pgSQL Call 
Handler';\n";
  -$sql.="CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql HANDLER 
plpgsql_call_handler;\n";
  -$rv = $dbh->do($sql);
  -print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n" if($dbh->errstr !~ 
/function .* already exists/);
  -
  -$dbh->disconnect(); undef $dbh;
  +sub dbdo ($$)
  +{
  +    my ($dbh, $sql, $ignore) = @_;
  +    my ($rv, $txt, $msg, $ok, $expectederror);
   
  -#   registry
  -#
  -$dbh = &dbopen("registry");
  -die "ERROR:$0: DataBase error: ".$DBI::errstr."\n" if (not defined $dbh);
  -while(&upgraderegistry()) {};
  -$dbh->disconnect(); undef $dbh;
  +    $sql =~ s/ *\n+$//s;
  +    $rv = $dbh->do($sql);
  +    $ok = 0; $ok = 1 if ($rv eq '0E0' or $rv >= 1);
  +    $msg = $dbh->errstr;
  +    $msg =~ s/ *\n+$//s;
  +    $expectederror = 0; $expectederror = 1 if ($msg =~ m/$ignore/);
  +    $txt = sprintf "\n    sql=\"%s\"\n    ret=\"%s\"\n    msg=\"%s\"\n", 
$sql, $rv, $msg;
  +    if (not $ok and not $expectederror) {
  +        printf STDERR "$progname:ERROR: %s\n", $txt;
  +        return 0;
  +    }
  +    &debug($txt);
  +    return 1;
  +}
   
  -#   session
  -#
  -$dbh = &dbopen("session");
  -die "ERROR:$0: DataBase error: ".$DBI::errstr."\n" if (not defined $dbh);
  -chmod oct("0664"), $cfg->{db}->{session}->{dbfile};
  -while(&upgradesession()) {};
  -$dbh->disconnect(); undef $dbh;
  +sub setup ()
  +{
  +    #   create user, tablespace and database
  +    #
  +    $dbh = &dbopen("template1");
  +    die "ERROR:$0: DataBase error: ".$DBI::errstr."\n" if (not defined $dbh);
   
  -exit(0);
  +    $sql = sprintf "CREATE USER %s ENCRYPTED PASSWORD %s NOCREATEDB 
NOCREATEUSER;",
  +        $cfg->{db}->{registry}->{username},
  +        $dbh->quote($cfg->{db}->{registry}->{password});
  +    &dbdo($dbh, $sql,
  +        '(user|role) .* already exists') || die;
  +
  +    $sql = sprintf "CREATE TABLESPACE %s OWNER %s LOCATION %s;",
  +        $cfg->{db}->{registry}->{tablespace},
  +        $cfg->{db}->{registry}->{username},
  +        $dbh->quote($cfg->{db}->{registry}->{location});
  +    &dbdo($dbh, $sql,
  +        'tablespace .* already exists') || die;
  +
  +    $sql = sprintf "CREATE DATABASE %s OWNER %s TABLESPACE %s;",
  +        $cfg->{db}->{registry}->{database},
  +        $cfg->{db}->{registry}->{username},
  +        $cfg->{db}->{registry}->{tablespace};
  +    &dbdo($dbh, $sql,
  +        'database .* already exists') || die;
  +
  +    $dbh->disconnect(); undef $dbh;
  +
  +    #   enable Pg/SQL
  +    #
  +    $dbh = &dbopen("registry/superuser");
  +    die "ERROR:$0: DataBase error: ".$DBI::errstr."\n" if (not defined $dbh);
  +
  +    $sql = q{
  +        CREATE FUNCTION plpgsql_call_handler () RETURNS LANGUAGE_HANDLER AS 
'$libdir/plpgsql' LANGUAGE C;
  +        COMMENT ON FUNCTION plpgsql_call_handler () IS 'PL/pgSQL Call 
Handler';
  +        CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql HANDLER 
plpgsql_call_handler;
  +    };
  +    &dbdo($dbh, $sql,
  +        'function .* already exists') || die;
  +
  +    $dbh->disconnect(); undef $dbh;
  +
  +    #   registry
  +    #
  +    $dbh = &dbopen("registry");
  +    die "ERROR:$0: DataBase error: ".$DBI::errstr."\n" if (not defined $dbh);
  +    while (&upgraderegistry()) {};
  +    $dbh->disconnect(); undef $dbh;
  +
  +    #   session
  +    #
  +    $dbh = &dbopen("session");
  +    die "ERROR:$0: DataBase error: ".$DBI::errstr."\n" if (not defined $dbh);
  +    chmod oct("0664"), $cfg->{db}->{session}->{dbfile};
  +    while (&upgradesession()) {};
  +    $dbh->disconnect(); undef $dbh;
  +}
   
   sub upgradesession()
   {
  @@ -220,81 +330,73 @@
           die "cannot derive database major.minor.patch triple from 
value=".$dbv->{version}->{value};
       }
   
  -    #   database has no version and needs initialization from scratch
  +    #   program data version and database version already match
  +    #
  +    if    (    $dbv->{version}->{major} == $datavers->{major}
  +           and $dbv->{version}->{minor} == $datavers->{minor}
  +           and $dbv->{version}->{patch} == $datavers->{patch}) {
  +       &debug("database=" . $dbv->{version}->{major} . "."
  +                          . $dbv->{version}->{minor} . "."
  +                          . $dbv->{version}->{patch}
  +                          . " is at exactly program datavers="
  +                          . $datavers->{major} . "."
  +                          . $datavers->{minor} . "."
  +                          . $datavers->{patch});
  +        return 0;
  +    }
  +
  +    #   0.0.0 upgrade to 0.0.1 - initialization from scratch
       #
  -    if    (    $dbv->{version}->{major} == 0
  +    elsif (    $dbv->{version}->{major} == 0
              and $dbv->{version}->{minor} == 0
              and $dbv->{version}->{patch} == 0) {
  -        print "initializing database\n";
  -     # SQLite transactions seem to factor out CREATE TABLEs
  -        $sql = &schemasession1();
  -        $rv = $dbh->do($sql);
  -        print "[schema.1]\nrv=".$rv." message=".$dbh->errstr."\n\n"; die if 
(not defined $rv);
  -        $sql = &schemasession2();
  -        $rv = $dbh->do($sql);
  -        print "[schema.2]\nrv=".$rv." message=".$dbh->errstr."\n\n"; die if 
(not defined $rv);
  +        $sql = "";
  +        $sql .= &schemasession1();
  +        $sql .= &schemasession2();
  +        $sql .= "INSERT INTO config VALUES ( 'version', '0.0.1' );";
  +        &dbdo($dbh, $sql) || die;
           return 1;
       }
   
  -    #   0.0.24 introduced cache table
  +    #   0.0.x upgrade to 0.0.24
       #
       elsif (    $dbv->{version}->{major} == 0
              and $dbv->{version}->{minor} == 0
              and $dbv->{version}->{patch} <  24 ) {
  -        $sql = &schemasession3();
  -        $rv = $dbh->do($sql);
  -        print "[schema.3]\nrv=".$rv." message=".$dbh->errstr."\n\n"; die if 
(not defined $rv);
  -        $sql = sprintf("UPDATE config SET value = '0.0.24';");
  -        $rv = $dbh->do($sql);
  -        print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n"; die if (not 
defined $rv);
  +        $sql = "";
  +        $sql .= &schemasession3();
  +        $sql = "UPDATE config SET value = '0.0.24' WHERE ( key = 'version' 
);";
  +        &dbdo($dbh, $sql) || die;
           return 1;
       }
   
  -    #   >0.0.24 upgrade to 0.6.0 is a nop
  +    #   0.0.24 upgrade to 0.6.0
       #
       elsif (    $dbv->{version}->{major} == 0
              and $dbv->{version}->{minor} <  6  ) {
  -        $sql = sprintf("UPDATE config SET value = '0.6.0';");
  -        $rv = $dbh->do($sql);
  -        print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n"; die if (not 
defined $rv);
  +        $sql = "";
  +        $sql = "UPDATE config SET value = '0.6.0' WHERE ( key = 'version' 
);";
  +        &dbdo($dbh, $sql) || die;
           return 1;
       }
   
  -    #   program data version and database version already match
  -    #
  -    elsif (    $dbv->{version}->{major} == $datavers->{major}
  -           and $dbv->{version}->{minor} == $datavers->{minor}
  -           and $dbv->{version}->{patch} == $datavers->{patch}) {
  -        print "database=" . $dbv->{version}->{major} . "."
  -                          . $dbv->{version}->{minor} . "."
  -                          . $dbv->{version}->{patch}
  -                          . " is at exactly program datavers="
  -                          . $datavers->{major} . "."
  -                          . $datavers->{minor} . "."
  -                          . $datavers->{patch}
  -                          . "\n";
  -        return 0;
  -    }
  -
       #   program data version and database version only differ in patchlevel 
- just uprev the number
       #
       elsif (    $dbv->{version}->{major} == $datavers->{major}
              and $dbv->{version}->{minor} == $datavers->{minor}
              and $dbv->{version}->{patch} <  $datavers->{patch}) {
  -        print "database=" . $dbv->{version}->{major} . "."
  +        &debug("database=" . $dbv->{version}->{major} . "."
                             . $dbv->{version}->{minor} . "."
                             . $dbv->{version}->{patch}
                             . " is at program major/minor datavers="
                             . $datavers->{major} . "."
                             . $datavers->{minor} . "."
  -                          . $datavers->{patch}
  -                          . "\n";
  +                          . $datavers->{patch});
           $sql = sprintf("UPDATE 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|);
  +        &dbdo($dbh, $sql) || die;
           return 1;
       }
   
  @@ -336,51 +438,41 @@
           die "cannot derive database major.minor.patch triple from 
value=".$dbv->{version}->{value};
       }
   
  -
  -    #   database has no version and needs initialization from scratch
  -    #
  -    if    (    $dbv->{version}->{major} == 0
  -           and $dbv->{version}->{minor} == 0
  -           and $dbv->{version}->{patch} == 0) {
  -        print "initializing database\n";
  -        $dbh->{AutoCommit} = 0;
  -        $dbh->begin_work;
  -        $sql = "";
  -        $sql .= &schemaregistry();
  -        $sql .= &schemaregistry2();
  -        $sql .= &funcregistry();
  -        $sql .= "INSERT INTO reg_config VALUES ( 'version', '".$progvers."' 
);";
  -        $sql .= &sample() if ($progvers =~ m/^0\.0\./);
  -        $rv = $dbh->do($sql);
  -        $dbh->commit;
  -        print "[schema]\nrv=".$rv." message=".$dbh->errstr."\n\n"; die if 
($dbh->errstr =~ m|ERROR|);
  -        $dbh->{AutoCommit} = 1;
  -        return 1;
  -    }
  -
  -    #   program data version and database version already match
  +    #   program data version and database version match
       #
  -    elsif (    $dbv->{version}->{major} == $datavers->{major}
  +    if    (    $dbv->{version}->{major} == $datavers->{major}
              and $dbv->{version}->{minor} == $datavers->{minor}
              and $dbv->{version}->{patch} == $datavers->{patch}) {
  -        print "database=" . $dbv->{version}->{major} . "."
  +        &debug("database=" . $dbv->{version}->{major} . "."
                             . $dbv->{version}->{minor} . "."
                             . $dbv->{version}->{patch}
                             . " is at exactly program datavers="
                             . $datavers->{major} . "."
                             . $datavers->{minor} . "."
  -                          . $datavers->{patch}
  -                          . "\n";
  +                          . $datavers->{patch});
           return 0;
       }
   
  -    #   0.[01].x upgrade to 0.2.0 is a nop
  +    #   0.0.0 upgrade to 0.1.0 - initialization from scratch
  +    #
  +    elsif (    $dbv->{version}->{major} == 0
  +           and $dbv->{version}->{minor} == 0
  +           and $dbv->{version}->{patch} == 0) {
  +        $sql = "";
  +        $sql .= &schemaregistry();
  +        $sql .= &funcregistry();
  +        $sql .= "INSERT INTO reg_config VALUES ( 'version', '0.1.0' );";
  +        &dbdo($dbh, $sql) || die;
  +        return 1;
  +    }
  +
  +
  +    #   0.1.x upgrade to 0.2.0
       #
       elsif (    $dbv->{version}->{major} == 0
              and $dbv->{version}->{minor} <  2  ) {
  -        $sql = sprintf("UPDATE reg_config SET value = '0.2.0';");
  -        $rv = $dbh->do($sql);
  -        print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n"; die if 
($dbh->errstr =~ m|ERROR|);
  +        $sql = "UPDATE reg_config SET value = '0.2.0', mtime = now() WHERE ( 
key = 'version' );";
  +        &dbdo($dbh, $sql) || die;
           return 1;
       }
   
  @@ -388,14 +480,15 @@
       #
       elsif (    $dbv->{version}->{major} == 0
              and $dbv->{version}->{minor} == 2  ) {
  -        $sql="";
  -        $sql .= sprintf("ALTER TABLE reg_statistic ALTER COLUMN time_first 
SET DEFAULT CURRENT_TIMESTAMP;\n");
  -        $sql .= sprintf("ALTER TABLE reg_statistic ALTER COLUMN time_last 
SET DEFAULT CURRENT_TIMESTAMP;\n");
  -        $sql .= sprintf("ALTER TABLE reg_statistic ALTER COLUMN count SET 
DEFAULT 1;\n");
  +        $sql = "";
  +        $sql .= q{
  +            ALTER TABLE reg_statistic ALTER COLUMN time_first SET DEFAULT 
CURRENT_TIMESTAMP;
  +            ALTER TABLE reg_statistic ALTER COLUMN time_last SET DEFAULT 
CURRENT_TIMESTAMP;
  +            ALTER TABLE reg_statistic ALTER COLUMN count SET DEFAULT 1;
  +        };
           $sql .= &funcregistry();
  -        $sql .= sprintf("UPDATE reg_config SET value = '0.3.0';\n");
  -        $rv = $dbh->do($sql);
  -        print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n"; die if 
($dbh->errstr =~ m|ERROR|);
  +        $sql .= "UPDATE reg_config SET value = '0.3.0', mtime = now() WHERE 
( key = 'version' );";
  +        &dbdo($dbh, $sql) || die;
           return 1;
       }
   
  @@ -403,11 +496,12 @@
       #
       elsif (    $dbv->{version}->{major} == 0
              and $dbv->{version}->{minor} == 3  ) {
  -        $sql="";
  -        $sql .= sprintf("ALTER TABLE reg_user ADD COLUMN fullname TEXT;\n");
  -        $sql .= sprintf("UPDATE reg_config SET value = '0.4.0';\n");
  -        $rv = $dbh->do($sql);
  -        print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n"; die if 
($dbh->errstr =~ m|ERROR|);
  +        $sql = "";
  +        $sql .= q{
  +            ALTER TABLE reg_user ADD COLUMN fullname TEXT;
  +        };
  +        $sql .= "UPDATE reg_config SET value = '0.4.0', mtime = now() WHERE 
( key = 'version' );";
  +        &dbdo($dbh, $sql) || die;
           return 1;
       }
   
  @@ -416,12 +510,13 @@
       elsif (    $dbv->{version}->{major} == 0
              and $dbv->{version}->{minor} == 4) {
           $sql = "";
  -        my $constraint = q{ CHECK (registry_orel ~ 
'^[^-]+-((CURRENT|CURRENT-[0-9]+|[^.-]+-STABLE|[^.-]+-STABLE-[0-9]+|[^.-]+\.[^.-]+-SOLID|[^.-]+\.[^.-]+-SOLID-[0-9]+|[^.-]+\.[^.-]+-RELEASE).*|[0-9]+\.[0-9]+)$')
 };
  -        $sql .= sprintf("ALTER TABLE reg_instance DROP CONSTRAINT 
reg_instance_registry_orel_check;\n");
  -        $sql .= sprintf("ALTER TABLE reg_instance ADD CONSTRAINT 
reg_instance_registry_orel_check $constraint;\n");
  -        $sql .= sprintf("UPDATE reg_config SET value = '0.5.0';\n");
  -        $rv = $dbh->do($sql);
  -        print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n"; die if 
($dbh->errstr =~ m|ERROR|);
  +        $sql .= q{
  +            ALTER TABLE reg_instance DROP CONSTRAINT 
reg_instance_registry_orel_check;
  +            ALTER TABLE reg_instance ADD CONSTRAINT 
reg_instance_registry_orel_check
  +                CHECK (registry_orel ~ 
'^[^-]+-((CURRENT|CURRENT-[0-9]+|[^.-]+-STABLE|[^.-]+-STABLE-[0-9]+|[^.-]+\.[^.-]+-SOLID|[^.-]+\.[^.-]+-SOLID-[0-9]+|[^.-]+\.[^.-]+-RELEASE).*|[0-9]+\.[0-9]+)$');
  +        };
  +        $sql .= "UPDATE reg_config SET value = '0.5.0', mtime = now() WHERE 
( key = 'version' );";
  +        &dbdo($dbh, $sql) || die;
           return 1;
       }
   
  @@ -431,9 +526,8 @@
              and $dbv->{version}->{minor} == 5) {
           $sql = "";
           $sql .= &schemaregistry2();
  -        $sql .= sprintf("UPDATE reg_config SET value = '0.6.0';\n");
  -        $rv = $dbh->do($sql);
  -        print "$sql\nrv=".$rv." message=".$dbh->errstr."\n\n"; die if 
($dbh->errstr =~ m|ERROR|);
  +        $sql .= "UPDATE reg_config SET value = '0.6.0', mtime = now() WHERE 
( key = 'version' );";
  +        &dbdo($dbh, $sql) || die;
           return 1;
       }
   
  @@ -442,20 +536,18 @@
       elsif (    $dbv->{version}->{major} == $datavers->{major}
              and $dbv->{version}->{minor} == $datavers->{minor}
              and $dbv->{version}->{patch} <  $datavers->{patch}) {
  -        print "database=" . $dbv->{version}->{major} . "."
  +        &debug("database=" . $dbv->{version}->{major} . "."
                             . $dbv->{version}->{minor} . "."
                             . $dbv->{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->{patch});
  +        $sql = sprintf("UPDATE reg_config SET value = '%s.%s.%s', mtime = 
now() 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|);
  +        &dbdo($dbh, $sql) || die;
           return 1;
       }
   
  @@ -743,3 +835,92 @@
   EOT
   }
   
  +__END__
  +##
  +##  MANUAL PAGE
  +##
  +
  +=pod
  +
  +=head1 NAME
  +
  +B<registry-db> - OpenPKG Registry DataBase utility
  +
  +=head1 SYNOPSIS
  +
  +B<registry-db> [options] command
  +        Available options:
  +         [I<-p|prefix=<path>>]
  +         [I<-C|config=<file>>]
  +         [I<-D|debug>] [I<-H|help>] [I<-V|version>]
  +        Available commands:
  +         setup       setup/upgrade database
  +
  +=head1 DESCRIPTION
  +
  +B<registry-db> is the DataBase utility for OpenPKG Registry Servers.
  +It is used by administrators to setup the
  +Registry Server and to review the default configuration, the contents
  +of the used configuration file and the internal result of both being
  +merged.
  +
  +=head1 OPTIONS
  +
  +The following options are available:
  +
  +=over 4
  +
  +=item B<-D>, B<--debug>
  +
  +Print verbose debug messages during operation.
  +
  +=item B<-H>, B<--help>
  +
  +Display brief usage message.
  +
  +=item B<-V>, B<--version>
  +
  +Print version and exit.
  +
  +=item B<-C>, B<--config=<file>>
  +
  +Specify configuration file to use.
  +Default is C<@l_prefix@/etc/openpkg-registry/registry.cfg>
  +
  +=item B<-p>, B<--prefix=<path>>
  +
  +Specify path to prefix.  Default is <@l_prefix>, overriden by environment
  +variable OPENPKG_PREFIX and finally overridden by this option.
  +
  +=back
  +
  +=head1 COMMANDS
  +
  +The following commands are available:
  +
  +=over 4
  +
  +=item B<setup>
  +
  +Sets up DataBase from scratch, upgrades or updates it. Maintains
  +tablespace, role, database and tables. After successfully running
  +setup, all relations are fully functional but there is no data in the
  +DataBase. This is an ideal precondition to start from scratch or running
  +a restore.
  +
  +=back
  +
  +=head1 FILES
  +
  +Default cfg file C<@l_prefix@/etc/openpkg-registry/registry.cfg>
  +
  +=head1 SEE ALSO
  +
  +pg_dump(1), psql(1)
  +
  +=head1 AUTHOR
  +
  +Thomas Lotterer E<lt>[EMAIL PROTECTED]<gt>
  +
  +=cut
  +
  @@ .
______________________________________________________________________
The OpenPKG Project                                    www.openpkg.org
CVS Repository Commit List                     openpkg-cvs@openpkg.org

Reply via email to