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:   14-Jul-2006 16:48:28
  Branch: HEAD                             Handle: 2006071415482701

  Modified files:
    openpkg-registry        register.sh registry-db.pl registry-ui.pl

  Log:
    support capturing and storing data about every instances package and
    it's provides into the registry

  Summary:
    Revision    Changes     Path
    1.41        +67 -19     openpkg-registry/register.sh
    1.32        +96 -3      openpkg-registry/registry-db.pl
    1.77        +174 -8     openpkg-registry/registry-ui.pl
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: openpkg-registry/register.sh
  ============================================================================
  $ cvs diff -u -r1.40 -r1.41 register.sh
  --- openpkg-registry/register.sh      14 Jul 2006 14:27:40 -0000      1.40
  +++ openpkg-registry/register.sh      14 Jul 2006 14:48:27 -0000      1.41
  @@ -118,6 +118,9 @@
   REGISTRY_TRAN="$PREFIX/etc/openpkg/register.tran"
   REGISTRY_UTIL="$PREFIX/etc/openpkg/register.util"
   
  +#   amount of data being posted
  +REGISTRY_DATA="request,package,provides"
  +
   #   read baseline config early and allow options to override contents
   readconf
   
  @@ -206,6 +209,11 @@
               if [ ".$arg" = . ]; then help="Missing argument to \"$opt\""; 
break; fi
               REGISTRY_UTIL="$arg"
               ;;
  +        --data )
  +            if [ ".$arg" = . ]; then shift; arg="$1"; fi
  +            if [ ".$arg" = . ]; then help="Missing argument to \"$opt\""; 
break; fi
  +            REGISTRY_DATA="$arg"
  +            ;;
   
           #   debug options
           -v|--verbose ) verbose="yes" ;;
  @@ -237,7 +245,7 @@
       echo "Usage: $progname -m|--mode=fake|post|wipe [-a|--args=<args>]"
       echo "       -u|--user=<user> [-d|--desc=<text>]"
       echo "       [--plat=<text>] [--orel=<text>] [--uuid=<file>]"
  -    echo "       [--conf=<file>] [--prep=<file>] [--tran=<file>] 
[--util=<file>]"
  +    echo "       [--conf=<file>] [--prep=<file>] [--tran=<file>] 
[--util=<file>] [--data=<tag>[,<tag>...]]"
       echo "       [-P|--preparation] [-T|--transaction] [-U|--utilization]"
       echo "       [-C|--convenience] [-I|--interaction]"
       echo "       [-v|--verbose] [-h|--help]"
  @@ -274,23 +282,46 @@
       [ ".$UUID_INSTANCE" = . ] && error "missing information UUID_INSTANCE"
       [ ".$UUID_PLATFORM" = . ] && error "missing information UUID_PLATFORM"
   
  -    (
  -        echo "<?xml version=\"1.0\" encoding=\"iso-8859-1\" 
standalone=\"no\"?>"
  -        echo "<!DOCTYPE registry"
  -        echo "  PUBLIC \"-//OpenPKG//DTD OpenPKG Registry 0.0.1//EN\""
  -        echo "  \"http://registry.openpkg.org/registry.dtd\"; []>"
  -        echo "<registry>"
  -        echo "    <request id=\"$UUID_REGISTRY\""
  -        echo "        registry_user=\"$REGISTRY_USER\""
  -        echo "        registry_desc=\"$REGISTRY_DESC\""
  -        echo "        registry_plat=\"$REGISTRY_PLAT\""
  -        echo "        registry_orel=\"$REGISTRY_OREL\""
  -        echo "        uuid_registry=\"$UUID_REGISTRY\""
  -        echo "        uuid_instance=\"$UUID_INSTANCE\""
  -        echo "        uuid_platform=\"$UUID_PLATFORM\""
  -        echo "    />"
  -        echo "</registry>"
  -    ) | tee $REGISTRY_PREP
  +    #   amount of data being posted
  +    Q='"'; I="    "; N=$'\n'; D=""
  +
  +    echo "$REGISTRY_DATA" | grep request >/dev/null
  +    if [ $? = 0 ]; then
  +        D="${D}<?xml version=${Q}1.0${Q} encoding=${Q}iso-8859-1${Q} 
standalone=${Q}no${Q}?>${N}"
  +        D="${D}<!DOCTYPE registry${N}"
  +        D="${D}  PUBLIC ${Q}-//OpenPKG//DTD OpenPKG Registry 
