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:   24-Nov-2005 12:10:09
  Branch: HEAD                             Handle: 2005112411100900

  Modified files:
    openpkg-registry        VERSION registry-db.pl registry-ui.pl

  Log:
    make some some hard coded items configurable

  Summary:
    Revision    Changes     Path
    1.3         +1  -1      openpkg-registry/VERSION
    1.4         +221 -56    openpkg-registry/registry-db.pl
    1.6         +28 -12     openpkg-registry/registry-ui.pl
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: openpkg-registry/VERSION
  ============================================================================
  $ cvs diff -u -r1.2 -r1.3 VERSION
  --- openpkg-registry/VERSION  19 Nov 2005 22:13:07 -0000      1.2
  +++ openpkg-registry/VERSION  24 Nov 2005 11:10:09 -0000      1.3
  @@ -2,5 +2,5 @@
     VERSION -- Version Information for OpenPKG Registry (syntax: Text)
     [automatically generated and maintained by GNU shtool]
   
  -  This is OpenPKG Registry, Version 0.0.16 (19-Nov-2005)
  +  This is OpenPKG Registry, Version 0.0.23 (24-Nov-2005)
   
  @@ .
  patch -p0 <<'@@ .'
  Index: openpkg-registry/registry-db.pl
  ============================================================================
  $ cvs diff -u -r1.3 -r1.4 registry-db.pl
  --- openpkg-registry/registry-db.pl   22 Nov 2005 12:16:49 -0000      1.3
  +++ openpkg-registry/registry-db.pl   24 Nov 2005 11:10:09 -0000      1.4
  @@ -37,8 +37,8 @@
   
   #   program name, version and date
   my $progname="registry-db.pl";
  -my $progvers="0.0.16";
  -my $progdate="19-Nov-2005";
  +my $progvers="0.0.23";
  +my $progdate="24-Nov-2005";
   
   #   derive data version from program version
   my $datavers={};
  @@ -63,10 +63,9 @@
   $cfg->{db}->{template1}->{password}="postgresql";
   $cfg->{db}->{registry}->{username}="registry";
   $cfg->{db}->{registry}->{password}="registry";
  -
  -
  -#   catch and hold time
  -my $time = time();
  +$cfg->{db}->{registry}->{tablespace}="registry";
  +$cfg->{db}->{registry}->{host}="127.0.0.1";
  +$cfg->{db}->{session}->{dbfile}="$PREFIX/var/openpkg-registry/ui/session.db";
   
   #   database handle and scratch variables
   #
  @@ -76,25 +75,45 @@
   my $sth; # scratch statement handle for database operations
   my $msg; # scratch variable for message fiddling
   my $dbh; # database handle
  +my $dbv; # database version
   
  -sub dbinit($) {
  -    my ($dbname) = @_;
  -
  -    return DBI->connect (
  -        "DBI:Pg:dbname=".$dbname.";host=".$cfg->{db}->{host},
  -        $cfg->{db}->{$dbname}->{username},
  -        $cfg->{db}->{$dbname}->{password},
  -        {
  -            PrintError => 0,
  -            RaiseError => 0,
  -            AutoCommit => 1
  -        }
  -    );
  +sub dbopen($) {
  +    my ($db) = @_;
  +    my $dbi;
  +    $dbi = undef;
  +
  +    print "==== processing Database $db ====\n";
  +    if    ($db eq "template1" or $db eq "registry") {
  +        $dbi = DBI->connect (
  +            
"DBI:Pg:dbname=".$cfg->{db}->{registry}->{tablespace}.";host=".$cfg->{db}->{registry}->{host},
  +            $cfg->{db}->{$db}->{username},
  +            $cfg->{db}->{$db}->{password},
  +            {
  +                PrintError => 0,
  +                RaiseError => 0,
  +                AutoCommit => 1
  +            }
  +        );
  +    }
  +    elsif ($db eq "session") {
  +        $dbi = DBI->connect (
  +            "DBI:SQLite:dbname=".$cfg->{db}->{session}->{dbfile}, "", "",
  +            {
  +                PrintError => 0,
  +                RaiseError => 0,
  +                AutoCommit => 1
  +            }
  +        );
  +    }
  +    else {
  +        die "dbopen does not know how to handle db=\"".$db."\"";
  +    }
  +    return $dbi;
   }
   
   #   create user, tablespace and database
   #
  -$dbh = &dbinit("template1");
  +$dbh = &dbopen("template1");
   die "ERROR:$0: DataBase error: ".$DBI::errstr."\n" if (not defined $dbh);
   
   $sql="CREATE USER registry ENCRYPTED PASSWORD 'registry' NOCREATEDB 
NOCREATEUSER;";
  @@ -113,44 +132,70 @@
   
   #   registry
   #
  -$dbh = &dbinit("registry");
  +$dbh = &dbopen("registry");
   die "ERROR:$0: DataBase error: ".$DBI::errstr."\n" if (not defined $dbh);
  +while(&upgraderegistry()) {};
  +$dbh->disconnect(); undef $dbh;
   
  -my $reg_config;
  -while(&upgrade()) {};
  -
  -#   die gracefully
  +#   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;
  +
   exit(0);
   
  -sub upgrade()
  +sub upgradesession()
   {
  -    $sql="SELECT * FROM reg_config;";
  +    ($dbv, $rv) = undef;
  +
  +    $sql="SELECT * FROM config;";
       $rv = $dbh->selectall_hashref($sql, "key");
       if (not defined %{$rv}->{version}) {
  -        $reg_config->{ 'version' => { 'key' => 'version', 'value' => '0.0.0' 
} }
  +        $dbv = { 'version' => { 'key' => 'version', 'value' => '0.0.0' } }
       }
       else {
  -        $reg_config=$rv;
  +        $dbv=$rv;
       }
   
  -    if($reg_config->{version}->{value} =~ m/^([0-9]+)\.([0-9]+)\.([0-9]+)$/) 
{
  -        $reg_config->{version}->{major}=$1;
  -        $reg_config->{version}->{minor}=$2;
  -        $reg_config->{version}->{patch}=$3;
  +    if($dbv->{version}->{value} =~ m/^([0-9]+)\.([0-9]+)\.([0-9]+)$/) {
  +        $dbv->{version}->{major}=$1;
  +        $dbv->{version}->{minor}=$2;
  +        $dbv->{version}->{patch}=$3;
       }
       else {
  -        die "cannot derive database major.minor.patch triple from 
value=".$reg_config->{version}->{value};
  +        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";
  +     # 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 
($dbh->errstr =~ m|ERROR|);
  +        $sql = &schemasession2();
  +        $rv = $dbh->do($sql);
  +        print "[schema.2]\nrv=".$rv." message=".$dbh->errstr."\n\n"; die if 
($dbh->errstr =~ m|ERROR|);
  +        $sql = "INSERT INTO config VALUES ( 'version', '".$progvers."' );";
  +        $rv = $dbh->do($sql);
  +        print "[schema.v]\nrv=".$rv." message=".$dbh->errstr."\n\n"; die if 
($dbh->errstr =~ m|ERROR|);
  +        return 1;
       }
   
       #   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}
  +    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} . "."
  @@ -161,18 +206,18 @@
   
       #   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}
  +    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 program major/minor datavers="
                             . $datavers->{major} . "."
                             . $datavers->{minor} . "."
                             . $datavers->{patch}
                             . "\n";
  -        $sql = sprintf("UPDATE reg_config SET value = '%s.%s.%s' WHERE ( key 
= 'version' );",
  +        $sql = sprintf("UPDATE config SET value = '%s.%s.%s' WHERE ( key = 
'version' );",
                               $datavers->{major},
                               $datavers->{minor},
                               $datavers->{patch});
  @@ -181,15 +226,55 @@
           return 1;
       }
   
  +    #   unsupported upgrade case
  +    #
  +    else {
  +        print "program version=" . $progvers . " cannot handle database 
version=" . $dbv->{version}->{value} . "\n";
  +        print "database=" . $dbv->{version}->{major} . "."
  +                          . $dbv->{version}->{minor} . "."
  +                          . $dbv->{version}->{patch}
  +                          . " cannot be upgraded by this program which uses 
datavers="
  +                          . $datavers->{major} . "."
  +                          . $datavers->{minor} . "."
  +                          . $datavers->{patch}
  +                          . "\n";
  +        return 0;
  +    }
  +    die
  +}
  +
  +sub upgraderegistry()
  +{
  +    $dbv = {};
  +
  +    $sql="SELECT * FROM reg_config;";
  +    $rv = $dbh->selectall_hashref($sql, "key");
  +    if (not defined %{$rv}->{version}) {
  +        $dbv = { 'version' => { 'key' => 'version', 'value' => '0.0.0' } }
  +    }
  +    else {
  +        $dbv=$rv;
  +    }
  +
  +    if($dbv->{version}->{value} =~ m/^([0-9]+)\.([0-9]+)\.([0-9]+)$/) {
  +        $dbv->{version}->{major}=$1;
  +        $dbv->{version}->{minor}=$2;
  +        $dbv->{version}->{patch}=$3;
  +    }
  +    else {
  +        die "cannot derive database major.minor.patch triple from 
value=".$dbv->{version}->{value};
  +    }
  +
  +
       #   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) {
  +    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 = &schema();
  +        $sql = &schemaregistry();
           $sql .= "INSERT INTO reg_config VALUES ( 'version', '".$progvers."' 
);";
           $sql .= &sample() if ($progvers =~ m/^0\.0\./);
           $rv = $dbh->do($sql);
  @@ -199,13 +284,51 @@
           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} . "."
  +                          . $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->{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;
  +    }
  +
       #   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}
  +        print "program version=" . $progvers . " cannot handle database 
