2
# Postgres.pm: PostgreSQL database abstraction
3
# Copyright © 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
4
# Copyright © 2005 Ryan Murray <rmurray@debian.org>
5
# Copyright © 2005-2008 Roger Leigh <rleigh@debian.org>
7
# This program is free software: you can redistribute it and/or modify
8
# it under the terms of the GNU General Public License as published by
9
# the Free Software Foundation, either version 2 of the License, or
10
# (at your option) any later version.
12
# This program is distributed in the hope that it will be useful, but
13
# WITHOUT ANY WARRANTY; without even the implied warranty of
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
# General Public License for more details.
17
# You should have received a copy of the GNU General Public License
18
# along with this program. If not, see
19
# <http://www.gnu.org/licenses/>.
21
#######################################################################
23
package Sbuild::DB::Postgres;
28
use Sbuild qw(debug isin);
36
@ISA = qw(Exporter Sbuild::DB::Base);
45
my $self = $class->SUPER::new($conf);
55
my $dbname = $self->get_conf('DB_BASE_NAME');
56
my $db = DBI->connect('DBI:Pg:$dbname=')
57
or die "Couldn't connect to database '$dbname': " . DBI->errstr;
59
$self->set('DIST', $dist);
60
$self->set('DB', $db);
66
my $db = $self->get('DB');
69
$self->set('DB', undef);
71
$self->set('FILE', undef);
85
my $db = $self->get('DB');
93
my $db = $self->get('DB');
97
# SELECT * FROM ... WHERE arch= and dist=
109
# SELECT * FROM ... WHERE arch= and dist=
120
my $db = $self->get('DB');
122
my $name = $pkg->{'Package'};
125
# INSERT INTO or UPDATE ...
138
$name = $pkg->{'Package'} if (ref($pkg) eq 'HASH');
143
my $db = $self->get('DB');
156
my $db = $self->get('DB');
160
# SELECT * FROM builders
169
my $db = $self->get('DB');
173
# SELECT * FROM builders
182
my $db = $self->get('DB');
184
my $name = $user->{'User'};
185
# INSERT INTO builders...
195
$name = $user->{'User'} if (ref($user) eq 'HASH');
197
my $db = $self->get('DB');
201
# DELETE FROM builders...
210
my $db = $self->get('DB');
214
print "Writing ASCII database to $file..." if $self->get_conf('VERBOSE') >= 1;
215
CORE::open( F, ">$file" ) or
216
die "Can't open database $file: $!\n";
218
foreach $name ($self->list_packages()) {
219
my $pkg = $self->get_package($name);
220
foreach $key (keys %{$pkg}) {
221
my $val = $pkg->{$key};
224
print F "$key: $val\n";
229
foreach my $user ($self->list_users()) {
230
my $ui = $self->get_user($user);
231
print F "User: $user\n"
232
if (!defined($ui->{'User'}));
233
foreach $key (keys %{$ui}) {
234
my $val = $ui->{$key};
237
print F "$key: $val\n";
243
print "done\n" if $self->get_conf('VERBOSE') >= 1;
250
my $db = $self->get('DB');
252
print "Reading ASCII database from $file..." if $self->get_conf('VERBOSE') >= 1;
253
CORE::open( F, "<$file" ) or
254
die "Can't open database $file: $!\n";
256
local($/) = ""; # read in paragraph mode
258
my( %thispkg, $name );
260
s/\n[ \t]+/\376\377/g; # fix continuation lines
261
s/\376\377\s*\376\377/\376\377/og;
263
while( /^(\S+):[ \t]*(.*)[ \t]*$/mg ) {
264
my ($key, $val) = ($1, $2);
265
$val =~ s/\376\377/\n/g;
266
$thispkg{$key} = $val;
268
$self->check_entry( \%thispkg );
270
if (exists($thispkg{'Package'})) {
271
$self->set_package(\%thispkg);
272
} elsif(exists($thispkg{'User'})) {
273
$self->set_user(\%thispkg);
277
print "done\n" if $self->get_conf('VERBOSE') >= 1;
285
# TODO: Why should manual editing disable sanity checking?
286
return if $self->get_conf('DB_OPERATION') eq "manual-edit"; # no checks then
288
# check for required fields
289
if (!exists $pkg->{'Package'} && !exists $pkg->{'User'}) {
290
print STDERR "Bad entry: ",
291
join( "\n", map { "$_: $pkg->{$_}" } keys %$pkg ), "\n";
292
die "Database entry lacks Package or User: field\n";
295
if (exists $pkg->{'Package'}) {
296
if (!exists $pkg->{'Version'}) {
297
die "Database entry for package $pkg->{'Package'} lacks Version: field\n";
299
# if no State: field, generate one (for old db compat)
300
if (!exists($pkg->{'State'})) {
302
exists $pkg->{'Failed'} ? 'Failed' : 'Building';
305
die "Bad state $pkg->{'State'} of package $pkg->{Package}\n"
306
if !isin($pkg->{'State'},
307
qw(Needs-Build Building Built Build-Attempted
308
Uploaded Installed Dep-Wait Failed
309
Failed-Removed Not-For-Us) );
311
if (exists $pkg->{'User'}) {
312
if (!exists $pkg->{'Last-Seen'}) {
313
die "Database entry for user $pkg->{'User'} lacks Last-Seen: field\n";
321
my $db = $self->get('DB');