summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kanat-Alexander <mkanat@bugzilla.org>2011-02-14 21:00:17 +0100
committerMax Kanat-Alexander <mkanat@bugzilla.org>2011-02-14 21:00:17 +0100
commita4ae80a43078cb33f759863c6f436619290137c3 (patch)
treebb2f7b5feb5abb562711a5e3e1bae88202607681
parenta995ad3f644961f57afc9d7bbdbd1b3849cdc74c (diff)
downloadbugzilla-a4ae80a43078cb33f759863c6f436619290137c3.tar.gz
bugzilla-a4ae80a43078cb33f759863c6f436619290137c3.tar.xz
Bug 603127: Make checksetup.pl require DBD::Pg 2.17.2 when using Pg 9.0 or
later. r=dkl, a=mkanat
-rw-r--r--Bugzilla/Constants.pm2
-rw-r--r--Bugzilla/DB.pm53
-rw-r--r--Bugzilla/DB/Mysql.pm12
-rw-r--r--Bugzilla/DB/Pg.pm13
4 files changed, 60 insertions, 20 deletions
diff --git a/Bugzilla/Constants.pm b/Bugzilla/Constants.pm
index 5b58fd494..11521749e 100644
--- a/Bugzilla/Constants.pm
+++ b/Bugzilla/Constants.pm
@@ -484,6 +484,8 @@ use constant DB_MODULE => {
version => '4.001',
},
name => 'MySQL'},
+ # Also see Bugzilla::DB::Pg::bz_check_server_version, which has special
+ # code to require DBD::Pg 2.17.2 for PostgreSQL 9 and above.
'pg' => {db => 'Bugzilla::DB::Pg', db_version => '8.03.0000',
dbd => {
package => 'DBD-Pg',
diff --git a/Bugzilla/DB.pm b/Bugzilla/DB.pm
index 0a3123ee9..095063f02 100644
--- a/Bugzilla/DB.pm
+++ b/Bugzilla/DB.pm
@@ -162,26 +162,41 @@ sub bz_check_requirements {
my $lc = Bugzilla->localconfig;
my $db = DB_MODULE->{lc($lc->{db_driver})};
+
# Only certain values are allowed for $db_driver.
if (!defined $db) {
die "$lc->{db_driver} is not a valid choice for \$db_driver in"
. bz_locations()->{'localconfig'};
}
- die("It is not safe to run Bugzilla inside the 'mysql' database.\n"
- . "Please pick a different value for \$db_name in localconfig.")
- if $lc->{db_name} eq 'mysql';
-
# Check the existence and version of the DBD that we need.
- my $dbd = $db->{dbd};
- my $sql_server = $db->{name};
- my $sql_want = $db->{db_version};
+ my $dbd = $db->{dbd};
+ _bz_check_dbd($db, $output);
+
+ # We don't try to connect to the actual database if $db_check is
+ # disabled.
+ unless ($lc->{db_check}) {
+ print "\n" if $output;
+ return;
+ }
+
+ # And now check the version of the database server itself.
+ my $dbh = _get_no_db_connection();
+ $dbh->bz_check_server_version($db, $output);
+
+ print "\n" if $output;
+}
+
+sub _bz_check_dbd {
+ my ($db, $output) = @_;
+
+ my $dbd = $db->{dbd};
unless (have_vers($dbd, $output)) {
+ my $sql_server = $db->{name};
my $command = install_command($dbd);
my $root = ROOT_USER;
my $dbd_mod = $dbd->{module};
my $dbd_ver = $dbd->{version};
- my $version = $dbd_ver ? " $dbd_ver or higher" : '';
die <<EOT;
For $sql_server, Bugzilla requires that perl's $dbd_mod $dbd_ver or later be
@@ -191,21 +206,18 @@ installed. To install this module, run the following command (as $root):
EOT
}
+}
- # We don't try to connect to the actual database if $db_check is
- # disabled.
- unless ($lc->{db_check}) {
- print "\n" if $output;
- return;
- }
-
- # And now check the version of the database server itself.
- my $dbh = _get_no_db_connection();
+sub bz_check_server_version {
+ my ($self, $db, $output) = @_;
- my $sql_vers = $dbh->bz_server_version;
- $dbh->disconnect;
+ my $sql_vers = $self->bz_server_version;
+ $self->disconnect;
+ my $sql_want = $db->{db_version};
my $version_ok = vers_cmp($sql_vers, $sql_want) > -1 ? 1 : 0;
+
+ my $sql_server = $db->{name};
if ($output) {
Bugzilla::Install::Requirements::_checking_for({
package => $sql_server, wanted => $sql_want,
@@ -224,7 +236,8 @@ newer version.
EOT
}
- print "\n" if $output;
+ # This is used by subclasses.
+ return $sql_vers;
}
# Note that this function requires that localconfig exist and
diff --git a/Bugzilla/DB/Mysql.pm b/Bugzilla/DB/Mysql.pm
index b9143d7b6..06bf3d8df 100644
--- a/Bugzilla/DB/Mysql.pm
+++ b/Bugzilla/DB/Mysql.pm
@@ -287,6 +287,18 @@ sub _bz_get_initial_schema {
# Database Setup
#####################################################################
+sub bz_check_server_version {
+ my $self = shift;
+
+ my $lc = Bugzilla->localconfig;
+ if (lc(Bugzilla->localconfig->{db_name}) eq 'mysql') {
+ die "It is not safe to run Bugzilla inside a database named 'mysql'.\n"
+ . " Please pick a different value for \$db_name in localconfig.\n";
+ }
+
+ $self->SUPER::bz_check_server_version(@_);
+}
+
sub bz_setup_database {
my ($self) = @_;
diff --git a/Bugzilla/DB/Pg.pm b/Bugzilla/DB/Pg.pm
index 7802d58ef..e59a638a4 100644
--- a/Bugzilla/DB/Pg.pm
+++ b/Bugzilla/DB/Pg.pm
@@ -211,6 +211,19 @@ sub bz_explain {
# Custom Database Setup
#####################################################################
+sub bz_check_server_version {
+ my $self = shift;
+ my ($db) = @_;
+ my $server_version = $self->SUPER::bz_check_server_version(@_);
+ my ($major_version) = $server_version =~ /^(\d+)/;
+ # Pg 9 requires DBD::Pg 2.17.2 in order to properly read bytea values.
+ if ($major_version >= 9) {
+ local $db->{dbd}->{version} = '2.17.2';
+ local $db->{name} = $db->{name} . ' 9+';
+ Bugzilla::DB::_bz_check_dbd(@_);
+ }
+}
+
sub bz_setup_database {
my $self = shift;
$self->SUPER::bz_setup_database(@_);