]> git.donarmstrong.com Git - debbugs.git/commitdiff
Debbugs::packages::get_versions can now use the database
authorDon Armstrong <don@donarmstrong.com>
Mon, 16 Apr 2018 23:43:25 +0000 (16:43 -0700)
committerDon Armstrong <don@donarmstrong.com>
Mon, 16 Apr 2018 23:43:56 +0000 (16:43 -0700)
Debbugs/Packages.pm
cgi/version.cgi

index 783dc24e59a0ecc0cc450265a238e04f4bd9978f..2cdef213fce3b89abec6349e5e909d1166fb97a7 100644 (file)
@@ -39,7 +39,7 @@ use MLDBM qw(DB_File Storable);
 use Storable qw(dclone);
 use Params::Validate qw(validate_with :types);
 use Debbugs::Common qw(make_list globify_scalar sort_versions);
-
+use DateTime::Format::Pg;
 use List::AllUtils qw(min max uniq);
 
 use IO::File;
@@ -737,8 +737,129 @@ sub get_versions{
                                           largest_source_version_only => {type => BOOLEAN,
                                                                       default => 1,
                                                                          },
+                                          schema => {type => OBJECT,
+                                                     optional => 1,
+                                                    },
                                          },
-                              );
+                             );
+     if (defined $param{schema}) {
+        my @src_packages;
+        my @bin_packages;
+        for my $pkg (make_list($param{package})) {
+            if ($pkg =~ /^src:(.+)/) {
+                push @src_packages,
+                    $1;
+            } else {
+               push @bin_packages,$pkg;
+            }
+        }
+
+        my $s = $param{schema};
+        use Data::Printer;
+        p @src_packages;
+        my %return;
+        if (@src_packages) {
+            my $src_rs = $s->resultset('SrcVer')->
+                search({'src_pkg.pkg'=>[@src_packages],
+                        -or => {'suite.codename' => [make_list($param{dist})],
+                                'suite.suite_name' => [make_list($param{dist})],
+                               }
+                       },
+                      {join => ['src_pkg',
+                               {
+                                src_associations=>'suite'},
+                               ],
+                       '+select' => [qw(src_pkg.pkg),
+                                     qw(suite.codename),
+                                     qw(src_associations.modified),
+                                     q(CONCAT(src_pkg.pkg,'/',me.ver))],
+                       '+as' => ['src_pkg_name','codename',
+                                 'modified_time',
+                                 qw(src_pkg_ver)],
+                       result_class => 'DBIx::Class::ResultClass::HashRefInflator',
+                       order_by => {-desc => 'me.ver'},
+                      },
+                      );
+            my %completed_dists;
+            for my $src ($src_rs->all()) {
+                my $val = 'source';
+                if ($param{time}) {
+                    $val = DateTime::Format::Pg->
+                        parse_datetime($src->{modified_time})->
+                        epoch();
+                }
+                if ($param{largest_source_version_only}) {
+                    next if $completed_dists{$src->{codename}};
+                    $completed_dists{$src->{codename}} = 1;
+                }
+                if ($param{source}) {
+                    $return{$src->{src_pkg_ver}} = $val;
+                } else {
+                    $return{$src->{ver}} = $val;
+                }
+            }
+        }
+        if (@bin_packages) {
+            my $bin_rs = $s->resultset('BinVer')->
+                search({'bin_pkg.pkg' => [@bin_packages],
+                        -or => {'suite.codename' => [make_list($param{dist})],
+                                'suite.suite_name' => [make_list($param{dist})],
+                               },
+                       },
+                      {join => ['bin_pkg',
+                               {
+                                'src_ver'=>'src_pkg'},
+                               {
+                                bin_associations => 'suite'},
+                                'arch',
+                               ],
+                       '+select' => [qw(bin_pkg.pkg arch.arch suite.codename),
+                                     qw(bin_associations.modified),
+                                     qw(src_pkg.pkg),q(CONCAT(src_pkg.pkg,'/',me.ver)),
+                                    ],
+                       '+as' => ['bin_pkg','arch','codename',
+                                 'modified_time',
+                                 'src_pkg_name','src_pkg_ver'],
+                       result_class => 'DBIx::Class::ResultClass::HashRefInflator',
+                       order_by => {-desc => 'src_ver.ver'},
+                      });
+            if (exists $param{arch}) {
+                $bin_rs =
+                    $bin_rs->search({'arch.arch' => [make_list($param{arch})]},
+                                   {
+                                    join => 'arch'}
+                                   );
+            }
+            my %completed_dists;
+            for my $bin ($bin_rs->all()) {
+                my $key = $bin->{ver};
+                if ($param{source}) {
+                    $key = $bin->{src_pkg_ver};
+                }
+                my $val = $bin->{arch};
+                if ($param{time}) {
+                    $val = DateTime::Format::Pg->
+                        parse_datetime($bin->{modified_time})->
+                        epoch();
+                }
+                if ($param{largest_source_version_only}) {
+                    if ($completed_dists{$bin->{codename}} and not
+                        exists $return{$key}) {
+                        next;
+                    }
+                    $completed_dists{$bin->{codename}} = 1;
+                }
+                push @{$return{$key}},
+                    $val;
+            }
+        }
+        if ($param{return_archs}) {
+            if ($param{time} or $param{return_archs}) {
+                return wantarray?%return :\%return;
+            }
+            return wantarray?keys %return :[keys %return];
+        }
+     }
      my $versions;
      if ($param{time}) {
          return () if not defined $gVersionTimeIndex;
@@ -872,6 +993,9 @@ sub make_source_versions {
                                         warnings => {type => SCALARREF|HANDLE,
                                                      optional => 1,
                                                     },
+                                        schema => {type => OBJECT,
+                                                   optional => 1,
+                                                  },
                                        },
                             );
     my ($warnings) = globify_scalar(exists $param{warnings}?$param{warnings}:undef);
index b7d99b96396ee68f0d51625bbe42bf37d7d35b77..64e53147b94da51e37655397777c9c736adadff1 100755 (executable)
@@ -42,7 +42,7 @@ use CGI::Simple;
 use Debbugs::Config qw(:config);
 
 our $VERSION=1;
-
+use Debbugs::DB;
 use Debbugs::CGI qw(htmlize_packagelinks html_escape cgi_parameters munge_url :cache);
 use Debbugs::Versions;
 use Debbugs::Versions::Dpkg;
@@ -52,6 +52,12 @@ use File::Temp qw(tempdir);
 use IO::File;
 use IO::Handle;
 
+my @schema_arg = ();
+if (defined $config{database}) {
+    $s = Debbugs::DB->connect($config{database}) or
+        die "Unable to connect to DB";
+    @schema_arg = ('schema',$s);
+}
 
 my %img_types = (svg => 'image/svg+xml',
                 png => 'image/png',
@@ -141,6 +147,7 @@ for my $dist (@{$config{distributions}}) {
      $versions{$dist} = [get_versions(package => [split /\s*,\s*/, $cgi_var{package}],
                                      dist => $dist,
                                      source => 1,
+                                     @schema_arg,
                                     )];
      # make version_to_dist
      foreach my $version (@{$versions{$dist}}){