X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=bin%2Fdebbugs-updatesqlcache;h=9422adfdab945a71e972b3033303a0f9941b99d8;hb=b10a87938eb116b8871081643058052564e39603;hp=0deebf5cd6a08d80b49d5b6fdd6ceca814443804;hpb=b5c391940f538e25a26f426b6dbcfa06aac4e12a;p=debbugs.git diff --git a/bin/debbugs-updatesqlcache b/bin/debbugs-updatesqlcache index 0deebf5..9422adf 100755 --- a/bin/debbugs-updatesqlcache +++ b/bin/debbugs-updatesqlcache @@ -96,7 +96,8 @@ use Debbugs::Status qw(bug_presence read_bug); use Debbugs::DB; use DateTime; use File::stat; - +use List::AllUtils qw(natatime uniq); +use POSIX qw(ceil); my %options = (debug => 0, @@ -105,7 +106,8 @@ my %options = verbose => 0, quiet => 0, quick => 0, - service => $config{debbugs_db}, + archived => 0, + service => $config{database}, progress => 0, ); @@ -115,6 +117,7 @@ GetOptions(\%options, 'service|s=s', 'sysconfdir|c=s', 'progress!', + 'archived+', 'spool_dir|spool-dir=s', 'verbose|v+', 'quiet+', @@ -128,6 +131,8 @@ $DEBUG = $options{debug}; my %subcommands = ('update' => {function => \&update_cache, + arguments => {'suites|suite=s@' => 0, + }, }, 'help' => {function => sub {pod2usage({verbose => 2});}} ); @@ -190,12 +195,26 @@ sub update_cache { # get all of the possible architectures that we might care about # select distinct s.codename,a.arch from bin_associations ba join bin_ver bv on ba.bin=bv.id join suite s on ba.suite=s.id join arch a on bv.arch=a.id; - my @suites = - $s->resultset('Suite')-> - search_rs({active => 1, - }, - {result_class => 'DBIx::Class::ResultClass::HashRefInflator'} - )->all(); + my @suites; + if (exists $opts->{suites}) { + @suites = + $s->resultset('Suite')-> + search_rs({active => 1, + -or => {codename => [make_list($opts->{suites})], + suite_name => [make_list($opts->{suites})], + }, + }, + {result_class => 'DBIx::Class::ResultClass::HashRefInflator'} + )->all(); + } else { + @suites = + $s->resultset('Suite')-> + search_rs({active => 1, + }, + {result_class => 'DBIx::Class::ResultClass::HashRefInflator'} + )->all(); + } + my @bugs; my $bugs; if ($options->{quick}) { # identify the last time that we ran this query @@ -215,52 +234,75 @@ sub update_cache { } # select last status update $last_query_time = $dtf->format_datetime($last_query_time); - $bugs = $s->resultset('Bug')-> - search_rs({-or => {'bin_associations.modified' => {'>=',$last_query_time}, - 'src_associations.modified' => {'>=',$last_query_time}, - 'me.log_modified' => {'>=',$last_query_time}, - 'me.last_modified' => {'>=',$last_query_time}, - } + # select all bugs which are in packages which have had a binary + # association modified + push @bugs, + map {$_->{bug_binpackages}{bug}} + $s->resultset('BinAssociation')-> + search_rs({'me.modified' => {'>=',$last_query_time}, + }, + {columns => [qw(bug_binpackages.bug)], + join => {bin => + {bin_pkg => + 'bug_binpackages' + }}, + result_class => 'DBIx::Class::ResultClass::HashRefInflator', + }, + )->all(); + # or a source association modified + push @bugs, + map {$_->{bug_srcpackages}{bug}} + $s->resultset('SrcAssociation')-> + search_rs({'me.modified' => {'>=',$last_query_time}, }, - {join => [{bug_binpackages => - {bin_pkg => - {bin_vers => - 'bin_associations'}}}, - {bug_srcpackages => + {columns => [qw(bug_srcpackages.bug)], + join => {source => {src_pkg => - {src_vers => - 'src_associations'}}}, - ], - columns => [qw(id)], - distinct => 1, - rows => 100, - page => 1, + 'bug_srcpackages' + }}, + result_class => 'DBIx::Class::ResultClass::HashRefInflator', }, - ); + )->all(); + # or bugs which have been modified since we last ran + push @bugs, + map {$_->{id}} + $s->resultset('Bug')-> + search_rs({-or => {'me.log_modified' => {'>=',$last_query_time}, + 'me.last_modified' => {'>=',$last_query_time}, + }, + archived => ! $options->{archived}, + }, + {columns => [qw(id)], + result_class => 'DBIx::Class::ResultClass::HashRefInflator', + }, + )->all(); + @bugs = uniq(@bugs); - # select bugs which have been modified since the last updatex } else { - $bugs = $s->resultset('Bug')-> - search_rs(undef, - {rows => 100, - page => 1, - columns => [qw(id)], - }); + ## or just select all of them + push @bugs, + map {$_->{id}} + $s->resultset('Bug')-> + search_rs({archived => ! $options->{archived}}, + {columns => [qw(id)], + result_class => 'DBIx::Class::ResultClass::HashRefInflator', + }, + )->all(); } my $update_bug = sub { - my @bugs = @_; - for my $bug (@bugs) { - my $status = read_bug(bug => $bug->id); + my @b = @_; + for my $bug (@b) { + my $status = read_bug(bug => $bug); next unless defined $status; for my $suite (@suites) { my $presence = - bug_presence(bug => $bug->id, + bug_presence(bug => $bug, status => $status, dist => $suite->{suite_name}, ); $s->resultset('BugStatusCache')-> - update_bug_status($bug->id, + update_bug_status($bug, $suite->{id}, undef, $presence, @@ -268,21 +310,17 @@ sub update_cache { } } }; - my $last_page = 1; - if ($bugs->is_paged) { - $last_page = - $bugs->pager->last_page; - } + my $it = natatime 500,@bugs; + my $page = 0; + my $last_page = ceil(@bugs / 500); $p->target($last_page) if defined $p; - for my $page (1..$last_page) { - my $bugs_on_page = $bugs; - if ($bugs->is_paged) { - $bugs_on_page = $bugs->page($page); - } + while (my @b_sub = $it->()) { $s->txn_do($update_bug, - $bugs_on_page->all()); + @b_sub); + $page++; $p->update($page) if defined $p; } + $p->remove() if $p; }