version=" . $dbv->{version}->{value} . "\n";
  +        print "database=" . $dbv->{version}->{major} . "."
  +                          . $dbv->{version}->{minor} . "."
  +                          . $dbv->{version}->{patch}
                             . " cannot be upgraded by this program which uses 
datavers="
                             . $datavers->{major} . "."
                             . $datavers->{minor} . "."
  @@ -216,7 +339,49 @@
       die
   }
   
  -sub schema()
  +sub schemasessionFIXME()
  +{
  +    return <<'EOT'
  +    CREATE TABLE config ( key TEXT NOT NULL PRIMARY KEY, value TEXT NOT NULL 
);
  +    CREATE TABLE session ( id CHAR(36) NOT NULL PRIMARY KEY, a_session BLOB 
NOT NULL );
  +    return <<'EOT'
  +EOT
  +}
  +
  +sub schemasession1()
  +{
  +    return <<'EOT'
  +    -- OpenPKG configuration
  +    CREATE TABLE config (
  +        key           TEXT 
  +                      NOT NULL
  +                      PRIMARY KEY,
  +                      -- generic key
  +                      -- [version]
  +        value         TEXT
  +                      NOT NULL
  +                      -- generic value
  +                      -- [0.8.15]
  +    );
  +EOT
  +}
  +
  +sub schemasession2()
  +{
  +    return <<'EOT'
  +    -- OpenPKG session
  +   CREATE TABLE session (
  +        id             CHAR(36) NOT NULL PRIMARY KEY,
  +                       -- Session Identifier (OSSP::uuid based)
  +                       -- [75468374-8721-11d9-bee4-0002a5489f14]
  +        a_session      BLOB NOT NULL
  +                       -- Session Data (Storage based)
  +                       -- [XXXXXXX...]
  +    );
  +EOT
  +}
  +
  +sub schemaregistry()
   {
       return <<'EOT'
       -- OpenPKG configuration
  @@ .
  patch -p0 <<'@@ .'
  Index: openpkg-registry/registry-ui.pl
  ============================================================================
  $ cvs diff -u -r1.5 -r1.6 registry-ui.pl
  --- openpkg-registry/registry-ui.pl   24 Nov 2005 11:08:42 -0000      1.5
  +++ openpkg-registry/registry-ui.pl   24 Nov 2005 11:10:09 -0000      1.6
  @@ -57,6 +57,10 @@
   #
   $cfg->{identification}->{mode} = "basicauth";
   $cfg->{identification}->{default} = "[EMAIL PROTECTED]"; #anonymous
  +$cfg->{db}->{registry}->{username}="registry";
  +$cfg->{db}->{registry}->{password}="registry";
  +$cfg->{db}->{registry}->{tablespace}="registry";
  +$cfg->{db}->{registry}->{host}="127.0.0.1";
   
   #   create objects
   my $cgi  = new CGI;
  @@ -71,17 +75,27 @@
   my $msg; # scratch variable for message fiddling
   my $dbh; # database handle
   
  -sub dbinit() {
  -    return DBI->connect (
  -        "DBI:Pg:dbname=registry;host=127.0.0.1",
  -        "registry",
  -        "registry",
  -        {
  -            PrintError => 0,
  -            RaiseError => 0,
  -            AutoCommit => 0
  -        }
  -    );
  +sub dbopen($) {
  +    my ($db) = @_;
  +    my $dbi;
  +    $dbi = undef;
  +
  +    if    ($db eq "registry") {
  +        $dbi = DBI->connect (
  +            
"DBI:Pg:dbname=".$cfg->{db}->{registry}->{tablespace}.";host=".$cfg->{db}->{registry}->{host},
  +            $cfg->{db}->{$db}->{username},
  +            $cfg->{db}->{$db}->{password},
  +            {
  +                PrintError => 0,
  +                RaiseError => 0,
  +                AutoCommit => 0
  +            }
  +        );
  +    }
  +    else {
  +        die "dbopen does not know how to handle db=\"".$db."\"";
  +    }
  +    return $dbi;
   }
   
   #   first check for pages which do not require database access
  @@ -110,7 +124,7 @@
   
   #   pages below require database access
   #
  -$dbh = &dbinit();
  +$dbh = &dbopen("registry");
   if (not defined $dbh) {
       my $out;
       $out = '';
  @@ -126,6 +140,8 @@
       exit(0)
   }
   
  +#   continue to the pages that require database access
  +#
   if    ($cgi->param("page") eq "login") {
       my $out;
       $out = '';
  @@ .
______________________________________________________________________
The OpenPKG Project                                    www.openpkg.org
CVS Repository Commit List                     [email protected]

Reply via email to