die "This operation is restricted to admin users\n"
if (defined @conf::admin_users and
!isin( $real_user, @conf::admin_users));
+ lock_table();
parse_quinn_diff(1);
last SWITCH;
};
die "This operation is restricted to admin users\n"
if (defined @conf::admin_users and
!isin( $real_user, @conf::admin_users));
+ lock_table();
parse_quinn_diff(0);
last SWITCH;
};
die "This operation is restricted to admin users\n"
if (defined @conf::admin_users and
!isin( $real_user, @conf::admin_users));
+ lock_table();
parse_packages();
last SWITCH;
};
die "This operation is restricted to admin users\n"
if (defined @conf::admin_users and
!isin( $real_user, @conf::admin_users));
+ lock_table();
parse_sources(0);
last SWITCH;
};
die "This operation is restricted to admin users\n"
if (defined @conf::admin_users and
!isin( $real_user, @conf::admin_users));
+ lock_table();
my @ARGS = @ARGV;
@ARGV = ( $ARGS[0] );
my $pkgs = parse_packages();
return;
}
- change_state( \$pkg, 'BD-Uninstallable' );
- $pkg->{'bd_problem'} = "Installability of build dependencies not tested yet";
+ if ($distribution eq "unstable") {
+ change_state( \$pkg, 'BD-Uninstallable' );
+ $pkg->{'bd_problem'} = "Installability of build dependencies not tested yet";
+ }
+ else
+ {
+ change_state( \$pkg, 'Needs-Build' );
+ }
delete $pkg->{'builder'};
delete $pkg->{'depends'};
$pkg->{'binary_nmu_version'} = $binNMUver;
my $name;
my $full = shift;
+ my $db = get_all_source_info();
+
local($/) = ""; # read in paragraph mode
while( <> ) {
my( $version, $arch, $section, $priority, $builddep, $buildconf, $binaries );
$pkgs{$name}{'bin'} = $binaries;
$pkgs{$name}{'dep'} = $builddep;
$pkgs{$name}{'conf'} = $buildconf;
- my $pkg = get_source_info($name);
+ my $pkg = $db->{$name};
if (defined $pkg) {
my $change = 0;
sub parse_packages {
my $installed;
+ my $pkgs = get_all_source_info();
local($/) = ""; # read in paragraph mode
while( <> ) {
my( $name, $version, $depends, $source, $sourcev, $architecture, $provides, $binaryv, $binnmu );
next if defined($merge_srcvers{$name}) and $merge_srcvers{$name} eq $version;
$merge_srcvers{$name} = $version;
- my $pkg = get_source_info($name);
+ my $pkg = $pkgs->{$name};
if (defined $pkg) {
if (isin( $pkg->{'state'}, qw(Not-For-Us)) ||
my %quinn_pkgs;
my $dubious = "";
+ my $pkgs = get_all_source_info();
+
while( <> ) {
my $change = 0;
next if !m,^([-\w\d/]*)/ # section
$priority = "unknown" if $priority eq "-";
$priority = "standard" if ($name eq "debian-installer");
- my $pkg = get_source_info($name);
+ my $pkg = $pkgs->{$name};
# Always update section and priority.
if (defined($pkg)) {
"changed from $prevstate to $pkg->{'state'} ".
"by $real_user as $user";
- my $transactlog = db_transactlog();
- if (!open( LOG, ">>$transactlog" )) {
- warn "Can't open log file $transactlog: $!\n";
- return;
- }
- print LOG "$curr_date: $str\n";
- close( LOG );
+ $dbh->do('INSERT INTO ' . transactions_table_name() .
+ ' (package, distribution, version, action, ' .
+ ' prevstate, state, real_user, set_user, time) ' .
+ ' values (?, ?, ?, ?, ?, ?, ?, ?, ?)',
+ undef, $pkg->{'package'}, $distribution,
+ $pkg->{'version'}, $action, $prevstate, $pkg->{'state'},
+ $real_user, $user, 'now()') or die $dbh->errstr;
if (!($prevstate eq 'Failed' && $pkg->{'state'} eq 'Failed')) {
$str .= " (with --override)"
close( PIPE );
}
-sub db_transactlog {
- return "$conf::basedir/$arch/$conf::transactlog";
-}
-
# for parsing input to dep-wait
sub parse_deplist {
my $deps = shift;
open SOURCES, '>', $tmpfile or die "Could not open temporary file $tmpfile\n";
for my $key (keys %interesting_packages) {
- my $pkg = get_source_info($key);
+ my $pkg = $db->{$key};
print SOURCES "Package: $key\n";
print SOURCES "Version: $pkg->{'version'}\n";
print SOURCES "Build-Depends: $srcs->{$key}{'dep'}\n" if $srcs->{$key}{'dep'};
unlink( $tmpfile );
for my $key (keys %interesting_packages) {
- my $pkg = get_source_info($key);
+ my $pkg = $db->{$key};
my $change =
(defined $interesting_packages{$key} and $pkg->{'state'} eq 'Needs-Build') ||
(not defined $interesting_packages{$key} and $pkg->{'state'} eq 'BD-Uninstallable');
return '"' . $arch . $schema_suffix . '".users';
}
+sub transactions_table_name {
+ return '"' . $arch . $schema_suffix . '".transactions';
+}
+
sub get_readonly_source_info {
my $name = shift;
my $pkg = $dbh->selectrow_hashref('SELECT * FROM ' .
my $name = shift;
my $pkg = $dbh->selectrow_hashref('SELECT * FROM ' .
table_name() . ' WHERE package = ? AND distribution = ?' .
- 'FOR UPDATE',
+ ' FOR UPDATE',
undef, $name, $distribution);
return $pkg;
}
}
if ($options{list_min_age} < 0) {
- $q .= ' AND age(state_change::timestamp) < ? days ';
+ $q .= ' AND age(state_change::timestamp) < ? ';
push @args, -$options{list_min_age} . " days";
}
or die $dbh->errstr;
}
+sub lock_table()
+{
+ $dbh->do('LOCK TABLE ' . table_name() .
+ ' IN EXCLUSIVE MODE', undef) or die $dbh->errstr;
+}
+