0.0.1//EN${Q}${N}"
  +        D="${D}  ${Q}http://registry.openpkg.org/registry.dtd${Q} []>${N}"
  +        D="${D}<registry>${N}"
  +        D="${D}${I}<request id=${Q}$UUID_REGISTRY${Q}${N}"
  +        D="${D}${I}${I}registry_user=${Q}$REGISTRY_USER${Q}${N}"
  +        D="${D}${I}${I}registry_desc=${Q}$REGISTRY_DESC${Q}${N}"
  +        D="${D}${I}${I}registry_plat=${Q}$REGISTRY_PLAT${Q}${N}"
  +        D="${D}${I}${I}registry_orel=${Q}$REGISTRY_OREL${Q}${N}"
  +        D="${D}${I}${I}uuid_registry=${Q}$UUID_REGISTRY${Q}${N}"
  +        D="${D}${I}${I}uuid_instance=${Q}$UUID_INSTANCE${Q}${N}"
  +        D="${D}${I}${I}uuid_platform=${Q}$UUID_PLATFORM${Q}${N}"
  +
  +        echo "$REGISTRY_DATA" | grep package >/dev/null
  +        if [ $? = 0 ]; then
  +            D="${D}${I}>${N}"
  +            F=""
  +            F="${F}${I}${I}<package id=${Q}%{PKGID}${Q} name=${Q}%{NAME}${Q} 
version=${Q}%{VERSION}${Q} release=${Q}%{RELEASE}${Q}"
  +            echo "$REGISTRY_DATA" | grep provides >/dev/null
  +            if [ $? = 0 ]; then
  +                F="${F}>\n"
  +                F="${F}[${I}${I}${I}<provides name=${Q}%{PROVIDENAME}${Q} 
