]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 603127: Make checksetup.pl require DBD::Pg 2.17.2 when using Pg 9.0 or
authorMax Kanat-Alexander <mkanat@bugzilla.org>
Mon, 14 Feb 2011 20:00:17 +0000 (12:00 -0800)
committerMax Kanat-Alexander <mkanat@bugzilla.org>
Mon, 14 Feb 2011 20:00:17 +0000 (12:00 -0800)
later.
r=dkl, a=mkanat

Bugzilla/Constants.pm
Bugzilla/DB.pm
Bugzilla/DB/Mysql.pm
Bugzilla/DB/Pg.pm

index 5b58fd4941bb6c1964188de08c181be616308754..11521749e3468947cff6d3632f05e45cd24b7004 100644 (file)
@@ -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',
index 0a3123ee9d2703c4da527f0de79df54315adcbff..095063f022b0ceb59c3b57d699e1969e90986d01 100644 (file)
@@ -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
index b9143d7b69eacd75c9a35b580c8d7bbaec5ff379..06bf3d8dffcb1608c9296a58fea61f57452b9039 100644 (file)
@@ -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) = @_;
 
index 7802d58ef3b686bb8365ef58983bfd5a8d487aa9..e59a638a4279f064799e4cbedd6c8e6428272781 100644 (file)
@@ -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(@_);