flag=${Q}%{PROVIDEFLAGS:depflags}${Q} version=${Q}%{PROVIDEVERSION}${Q}/>\n]"
  +                F="${F}${I}${I}</package>\n"
  +            else
  +                F="${F}/>\n"
  +            fi
  +            D="${D}`$rpm --qf \"${F}\" -qa`${N}"
  +            D="${D}    </request>${N}"
  +        else
  +            D="${D}${I}/>${N}"
  +        fi
  +        D="${D}</registry>${N}"
  +    fi
  +    echo "$D" | tee $REGISTRY_PREP
   }
   
   ##
  @@ -424,6 +455,7 @@
       read -p "[REGISTRY_PLAT=\"$REGISTRY_PLAT\"] platform (*)? ";      [ 
".$REPLY" != . ] && REGISTRY_DESC="$REPLY"
       read -p "[REGISTRY_OREL=\"$REGISTRY_OREL\"] release (*)? ";       [ 
".$REPLY" != . ] && REGISTRY_DESC="$REPLY"
       read -p "[REGISTRY_UUID=\"$REGISTRY_UUID\"] uuid file to read? "; [ 
".$REPLY" != . ] && REGISTRY_UUID="$REPLY"
  +    read -p "[REGISTRY_DATA=\"$REGISTRY_DATA\"] data to prepare? ";   [ 
".$REPLY" != . ] && REGISTRY_DATA="$REPLY"
       read -p "[REGISTRY_PREP=\"$REGISTRY_PREP\"] prep dump file? ";    [ 
".$REPLY" != . ] && REGISTRY_PREP="$REPLY"
   
       [ ".$REGISTRY_USER" = . ] && error "missing information REGISTRY_USER"
  @@ -431,6 +463,7 @@
       [ ".$REGISTRY_PLAT" = . ] && error "missing information REGISTRY_PLAT"
       [ ".$REGISTRY_OREL" = . ] && error "missing information REGISTRY_PREP"
       [ ".$REGISTRY_UUID" = . ] && error "missing information REGISTRY_UUID"
  +    [ ".$REGISTRY_DATA" = . ] && error "missing information REGISTRY_DATA"
       [ ".$REGISTRY_PREP" = . ] && error "missing information REGISTRY_PREP"
   
       if [ -r "$REGISTRY_UUID" ]; then
  @@ -576,7 +609,7 @@
            -u|--user=<user> [I<-d|--desc=<text>>]
             [I<--plat=<text>>] [I<--orel=<text>>] [I<--uuid=<file>>]
             [I<--conf=<file>>] [I<--prep=<file>>] [I<--tran=<file>>]
  -          [I<--util=<file>>]
  +          [I<--util=<file>>] [--data=<tag>[,<tag>...]]
             [I<-P|--preparation>] [I<-T|--transaction>]
             [I<-U|--utilization>] [I<-C|--convenience>]
             [I<-I|--interaction>]
  @@ -794,6 +827,16 @@
   File to save a copy of the output from the "utilization" step.
   Defaults to F<${PREFIX}/etc/openpkg/register.util>
   
  +=item B<--data>
  +
  +Overrides C<${REGISTRY_DATA}> variable in C<${REGISTRY_CONF}> file.
  +Comma separated list of tags to prepare. Available tags are "request",
  +"package" and "provides". The "request" refers to the whole thing and
  +is mandatory. The "package" includes name-version-release information
  +for all installed packages and "provides" adds more details required to
  +capture package options. For details see OPENPKG_PREP below.
  +Defaults to "request,package,provides"
  +
   =back
   
   =head1 FILES
  @@ -830,6 +873,11 @@
            uuid_instance="..."
            uuid_platform="..."
        />
  +     <package id="..." name="ssmtp" version="2.61" release="20050608">
  +        <provides name="ssmtp::with_ssl" flag="=" version="no"/>
  +        <provides name="MTA" flag="" version=""/>
  +        <provides name="ssmtp" flag="=" version="2.61-20050608"/>
  +     </package>
    </registry>
   
   The XML request starts with <?xml version ...> and <!DOCTYPE registry ...>
  @@ .
  patch -p0 <<'@@ .'
  Index: openpkg-registry/registry-db.pl
  ============================================================================
  $ cvs diff -u -r1.31 -r1.32 registry-db.pl
  --- openpkg-registry/registry-db.pl   14 Jul 2006 14:40:11 -0000      1.31
  +++ openpkg-registry/registry-db.pl   14 Jul 2006 14:48:27 -0000      1.32
  @@ -242,11 +242,11 @@
           return 1;
       }
   
  -    #   >0.0.24 upgrade to 0.5.0 is a nop
  +    #   >0.0.24 upgrade to 0.6.0 is a nop
       #
       elsif (    $dbv->{version}->{major} == 0
  -           and $dbv->{version}->{minor} <  5  ) {
  -        $sql = sprintf("UPDATE config SET value = '0.5.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);
           return 1;
  @@ -340,6 +340,7 @@
           $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\./);
  @@ -417,6 +418,18 @@
           return 1;
       }
   
  +    #   0.5.x upgrade to 0.6.0
  +    #
  +    elsif (    $dbv->{version}->{major} == 0
  +           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|);
  +        return 1;
  +    }
  +
       #   program data version and database version only differ in patchlevel 
- just uprev the number
       #
       elsif (    $dbv->{version}->{major} == $datavers->{major}
  @@ -630,6 +643,86 @@
   EOT
   }
   
  +sub schemaregistry2()
  +{
  +    return <<'EOT'
  +    -- package identifiers
  +    CREATE TABLE pkg_ids (
  +        id            TEXT
  +                      CHECK (id ~ '^[0-9a-f]{32}$'),
  +                      -- [d8f831be5def1d1dfb452c0a711e5903]
  +        type          TEXT
  +                      NOT NULL,
  +                      CHECK (type = 'db' OR type = 'rpm' OR type = 'srpm'),
  +                      -- [db]
  +                      PRIMARY KEY (id)
  +    );
  +
  +    -- package name-version-release
  +    CREATE TABLE nvr_names (
  +        name          TEXT,
  +                      -- [ssmtp]
  +                      PRIMARY KEY (name)
  +    );
  +    CREATE TABLE nvr_versions (
  +        version       TEXT
  +                      CHECK (version ~ '^[^-]+$'),
  +                      -- [2.61]
  +                      PRIMARY KEY (version)
  +    );
  +    CREATE TABLE nvr_releases (
  +        release       TEXT
  +                      CHECK (release ~ '^[^-]+$'),
  +                      -- [20050608]
  +                      PRIMARY KEY (release)
  +    );
  +    CREATE TABLE nvr (
  +        name          TEXT REFERENCES nvr_names(name) ON DELETE CASCADE,
  +        version       TEXT REFERENCES nvr_versions(version) ON DELETE 
CASCADE,
  +        release       TEXT REFERENCES nvr_releases(release) ON DELETE 
CASCADE,
  +                      UNIQUE (name, version, release)
  +    );
  +    -- provide name-flag-version
  +    CREATE TABLE nfv_names (
  +        name          TEXT,
  +                      -- [ssmtp]
  +                      PRIMARY KEY (name)
  +    );
  +    CREATE TABLE nfv_flags (
  +        flag          TEXT,
  +                      -- [=]
  +                      PRIMARY KEY (flag)
  +    );
  +    CREATE TABLE nfv_versions (
  +        version       TEXT,
  +                      -- [2.61-20050608]
  +                      PRIMARY KEY (version)
  +    );
  +    CREATE TABLE nfv (
  +        name          TEXT REFERENCES nfv_names(name) ON DELETE CASCADE,
  +        flag          TEXT REFERENCES nfv_flags(flag) ON DELETE CASCADE,
  +        version       TEXT REFERENCES nfv_versions(version) ON DELETE 
CASCADE,
  +                      UNIQUE (name, flag, version)
  +    );
  +    -- instance package list
  +    CREATE TABLE inst_pkg_list (
  +        ipl_inst        TEXT REFERENCES reg_instance(uuid_registry) ON 
DELETE CASCADE,
  +        ipl_pkg_id      TEXT REFERENCES pkg_ids(id) ON DELETE CASCADE,
  +        ipl_nvr_name    TEXT,
  +        ipl_nvr_version TEXT,
  +        ipl_nvr_release TEXT,
  +                        FOREIGN KEY (ipl_nvr_name, ipl_nvr_version, 
ipl_nvr_release)
  +                        REFERENCES nvr(name, version, release) ON DELETE 
CASCADE,
  +        ipl_nfv_name    TEXT,
  +        ipl_nfv_flag    TEXT,
  +        ipl_nfv_version TEXT,
  +                        FOREIGN KEY (ipl_nfv_name, ipl_nfv_flag, 
ipl_nfv_version) 
  +                        REFERENCES nfv(name, flag, version) ON DELETE 
CASCADE,
  +                        UNIQUE (ipl_inst, ipl_pkg_id, ipl_nvr_name, 
ipl_nvr_version, ipl_nvr_release, ipl_nfv_name, ipl_nfv_flag, ipl_nfv_version)
  +    );
  +EOT
  +}
  +
   sub funcregistry()
   {
       return <<'EOT'
  @@ .
  patch -p0 <<'@@ .'
  Index: openpkg-registry/registry-ui.pl
  ============================================================================
  $ cvs diff -u -r1.76 -r1.77 registry-ui.pl
  --- openpkg-registry/registry-ui.pl   13 Jul 2006 08:11:33 -0000      1.76
  +++ openpkg-registry/registry-ui.pl   14 Jul 2006 14:48:28 -0000      1.77
  @@ -89,6 +89,11 @@
               dbfile "$PREFIX/var/openpkg-registry/ui/session.db";
           };
       };
  +
  +    #   processing more than minimum request
  +    request {
  +        package 1;
  +    };
       
       #   canvas integration
       #
  @@ -1605,6 +1610,7 @@
       my $commit = 1;
       my @keys = keys %{$ref->{request}};
       foreach my $k (@keys) {
  +        $res->{$k} = "";
           my $username;
           $username = $ref->{request}->{$k}->{registry_user};
   
  @@ -1615,12 +1621,12 @@
           if (not defined $rv) {
               $msg = $dbh->errstr;
               $msg =~ s/[ ]*ERROR:?[ ]*//;
  -            $res->{$k} = sprintf("ERROR: DataBase reports %s", $msg);
  +            $res->{$k} .= sprintf("ERROR: DataBase reports %s;", $msg);
               $commit = 0;
               next;
           }
           elsif ($rv < 1) {
  -            $res->{$k} = sprintf("ERROR: username \"%s\" not found", 
CGI::escapeHTML($username));
  +            $res->{$k} .= sprintf("ERROR: username \"%s\" not found;", 
CGI::escapeHTML($username));
               $commit = 0;
               next;
           }
  @@ -1642,7 +1648,7 @@
                   }
               }
               else {
  -                ; # reserved for nested structures
  +                ; # reserved - ignore unknown data structures
               }
           }
           $sql = sprintf("UPDATE reg_instance SET registry_date = now(), %s 
WHERE ( uuid_registry = '%s' );", $fieldlist, $rowkey);
  @@ -1651,7 +1657,7 @@
           if (not defined $rv) {
               $msg = $dbh->errstr;
               $msg =~ s/[ ]*ERROR:?[ ]*//;
  -            $res->{$k} = sprintf("ERROR: DataBase reports %s", $msg);
  +            $res->{$k} .= sprintf("ERROR: DataBase reports %s;", $msg);
               $commit = 0;
               next;
           }
  @@ -1667,7 +1673,7 @@
                       #FIXME here we could check the validity of all fields 
with string 'uuid' in their names
                   }
                   else {
  -                    ; # reserved for nested structures
  +                    ; # reserved - ignore unknown data structures
                   }
               }
               $sql = sprintf("INSERT INTO reg_instance (%s) VALUES (%s);", 
$fieldlist, $fieldbind);
  @@ -1676,17 +1682,177 @@
               if (not defined $rv) {
                   $msg = $dbh->errstr;
                   $msg =~ s/[ ]*ERROR:?[ ]*//;
  -                $res->{$k} = sprintf("ERROR: DataBase reports %s", $msg);
  +                $res->{$k} .= sprintf("ERROR: DataBase reports %s;", $msg);
                   $commit = 0;
                   next;
               }
           }
           if ($rv < 1) {
  -            $res->{$k} = sprintf("ERROR: update and insert failed");
  +            $res->{$k} .= sprintf("ERROR: update and insert failed;");
               $commit = 0;
               next;
           }
  -        $res->{$k} = "DONE";
  +
  +        #   maintain package and provides
  +        #
  +        my $package = $ref->{request}->{$k}->{package};
  +        if ($cfg->{request}->{package} and defined $package) {
  +
  +            #   prepare maintain package statement handles once and in 
advance
  +            my $mpsth = {};
  +            $mpsth->{wipe}                = $dbh->prepare(sprintf("DELETE 
FROM inst_pkg_list WHERE (ipl_inst = ?);"));
  +            $mpsth->{pkg_ids}             = $dbh->prepare(sprintf("INSERT 
INTO pkg_ids SELECT ?, 'db' WHERE NOT EXISTS (SELECT 1 FROM pkg_ids WHERE (id = 
?));"));
  +            $mpsth->{nvr_names}           = $dbh->prepare(sprintf("INSERT 
INTO nvr_names SELECT ? WHERE NOT EXISTS (SELECT 1 FROM nvr_names WHERE (name = 
?));"));
  +            $mpsth->{nvr_versions}        = $dbh->prepare(sprintf("INSERT 
INTO nvr_versions SELECT ? WHERE NOT EXISTS (SELECT 1 FROM nvr_versions WHERE 
(version = ?));"));
  +            $mpsth->{nvr_releases}        = $dbh->prepare(sprintf("INSERT 
INTO nvr_releases SELECT ? WHERE NOT EXISTS (SELECT 1 FROM nvr_releases WHERE 
(release = ?));"));
  +            $mpsth->{nvr}                 = $dbh->prepare(sprintf("INSERT 
INTO nvr SELECT ?, ?, ? WHERE NOT EXISTS (SELECT 1 FROM nvr WHERE (name = ? AND 
version = ? AND release = ?));"));
  +            $mpsth->{nfv_names}           = $dbh->prepare(sprintf("INSERT 
INTO nfv_names SELECT ? WHERE NOT EXISTS (SELECT 1 FROM nfv_names WHERE (name = 
?));"));
  +            $mpsth->{nfv_flags}           = $dbh->prepare(sprintf("INSERT 
INTO nfv_flags SELECT ? WHERE NOT EXISTS (SELECT 1 FROM nfv_flags WHERE (flag = 
?));"));
  +            $mpsth->{nfv_versions}        = $dbh->prepare(sprintf("INSERT 
INTO nfv_versions SELECT ? WHERE NOT EXISTS (SELECT 1 FROM nfv_versions WHERE 
(version = ?));"));
  +            $mpsth->{nfv}                 = $dbh->prepare(sprintf("INSERT 
INTO nfv SELECT ?, ?, ? WHERE NOT EXISTS (SELECT 1 FROM nfv WHERE (name = ? AND 
flag = ? AND version = ?));"));
  +            $mpsth->{nfvshort}            = $dbh->prepare(sprintf("INSERT 
INTO nfv SELECT ?, NULL, NULL WHERE NOT EXISTS (SELECT 1 FROM nfv WHERE (name = 
? AND flag IS NULL AND version IS NULL));"));
  +            $mpsth->{inst_pkg_list}       = $dbh->prepare(sprintf("INSERT 
INTO inst_pkg_list VALUES (?, ?, ?, ?, ?, ?, ?, ?);"));
  +            $mpsth->{inst_pkg_list_short} = $dbh->prepare(sprintf("INSERT 
INTO inst_pkg_list VALUES (?, ?, ?, ?, ?, ?, NULL, NULL);"));
  +
  +            #   wipe existing data for this instance, if any
  +            $rv = $mpsth->{wipe}->execute($rowkey);
  +            if (not defined $rv) {
  +                $msg = $dbh->errstr;
  +                $msg =~ s/[ ]*ERROR:?[ ]*//;
  +                $res->{$k} .= sprintf("ERROR: DataBase reports %s;", $msg);
  +                $commit = 0;
  +                next PKG;
  +            }
  +            PKG: for my $pkg (keys %{$package}) {
  +
  +                #   maintain package identifiers
  +                $rv = $mpsth->{pkg_ids}->execute($pkg, $pkg);
  +                if (not defined $rv) {
  +                    $msg = $dbh->errstr;
  +                    $msg =~ s/[ ]*ERROR:?[ ]*//; $msg =~ s/\n+/ /gs;
  +                    $res->{$k} .= sprintf("ERROR: DataBase reports %s;", 
$msg);
  +                    $commit = 0;
  +                    next PKG;
  +                }
  +
  +                #   maintain name, version, release and name-version-release
  +                $rv = $mpsth->{nvr_names}->execute($package->{$pkg}->{name}, 
$package->{$pkg}->{name});
  +                if (not defined $rv) {
  +                    $msg = $dbh->errstr;
  +                    $msg =~ s/[ ]*ERROR:?[ ]*//; $msg =~ s/\n+/ /gs;
  +                    $res->{$k} .= sprintf("ERROR: DataBase reports %s;", 
$msg);
  +                    $commit = 0;
  +                    next PKG;
  +                }
  +                $rv = 
$mpsth->{nvr_versions}->execute($package->{$pkg}->{version}, 
$package->{$pkg}->{version});
  +                if (not defined $rv) {
  +                    $msg = $dbh->errstr;
  +                    $msg =~ s/[ ]*ERROR:?[ ]*//; $msg =~ s/\n+/ /gs;
  +                    $res->{$k} .= sprintf("ERROR: DataBase reports %s;", 
$msg);
  +                    $commit = 0;
  +                    next PKG;
  +                }
  +                $rv = 
$mpsth->{nvr_releases}->execute($package->{$pkg}->{release}, 
$package->{$pkg}->{release});
  +                if (not defined $rv) {
  +                    $msg = $dbh->errstr;
  +                    $msg =~ s/[ ]*ERROR:?[ ]*//; $msg =~ s/\n+/ /gs;
  +                    $res->{$k} .= sprintf("ERROR: DataBase reports %s;", 
$msg);
  +                    $commit = 0;
  +                    next PKG;
  +                }
  +                $rv = $mpsth->{nvr}->execute($package->{$pkg}->{name}, 
$package->{$pkg}->{version}, $package->{$pkg}->{release}, 
$package->{$pkg}->{name}, $package->{$pkg}->{version}, 
$package->{$pkg}->{release});
  +                if (not defined $rv) {
  +                    $msg = $dbh->errstr;
  +                    $msg =~ s/[ ]*ERROR:?[ ]*//; $msg =~ s/\n+/ /gs;
  +                    $res->{$k} .= sprintf("ERROR: DataBase reports %s;", 
$msg);
  +                    $commit = 0;
  +                    next PKG;
  +                }
  +
  +                #   assume at least a single provide for name = 
version-release, fake it if it is missing
  +                if (not exists $package->{$pkg}->{provides}) {
  +                    $package->{$pkg}->{provides} = [
  +                        {
  +                            'version' => $package->{$pkg}->{name},
  +                            'flag' => '=',
  +                            'name' => $package->{$pkg}->{version} . "-" .  
$package->{$pkg}->{release}
  +                        }
  +                    ];
  +                }
  +                foreach my $prv (@{$package->{$pkg}->{provides}}) {
  +                    #   maintain name, flag, version, name-flag-version
  +                    $rv = $mpsth->{nfv_names}->execute($prv->{name}, 
$prv->{name});
  +                    if (not defined $rv) {
  +                        $msg = $dbh->errstr;
  +                        $msg =~ s/[ ]*ERROR:?[ ]*//; $msg =~ s/\n+/ /gs;
  +                        $res->{$k} .= sprintf("ERROR: DataBase reports %s;", 
$msg);
  +                        $commit = 0;
  +                        next PKG;
  +                    }
  +                    if ($prv->{flag} ne '' and $prv->{version} ne '') {
  +                        $rv = $mpsth->{nfv_flags}->execute($prv->{flag}, 
$prv->{flag});
  +                        if (not defined $rv) {
  +                            $msg = $dbh->errstr;
  +                            $msg =~ s/[ ]*ERROR:?[ ]*//; $msg =~ s/\n+/ /gs;
  +                            $res->{$k} .= sprintf("ERROR: DataBase reports 
%s;", $msg);
  +                            $commit = 0;
  +                            next PKG;
  +                        }
  +                        $rv = 
$mpsth->{nfv_versions}->execute($prv->{version}, $prv->{version});
  +                        if (not defined $rv) {
  +                            $msg = $dbh->errstr;
  +                            $msg =~ s/[ ]*ERROR:?[ ]*//; $msg =~ s/\n+/ /gs;
  +                            $res->{$k} .= sprintf("ERROR: DataBase reports 
%s;", $msg);
  +                            $commit = 0;
  +                            next PKG;
  +                        }
  +                        $rv = $mpsth->{nfv}->execute($prv->{name}, 
$prv->{flag}, $prv->{version}, $prv->{name}, $prv->{flag}, $prv->{version});
  +                        if (not defined $rv) {
  +                            $msg = $dbh->errstr;
  +                            $msg =~ s/[ ]*ERROR:?[ ]*//; $msg =~ s/\n+/ /gs;
  +                            $res->{$k} .= sprintf("ERROR: DataBase reports 
%s;", $msg);
  +                            $commit = 0;
  +                            next PKG;
  +                        }
  +                    }
  +                    else {
  +                        $rv = $mpsth->{nfvshort}->execute($prv->{name}, 
$prv->{name});
  +                        if (not defined $rv) {
  +                            $msg = $dbh->errstr;
  +                            $msg =~ s/[ ]*ERROR:?[ ]*//; $msg =~ s/\n+/ /gs;
  +                            $res->{$k} .= sprintf("ERROR: DataBase reports 
%s;", $msg);
  +                            $commit = 0;
  +                            next PKG;
  +                        }
  +                    }
  +
  +                    #   maintain inst_pkg_list
  +                    if ($prv->{flag} ne '' and $prv->{version} ne '') {
  +                        $rv = $mpsth->{inst_pkg_list}->execute($rowkey, 
$pkg, $package->{$pkg}->{name}, $package->{$pkg}->{version}, 
$package->{$pkg}->{release}, $prv->{name}, $prv->{flag}, $prv->{version});
  +                        if (not defined $rv) {
  +                            $msg = $dbh->errstr;
  +                            $msg =~ s/[ ]*ERROR:?[ ]*//; $msg =~ s/\n+/ /gs;
  +                            $res->{$k} .= sprintf("ERROR: DataBase reports 
%s;", $msg);
  +                            $commit = 0;
  +                            next PKG;
  +                        }
  +                    }
  +                    else {
  +                        $rv = 
$mpsth->{inst_pkg_list_short}->execute($rowkey, $pkg, $package->{$pkg}->{name}, 
$package->{$pkg}->{version}, $package->{$pkg}->{release}, $prv->{name});
  +                        if (not defined $rv) {
  +                            $msg = $dbh->errstr;
  +                            $msg =~ s/[ ]*ERROR:?[ ]*//; $msg =~ s/\n+/ /gs;
  +                            $res->{$k} .= sprintf("ERROR: DataBase reports 
%s;", $msg);
  +                            $commit = 0;
  +                            next PKG;
  +                        }
  +                    }
  +                }
  +            }
  +        }
  +
  +        #   success with instance
  +        $res->{$k} = "DONE" if ($res->{$k} eq "");
       }
   
       if ($commit == 1) {
  @@ .
______________________________________________________________________
The OpenPKG Project                                    www.openpkg.org
CVS Repository Commit List                     openpkg-cvs@openpkg.org

Reply via email to