From: Dylan William Hardison Date: Wed, 2 Oct 2019 20:28:37 +0000 (-0400) Subject: Synthesis #1: Adopt utf8mb4 and DBIx::Connector (#79) X-Git-Tag: bugzilla-5.2~66 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=6eafd6a807ede6f2ca9e397d1d95fe44404a74c0;p=thirdparty%2Fbugzilla.git Synthesis #1: Adopt utf8mb4 and DBIx::Connector (#79) * use base to make merging with bmo easier * Revert "Bug 1497042 - Enclose table names in CREATE queries" This reverts commit 62d5637a4c96abbcde6f308421d676a0336d8e25. * refactor Bugzilla::DB to not subclass DBI * use DBIx::Connector to manage database connections * Ensure we always call DBIx::Connector->dbh before any DBI method The code didn't allow a way of doing this without a lot of work. So I had to take the following approach: The 'dbh' attribute is now a method that delegates to DBIx::Connector's dbh method. Per the docs, ->dbh() "Returns the connection's database handle. It will use a an existing handle if there is one, if the process has not been forked or a new thread spawned, and if the database is pingable. Otherwise, it will instantiate, cache, and return a new handle." Then there is the matter of the 'handles' on dbh. I've used Package::Stash to insert proxy methods into the class when it is loaded. * Bug 1328659 - Add support for utf8=utf8mb4 (switches to dynamic/compressed row format, and changes charset to utf8mb4) * add deps * add prepare_cached to the list of delegated methods. This was added in bug 340160 * improve the migration to compressed/dynamic rows, skip views * add missing semicolon * remove pre-utf8mb4 emoji support * fix small issue * add debugging fatal error --- diff --git a/Bugzilla.pm b/Bugzilla.pm index deffa259eb..6e95ff727e 100644 --- a/Bugzilla.pm +++ b/Bugzilla.pm @@ -701,7 +701,6 @@ sub _cleanup { foreach my $dbh ($main, $shadow) { next if !$dbh; $dbh->bz_rollback_transaction() if $dbh->bz_in_transaction; - $dbh->disconnect; } my $smtp = $cache->{smtp}; $smtp->disconnect if $smtp; diff --git a/Bugzilla/Attachment.pm b/Bugzilla/Attachment.pm index 26f768c2ff..3a98b12437 100644 --- a/Bugzilla/Attachment.pm +++ b/Bugzilla/Attachment.pm @@ -48,7 +48,7 @@ use File::Copy; use List::Util qw(max); use Storable qw(dclone); -use parent qw(Bugzilla::Object); +use base qw(Bugzilla::Object); ############################### #### Initialization #### diff --git a/Bugzilla/Auth/Login/CGI.pm b/Bugzilla/Auth/Login/CGI.pm index 0824f1ebd1..17b076d162 100644 --- a/Bugzilla/Auth/Login/CGI.pm +++ b/Bugzilla/Auth/Login/CGI.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Auth::Login); +use base qw(Bugzilla::Auth::Login); use constant user_can_create_account => 1; use Bugzilla::Constants; diff --git a/Bugzilla/Auth/Login/Env.pm b/Bugzilla/Auth/Login/Env.pm index 5fc33921bf..4995fa0025 100644 --- a/Bugzilla/Auth/Login/Env.pm +++ b/Bugzilla/Auth/Login/Env.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Auth::Login); +use base qw(Bugzilla::Auth::Login); use Bugzilla::Constants; use Bugzilla::Error; diff --git a/Bugzilla/Auth/Verify/DB.pm b/Bugzilla/Auth/Verify/DB.pm index 6ed9ba15c7..cb89a35618 100644 --- a/Bugzilla/Auth/Verify/DB.pm +++ b/Bugzilla/Auth/Verify/DB.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Auth::Verify); +use base qw(Bugzilla::Auth::Verify); use Bugzilla::Constants; use Bugzilla::Token; diff --git a/Bugzilla/Auth/Verify/RADIUS.pm b/Bugzilla/Auth/Verify/RADIUS.pm index 2cbde04047..a2a54b9445 100644 --- a/Bugzilla/Auth/Verify/RADIUS.pm +++ b/Bugzilla/Auth/Verify/RADIUS.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Auth::Verify); +use base qw(Bugzilla::Auth::Verify); use Bugzilla::Constants; use Bugzilla::Error; diff --git a/Bugzilla/Bug.pm b/Bugzilla/Bug.pm index bce3661f1f..ac549d4044 100644 --- a/Bugzilla/Bug.pm +++ b/Bugzilla/Bug.pm @@ -36,7 +36,7 @@ use List::Util qw(min max first); use Storable qw(dclone); use Scalar::Util qw(blessed); -use parent qw(Bugzilla::Object Exporter); +use base qw(Bugzilla::Object Exporter); @Bugzilla::Bug::EXPORT = qw( bug_alias_to_id LogActivityEntry @@ -3755,17 +3755,6 @@ sub comments { foreach my $comment (@{$self->{'comments'}}) { $comment->{count} = $count++; $comment->{bug} = $self; - - # XXX - hack for MySQL. Convert [U+....] back into its Unicode - # equivalent for characters above U+FFFF as MySQL older than 5.5.3 - # cannot store them, see Bugzilla::Comment::_check_thetext(). - if ($is_mysql) { - - # Perl 5.13.8 and older complain about non-characters. - no warnings 'utf8'; - $comment->{thetext} - =~ s/\x{FDD0}\[U\+((?:[1-9A-F]|10)[0-9A-F]{4})\]\x{FDD1}/chr(hex $1)/eg; - } } # Some bugs may have no comments when upgrading old installations. diff --git a/Bugzilla/BugUrl.pm b/Bugzilla/BugUrl.pm index c3e11e4c7e..24a31b8e3f 100644 --- a/Bugzilla/BugUrl.pm +++ b/Bugzilla/BugUrl.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Object); +use base qw(Bugzilla::Object); use Bugzilla::Util; use Bugzilla::Error; diff --git a/Bugzilla/BugUrl/Bugzilla.pm b/Bugzilla/BugUrl/Bugzilla.pm index 9d036100fa..1cedb1f561 100644 --- a/Bugzilla/BugUrl/Bugzilla.pm +++ b/Bugzilla/BugUrl/Bugzilla.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::BugUrl); +use base qw(Bugzilla::BugUrl); use Bugzilla::Error; use Bugzilla::Util; diff --git a/Bugzilla/BugUrl/Bugzilla/Local.pm b/Bugzilla/BugUrl/Bugzilla/Local.pm index 3fe0fcb5db..e74985eaf7 100644 --- a/Bugzilla/BugUrl/Bugzilla/Local.pm +++ b/Bugzilla/BugUrl/Bugzilla/Local.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::BugUrl::Bugzilla); +use base qw(Bugzilla::BugUrl::Bugzilla); use Bugzilla::Error; use Bugzilla::Util; diff --git a/Bugzilla/BugUrl/Debian.pm b/Bugzilla/BugUrl/Debian.pm index f49f2b8202..488d853115 100644 --- a/Bugzilla/BugUrl/Debian.pm +++ b/Bugzilla/BugUrl/Debian.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::BugUrl); +use base qw(Bugzilla::BugUrl); ############################### #### Methods #### diff --git a/Bugzilla/BugUrl/GitHub.pm b/Bugzilla/BugUrl/GitHub.pm index 583837a609..a815648127 100644 --- a/Bugzilla/BugUrl/GitHub.pm +++ b/Bugzilla/BugUrl/GitHub.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::BugUrl); +use base qw(Bugzilla::BugUrl); ############################### #### Methods #### diff --git a/Bugzilla/BugUrl/Google.pm b/Bugzilla/BugUrl/Google.pm index 1064253029..54c405730e 100644 --- a/Bugzilla/BugUrl/Google.pm +++ b/Bugzilla/BugUrl/Google.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::BugUrl); +use base qw(Bugzilla::BugUrl); ############################### #### Methods #### diff --git a/Bugzilla/BugUrl/JIRA.pm b/Bugzilla/BugUrl/JIRA.pm index b42b1deccf..6c49d71184 100644 --- a/Bugzilla/BugUrl/JIRA.pm +++ b/Bugzilla/BugUrl/JIRA.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::BugUrl); +use base qw(Bugzilla::BugUrl); ############################### #### Methods #### diff --git a/Bugzilla/BugUrl/Launchpad.pm b/Bugzilla/BugUrl/Launchpad.pm index 5be8088d19..a4ac143824 100644 --- a/Bugzilla/BugUrl/Launchpad.pm +++ b/Bugzilla/BugUrl/Launchpad.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::BugUrl); +use base qw(Bugzilla::BugUrl); ############################### #### Methods #### diff --git a/Bugzilla/BugUrl/MantisBT.pm b/Bugzilla/BugUrl/MantisBT.pm index 742ae1a47f..58d3ad5fd0 100644 --- a/Bugzilla/BugUrl/MantisBT.pm +++ b/Bugzilla/BugUrl/MantisBT.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::BugUrl); +use base qw(Bugzilla::BugUrl); ############################### #### Methods #### diff --git a/Bugzilla/BugUrl/SourceForge.pm b/Bugzilla/BugUrl/SourceForge.pm index ffdde42f45..0c2e6f4124 100644 --- a/Bugzilla/BugUrl/SourceForge.pm +++ b/Bugzilla/BugUrl/SourceForge.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::BugUrl); +use base qw(Bugzilla::BugUrl); ############################### #### Methods #### diff --git a/Bugzilla/BugUrl/Trac.pm b/Bugzilla/BugUrl/Trac.pm index 22418a1df5..c6678b3a9d 100644 --- a/Bugzilla/BugUrl/Trac.pm +++ b/Bugzilla/BugUrl/Trac.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::BugUrl); +use base qw(Bugzilla::BugUrl); ############################### #### Methods #### diff --git a/Bugzilla/BugUserLastVisit.pm b/Bugzilla/BugUserLastVisit.pm index d1c351959d..12b9df2c7c 100644 --- a/Bugzilla/BugUserLastVisit.pm +++ b/Bugzilla/BugUserLastVisit.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Object); +use base qw(Bugzilla::Object); ##################################################################### # Overriden Constants that are used as methods diff --git a/Bugzilla/CGI.pm b/Bugzilla/CGI.pm index 019fb8d10e..5fc16db350 100644 --- a/Bugzilla/CGI.pm +++ b/Bugzilla/CGI.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(CGI); +use base qw(CGI); use Bugzilla::Constants; use Bugzilla::Error; diff --git a/Bugzilla/Classification.pm b/Bugzilla/Classification.pm index 1ea86f592c..d374a2454e 100644 --- a/Bugzilla/Classification.pm +++ b/Bugzilla/Classification.pm @@ -17,7 +17,7 @@ use Bugzilla::Util; use Bugzilla::Error; use Bugzilla::Product; -use parent qw(Bugzilla::Field::ChoiceInterface Bugzilla::Object Exporter); +use base qw(Bugzilla::Field::ChoiceInterface Bugzilla::Object Exporter); @Bugzilla::Classification::EXPORT = qw(sort_products_by_classification); ############################### diff --git a/Bugzilla/Comment.pm b/Bugzilla/Comment.pm index 575703b4b2..ab50add430 100644 --- a/Bugzilla/Comment.pm +++ b/Bugzilla/Comment.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Object); +use base qw(Bugzilla::Object); use Bugzilla::Attachment; use Bugzilla::Comment::TagWeights; @@ -440,20 +440,6 @@ sub _check_thetext { $thetext =~ s/\s*$//s; $thetext =~ s/\r\n?/\n/g; # Get rid of \r. - # Characters above U+FFFF cannot be stored by MySQL older than 5.5.3 as they - # require the new utf8mb4 character set. Other DB servers are handling them - # without any problem. So we need to replace these characters if we use MySQL, - # else the comment is truncated. - # XXX - Once we use utf8mb4 for comments, this hack for MySQL can go away. - state $is_mysql = Bugzilla->dbh->isa('Bugzilla::DB::Mysql') ? 1 : 0; - if ($is_mysql) { - - # Perl 5.13.8 and older complain about non-characters. - no warnings 'utf8'; - $thetext - =~ s/([\x{10000}-\x{10FFFF}])/"\x{FDD0}[" . uc(sprintf('U+%04x', ord($1))) . "]\x{FDD1}"/eg; - } - ThrowUserError('comment_too_long') if length($thetext) > MAX_COMMENT_LENGTH; return $thetext; } diff --git a/Bugzilla/Comment/TagWeights.pm b/Bugzilla/Comment/TagWeights.pm index 5355cad7fb..e733ed8fb7 100644 --- a/Bugzilla/Comment/TagWeights.pm +++ b/Bugzilla/Comment/TagWeights.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Object); +use base qw(Bugzilla::Object); use Bugzilla::Constants; diff --git a/Bugzilla/Component.pm b/Bugzilla/Component.pm index ef8180eb0e..707745627a 100644 --- a/Bugzilla/Component.pm +++ b/Bugzilla/Component.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Field::ChoiceInterface Bugzilla::Object); +use base qw(Bugzilla::Field::ChoiceInterface Bugzilla::Object); use Bugzilla::Constants; use Bugzilla::Util; diff --git a/Bugzilla/Config.pm b/Bugzilla/Config.pm index 1aa944985b..635e49dfec 100644 --- a/Bugzilla/Config.pm +++ b/Bugzilla/Config.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Exporter); +use base qw(Exporter); use autodie qw(:default); use Bugzilla::Constants; @@ -341,6 +341,8 @@ sub read_param_file { die "The $file file does not exist." . ' You probably need to run checksetup.pl.',; } + die "the param utf8 must be set to utf8mb4" unless $params{utf8} eq 'utf8mb4'; + return \%params; } diff --git a/Bugzilla/Config/Common.pm b/Bugzilla/Config/Common.pm index a0077b5b24..4b0c9db642 100644 --- a/Bugzilla/Config/Common.pm +++ b/Bugzilla/Config/Common.pm @@ -20,7 +20,7 @@ use Bugzilla::Field; use Bugzilla::Group; use Bugzilla::Status; -use parent qw(Exporter); +use base qw(Exporter); @Bugzilla::Config::Common::EXPORT = qw(check_multi check_numeric check_regexp check_url check_group check_sslbase check_priority check_severity check_platform @@ -123,15 +123,16 @@ sub check_ip { } sub check_utf8 { - my $utf8 = shift; + my ($utf8, $entry) = @_; - # You cannot turn off the UTF-8 parameter if you've already converted - # your tables to utf-8. - my $dbh = Bugzilla->dbh; - if ($dbh->isa('Bugzilla::DB::Mysql') && $dbh->bz_db_is_utf8 && !$utf8) { - return "You cannot disable UTF-8 support, because your MySQL database" - . " is encoded in UTF-8"; + # You cannot turn off the UTF-8 parameter. + if (!$utf8) { + return "You cannot disable UTF-8 support."; } + elsif ($entry eq 'utf8mb4' && $utf8 ne 'utf8mb4') { + return "You cannot disable UTF8-MB4 support."; + } + return ""; } diff --git a/Bugzilla/Config/General.pm b/Bugzilla/Config/General.pm index 322275aa0a..37c648d3b7 100644 --- a/Bugzilla/Config/General.pm +++ b/Bugzilla/Config/General.pm @@ -24,7 +24,13 @@ use constant get_param_list => ( checker => \&check_email }, - {name => 'utf8', type => 'b', default => '0', checker => \&check_utf8}, + { + name => 'utf8', + type => 's', + choices => ['1', 'utf8', 'utf8mb4'], + default => 'utf8', + checker => \&check_utf8 + }, {name => 'shutdownhtml', type => 'l', default => ''}, diff --git a/Bugzilla/Constants.pm b/Bugzilla/Constants.pm index a9a5e0eaac..a93658b856 100644 --- a/Bugzilla/Constants.pm +++ b/Bugzilla/Constants.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Exporter); +use base qw(Exporter); # For bz_locations use File::Basename; diff --git a/Bugzilla/DB.pm b/Bugzilla/DB.pm index c528e77d14..092f870ca4 100644 --- a/Bugzilla/DB.pm +++ b/Bugzilla/DB.pm @@ -8,13 +8,13 @@ package Bugzilla::DB; use 5.10.1; -use strict; -use warnings; +use Moo; use DBI; +use DBIx::Connector; +our %Connector; -# Inherit the DB class from DBI::db. -use parent -norequire, qw(DBI::db); +has 'connector' => (is => 'lazy', handles => [qw( dbh )],); use Bugzilla::Constants; use Bugzilla::Mailer; @@ -29,6 +29,32 @@ use Bugzilla::Version; use List::Util qw(max); use Storable qw(dclone); +has [qw(dsn user pass attrs)] => (is => 'ro', required => 1,); + + +# Install proxy methods to the DBI object. +# We can't use handles() as DBIx::Connector->dbh has to be called each +# time we need a DBI handle to ensure the connection is alive. +{ + my @DBI_METHODS = qw( + begin_work column_info commit disconnect do errstr get_info last_insert_id + ping prepare prepare_cached primary_key quote_identifier rollback + selectall_arrayref selectall_hashref selectcol_arrayref selectrow_array + selectrow_arrayref selectrow_hashref table_info + ); + my $stash = Package::Stash->new(__PACKAGE__); + + foreach my $method (@DBI_METHODS) { + my $symbol = '&' . $method; + $stash->add_symbol( + $symbol => sub { + my $self = shift; + return $self->dbh->$method(@_); + } + ); + } +} + ##################################################################### # Constants ##################################################################### @@ -88,7 +114,7 @@ use constant INDEX_DROPS_REQUIRE_FK_DROPS => 1; sub quote { my $self = shift; - my $retval = $self->SUPER::quote(@_); + my $retval = $self->dbh->quote(@_); trick_taint($retval) if defined $retval; return $retval; } @@ -130,9 +156,7 @@ sub _connect { "'$driver' is not a valid choice for \$db_driver in " . " localconfig: " . $@); # instantiate the correct DB specific module - my $dbh = $pkg_module->new($params); - - return $dbh; + return $pkg_module->new($params); } sub _handle_error { @@ -200,7 +224,6 @@ sub bz_check_server_version { my ($self, $db, $output) = @_; 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; @@ -261,7 +284,6 @@ sub bz_create_database { } } - $dbh->disconnect; } # A helper for bz_create_database and bz_check_requirements. @@ -270,6 +292,7 @@ sub _get_no_db_connection { my $dbh; my %connect_params = %{Bugzilla->localconfig}; $connect_params{db_name} = ''; + local %Connector = (); my $conn_success = eval { $dbh = _connect(\%connect_params); }; if (!$conn_success) { my $driver = $connect_params{db_driver}; @@ -1299,14 +1322,15 @@ sub bz_rollback_transaction { # Subclass Helpers ##################################################################### -sub db_new { - my ($class, $params) = @_; - my ($dsn, $user, $pass, $override_attrs) = @$params{qw(dsn user pass attrs)}; +sub _build_connector { + my ($self) = @_; + my ($dsn, $user, $pass, $override_attrs) + = map { $self->$_ } qw(dsn user pass attrs); # set up default attributes used to connect to the database # (may be overridden by DB driver implementations) my $attributes = { - RaiseError => 0, + RaiseError => 1, AutoCommit => 1, PrintError => 0, ShowErrorStatement => 1, @@ -1323,20 +1347,14 @@ sub db_new { $attributes->{$key} = $override_attrs->{$key}; } } + my $class = ref $self; + if ($class->can('on_dbi_connected')) { + $attributes->{Callbacks} + = {connected => sub { $class->on_dbi_connected(@_); return },}; + } - # connect using our known info to the specified db - my $self = DBI->connect($dsn, $user, $pass, $attributes) - or die "\nCan't connect to the database.\nError: $DBI::errstr\n" - . " Is your database installed and up and running?\n Do you have" - . " the correct username and password selected in localconfig?\n\n"; - - # RaiseError was only set to 0 so that we could catch the - # above "die" condition. - $self->{RaiseError} = 1; - - bless($self, $class); - - return $self; + return $Connector{"$user.$dsn"} + //= DBIx::Connector->new($dsn, $user, $pass, $attributes); } ##################################################################### diff --git a/Bugzilla/DB/Mysql.pm b/Bugzilla/DB/Mysql.pm index a58d88df4b..0e0a017fec 100644 --- a/Bugzilla/DB/Mysql.pm +++ b/Bugzilla/DB/Mysql.pm @@ -22,10 +22,9 @@ For interface details see L and L. package Bugzilla::DB::Mysql; use 5.10.1; -use strict; -use warnings; +use Moo; -use parent qw(Bugzilla::DB); +extends qw(Bugzilla::DB); use Bugzilla::Constants; use Bugzilla::Install::Util qw(install_string); @@ -33,8 +32,9 @@ use Bugzilla::Util; use Bugzilla::Error; use Bugzilla::DB::Schema::Mysql; -use List::Util qw(max); +use List::Util qw(max any); use Text::ParseWords; +use Carp; # This is how many comments of MAX_COMMENT_LENGTH we expect on a single bug. # In reality, you could have a LOT more comments than this, because @@ -43,7 +43,7 @@ use constant MAX_COMMENTS => 50; use constant FULLTEXT_OR => '|'; -sub new { +sub BUILDARGS { my ($class, $params) = @_; my ($user, $pass, $host, $dbname, $port, $sock) = @$params{qw(db_user db_pass db_host db_name db_port db_sock)}; @@ -53,12 +53,7 @@ sub new { $dsn .= ";port=$port" if $port; $dsn .= ";mysql_socket=$sock" if $sock; - my %attrs = ( - mysql_enable_utf8 => Bugzilla->params->{'utf8'}, - - # Needs to be explicitly specified for command-line processes. - mysql_auto_reconnect => 1, - ); + my %attrs = (mysql_enable_utf8 => 1); # MySQL SSL options my ($ssl_ca_file, $ssl_ca_path, $ssl_cert, $ssl_key) = @$params{ @@ -73,25 +68,21 @@ sub new { $attrs{'mysql_ssl_client_key'} = $ssl_key if $ssl_key; } - my $self = $class->db_new( - {dsn => $dsn, user => $user, pass => $pass, attrs => \%attrs}); + return {dsn => $dsn, user => $user, pass => $pass, attrs => \%attrs}; +} + +sub on_dbi_connected { + my ($class, $dbh) = @_; # This makes sure that if the tables are encoded as UTF-8, we # return their data correctly. - $self->do("SET NAMES utf8") if Bugzilla->params->{'utf8'}; - - # all class local variables stored in DBI derived class needs to have - # a prefix 'private_'. See DBI documentation. - $self->{private_bz_tables_locked} = ""; - - # Needed by TheSchwartz - $self->{private_bz_dsn} = $dsn; - - bless($self, $class); + my $charset = $class->utf8_charset; + my $collate = $class->utf8_collate; + $dbh->do("SET NAMES $charset COLLATE $collate"); # Check for MySQL modes. my ($var, $sql_mode) - = $self->selectrow_array("SHOW VARIABLES LIKE 'sql\\_mode'"); + = $dbh->selectrow_array("SHOW VARIABLES LIKE 'sql\\_mode'"); # Disable ANSI and strict modes, else Bugzilla will crash. if ($sql_mode) { @@ -104,19 +95,17 @@ sub new { split(/,/, $sql_mode)); if ($sql_mode ne $new_sql_mode) { - $self->do("SET SESSION sql_mode = ?", undef, $new_sql_mode); + $dbh->do("SET SESSION sql_mode = ?", undef, $new_sql_mode); } } # Allow large GROUP_CONCATs (largely for inserting comments # into bugs_fulltext). - $self->do('SET SESSION group_concat_max_len = 128000000'); + $dbh->do('SET SESSION group_concat_max_len = 128000000'); # MySQL 5.5.2 and older have this variable set to true, which causes # trouble, see bug 870369. - $self->do('SET SESSION sql_auto_is_null = 0'); - - return $self; + $dbh->do('SET SESSION sql_auto_is_null = 0'); } # when last_insert_id() is supported on MySQL by lowest DBI/DBD version @@ -346,6 +335,34 @@ sub bz_setup_database { die install_string('mysql_innodb_disabled'); } + if ($self->utf8_charset eq 'utf8mb4') { + my %global = map {@$_} + @{$self->selectall_arrayref(q(SHOW GLOBAL VARIABLES LIKE 'innodb_%'))}; + my $utf8mb4_supported + = $global{innodb_file_format} eq 'Barracuda' + && $global{innodb_file_per_table} eq 'ON' + && $global{innodb_large_prefix} eq 'ON'; + + die install_string('mysql_innodb_settings') unless $utf8mb4_supported; + + my $tables = $self->selectall_arrayref('SHOW TABLE STATUS'); + foreach my $table_status (@$tables) { + my ($table, undef, undef, $row_format) = @$table_status; + my $table_type = $table_status->[-1]; + my $new_row_format = $self->default_row_format($table); + next if lc($table_type) eq 'view'; + next if lc($new_row_format) eq 'compact'; + next if lc($row_format) eq 'dynamic'; + next if lc($row_format) eq 'compressed'; + if (lc($new_row_format) ne lc($row_format)) { + print install_string( + 'mysql_row_format_conversion', {table => $table, format => $new_row_format} + ), + "\n"; + $self->do(sprintf 'ALTER TABLE %s ROW_FORMAT=%s', $table, $new_row_format); + } + } + } my ($sd_index_deleted, $longdescs_index_deleted); my @tables = $self->bz_table_list_real(); @@ -379,9 +396,6 @@ sub bz_setup_database { 'SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = ? AND ENGINE = ?', undef, $db_name, 'MyISAM' ); - foreach my $should_be_myisam (Bugzilla::DB::Schema::Mysql::MYISAM_TABLES) { - @$myisam_tables = grep { $_ ne $should_be_myisam } @$myisam_tables; - } if (scalar @$myisam_tables) { print "Bugzilla now uses the InnoDB storage engine in MySQL for", @@ -564,10 +578,7 @@ sub bz_setup_database { # This kind of situation happens when people create the database # themselves, and if we don't do this they will get the big # scary WARNING statement about conversion to UTF8. - if ( !$self->bz_db_is_utf8 - && !@tables - && (Bugzilla->params->{'utf8'} || !scalar keys %{Bugzilla->params})) - { + unless ($self->bz_db_is_utf8) { $self->_alter_db_charset_to_utf8(); } @@ -678,11 +689,13 @@ sub bz_setup_database { # the table charsets. # # TABLE_COLLATION IS NOT NULL prevents us from trying to convert views. + my $charset = $self->utf8_charset; + my $collate = $self->utf8_collate; my $non_utf8_tables = $self->selectrow_array( "SELECT 1 FROM information_schema.TABLES WHERE TABLE_SCHEMA = ? AND TABLE_COLLATION IS NOT NULL - AND TABLE_COLLATION NOT LIKE 'utf8%' - LIMIT 1", undef, $db_name + AND TABLE_COLLATION != ? + LIMIT 1", undef, $db_name, $collate ); if (Bugzilla->params->{'utf8'} && $non_utf8_tables) { @@ -698,7 +711,8 @@ sub bz_setup_database { } } - print "Converting table storage format to UTF-8. This may take a", " while.\n"; + print + "Converting table storage format to $charset (collate $collate). This may take a while.\n"; foreach my $table ($self->bz_table_list_real) { my $info_sth = $self->prepare("SHOW FULL COLUMNS FROM $table"); $info_sth->execute(); @@ -712,11 +726,11 @@ sub bz_setup_database { # If this particular column isn't stored in utf-8 if ( $column->{Collation} && $column->{Collation} ne 'NULL' - && $column->{Collation} !~ /utf8/) + && $column->{Collation} ne $collate) { my $name = $column->{Field}; - print "$table.$name needs to be converted to UTF-8...\n"; + print "$table.$name needs to be converted to $charset (collate $collate)...\n"; # These will be automatically re-created at the end # of checksetup. @@ -737,7 +751,7 @@ sub bz_setup_database { my ($binary, $utf8) = ($sql_def, $sql_def); my $type = $self->_bz_schema->convert_type($col_info->{TYPE}); $binary =~ s/(\Q$type\E)/$1 CHARACTER SET binary/; - $utf8 =~ s/(\Q$type\E)/$1 CHARACTER SET utf8/; + $utf8 =~ s/(\Q$type\E)/$1 CHARACTER SET $charset COLLATE $collate/; push(@binary_sql, "MODIFY COLUMN $name $binary"); push(@utf8_sql, "MODIFY COLUMN $name $utf8"); } @@ -757,8 +771,8 @@ sub bz_setup_database { print "Converting the $table table to UTF-8...\n"; my $bin = "ALTER TABLE $table " . join(', ', @binary_sql); - my $utf - = "ALTER TABLE $table " . join(', ', @utf8_sql, 'DEFAULT CHARACTER SET utf8'); + my $utf = "ALTER TABLE $table " + . join(', ', @utf8_sql, "DEFAULT CHARACTER SET $charset COLLATE $collate"); $self->do($bin); $self->do($utf); @@ -768,7 +782,7 @@ sub bz_setup_database { } } else { - $self->do("ALTER TABLE $table DEFAULT CHARACTER SET utf8"); + $self->do("ALTER TABLE $table DEFAULT CHARACTER SET $charset COLLATE $collate"); } } # foreach my $table (@tables) @@ -779,7 +793,7 @@ sub bz_setup_database { # a mysqldump.) So we have this change outside of the above block, # so that it just happens silently if no actual *table* conversion # needs to happen. - if (Bugzilla->params->{'utf8'} && !$self->bz_db_is_utf8) { + unless ($self->bz_db_is_utf8) { $self->_alter_db_charset_to_utf8(); } @@ -861,19 +875,70 @@ sub _fix_defaults { } } +sub utf8_charset { + return 'utf8' unless Bugzilla->params->{'utf8'}; + return Bugzilla->params->{'utf8'} eq 'utf8mb4' ? 'utf8mb4' : 'utf8'; +} + +sub utf8_collate { + my $charset = utf8_charset(); + if ($charset eq 'utf8') { + return 'utf8_general_ci'; + } + elsif ($charset eq 'utf8mb4') { + return 'utf8mb4_unicode_520_ci'; + } + else { + croak "invalid charset: $charset"; + } +} + +sub default_row_format { + my ($class, $table) = @_; + my $charset = utf8_charset(); + if ($charset eq 'utf8') { + return 'Compact'; + } + elsif ($charset eq 'utf8mb4') { + my @no_compress = qw( + bug_user_last_visit + cc + email_rates + logincookies + token_data + tokens + ts_error + ts_exitstatus + ts_funcmap + ts_job + ts_note + user_request_log + votes + ); + return 'Dynamic' if any { $table eq $_ } @no_compress; + return 'Compressed'; + } + else { + croak "invalid charset: $charset"; + } +} + sub _alter_db_charset_to_utf8 { my $self = shift; my $db_name = Bugzilla->localconfig->{db_name}; - $self->do("ALTER DATABASE $db_name CHARACTER SET utf8"); + my $charset = $self->utf8_charset; + my $collate = $self->utf8_collate; + $self->do("ALTER DATABASE $db_name CHARACTER SET $charset COLLATE $collate"); } sub bz_db_is_utf8 { my $self = shift; - my $db_collation + my $db_charset = $self->selectrow_arrayref("SHOW VARIABLES LIKE 'character_set_database'"); # First column holds the variable name, second column holds the value. - return $db_collation->[1] =~ /utf8/ ? 1 : 0; + my $charset = $self->utf8_charset; + return $db_charset->[1] eq $charset ? 1 : 0; } diff --git a/Bugzilla/DB/Oracle.pm b/Bugzilla/DB/Oracle.pm index 930270ccc7..73ffb4b455 100644 --- a/Bugzilla/DB/Oracle.pm +++ b/Bugzilla/DB/Oracle.pm @@ -22,10 +22,9 @@ For interface details see L and L. package Bugzilla::DB::Oracle; use 5.10.1; -use strict; -use warnings; +use Moo; -use parent qw(Bugzilla::DB); +extends qw(Bugzilla::DB); use DBD::Oracle; use DBD::Oracle qw(:ora_types); @@ -46,7 +45,7 @@ use constant BLOB_TYPE => {ora_type => ORA_BLOB}; use constant MIN_LONG_READ_LEN => 32 * 1024; use constant FULLTEXT_OR => ' OR '; -sub new { +sub BUILDARGS { my ($class, $params) = @_; my ($user, $pass, $host, $dbname, $port) = @$params{qw(db_user db_pass db_host db_name db_port)}; @@ -66,24 +65,21 @@ sub new { LongReadLen => max(Bugzilla->params->{'maxattachmentsize'} || 0, MIN_LONG_READ_LEN) * 1024, }; - my $self = $class->db_new( - {dsn => $dsn, user => $user, pass => $pass, attrs => $attrs}); - - # Needed by TheSchwartz - $self->{private_bz_dsn} = $dsn; + return {dsn => $dsn, user => $user, pass => $pass, attrs => $attrs}; +} - bless($self, $class); +sub on_dbi_connected { + my ($class, $dbh) = @_; # Set the session's default date format to match MySQL - $self->do("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'"); - $self->do("ALTER SESSION SET NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS'"); - $self->do("ALTER SESSION SET NLS_LENGTH_SEMANTICS='CHAR'") + $dbh->do("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'"); + $dbh->do("ALTER SESSION SET NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS'"); + $dbh->do("ALTER SESSION SET NLS_LENGTH_SEMANTICS='CHAR'") if Bugzilla->params->{'utf8'}; # To allow case insensitive query. - $self->do("ALTER SESSION SET NLS_COMP='ANSI'"); - $self->do("ALTER SESSION SET NLS_SORT='BINARY_AI'"); - return $self; + $dbh->do("ALTER SESSION SET NLS_COMP='ANSI'"); + $dbh->do("ALTER SESSION SET NLS_SORT='BINARY_AI'"); } sub bz_last_key { @@ -752,7 +748,7 @@ use 5.10.1; use strict; use warnings; -use parent -norequire, qw(DBI::st); +use base -norequire, qw(DBI::st); sub fetchrow_arrayref { my $self = shift; diff --git a/Bugzilla/DB/Pg.pm b/Bugzilla/DB/Pg.pm index 15a268381c..ec4bf3f465 100644 --- a/Bugzilla/DB/Pg.pm +++ b/Bugzilla/DB/Pg.pm @@ -22,19 +22,18 @@ For interface details see L and L. package Bugzilla::DB::Pg; use 5.10.1; -use strict; -use warnings; +use Moo; use Bugzilla::Error; use Bugzilla::Version; use DBD::Pg; # This module extends the DB interface via inheritance -use parent qw(Bugzilla::DB); +extends qw(Bugzilla::DB); use constant BLOB_TYPE => {pg_type => DBD::Pg::PG_BYTEA}; -sub new { +sub BUILDARGS { my ($class, $params) = @_; my ($user, $pass, $host, $dbname, $port) = @$params{qw(db_user db_pass db_host db_name db_port)}; @@ -55,19 +54,7 @@ sub new { my $attrs = {pg_enable_utf8 => Bugzilla->params->{'utf8'}}; - my $self = $class->db_new( - {dsn => $dsn, user => $user, pass => $pass, attrs => $attrs}); - - # all class local variables stored in DBI derived class needs to have - # a prefix 'private_'. See DBI documentation. - $self->{private_bz_tables_locked} = ""; - - # Needed by TheSchwartz - $self->{private_bz_dsn} = $dsn; - - bless($self, $class); - - return $self; + return {dsn => $dsn, user => $user, pass => $pass, attrs => $attrs}; } # if last_insert_id is supported on PostgreSQL by lowest DBI/DBD version diff --git a/Bugzilla/DB/Schema/Mysql.pm b/Bugzilla/DB/Schema/Mysql.pm index 4c0d43523d..3ca54549d3 100644 --- a/Bugzilla/DB/Schema/Mysql.pm +++ b/Bugzilla/DB/Schema/Mysql.pm @@ -19,7 +19,7 @@ use warnings; use Bugzilla::Error; -use parent qw(Bugzilla::DB::Schema); +use base qw(Bugzilla::DB::Schema); # This is for column_info_to_column, to know when a tinyint is a # boolean and when it's really a tinyint. This only has to be accurate @@ -85,8 +85,6 @@ use constant REVERSE_MAPPING => { # as in their db-specific version, so no reverse mapping is needed. }; -use constant MYISAM_TABLES => qw(); - #------------------------------------------------------------------------------ sub _initialize { @@ -128,20 +126,16 @@ sub _initialize { #------------------------------------------------------------------------------ sub _get_create_table_ddl { - # Extend superclass method to specify the MYISAM storage engine. # Returns a "create table" SQL statement. - my ($self, $table) = @_; - - my $charset = Bugzilla->dbh->bz_db_is_utf8 ? "CHARACTER SET utf8" : ''; - my $type = grep($_ eq $table, MYISAM_TABLES) ? 'MYISAM' : 'InnoDB'; - - my $ddl = $self->SUPER::_get_create_table_ddl($table); - $ddl =~ s/CREATE TABLE (.*) \(/CREATE TABLE `$1` (/; - $ddl .= " ENGINE = $type $charset"; - - return $ddl; - + my $charset = Bugzilla::DB::Mysql->utf8_charset; + my $collate = Bugzilla::DB::Mysql->utf8_collate; + my $row_format = Bugzilla::DB::Mysql->default_row_format($table); + my @parts = ( + $self->SUPER::_get_create_table_ddl($table), 'ENGINE = InnoDB', + "CHARACTER SET $charset COLLATE $collate", "ROW_FORMAT=$row_format", + ); + return join(' ', @parts); } #eosub--_get_create_table_ddl #------------------------------------------------------------------------------ @@ -155,7 +149,7 @@ sub _get_create_index_ddl { my $sql = "CREATE "; $sql .= "$index_type " if ($index_type eq 'UNIQUE' || $index_type eq 'FULLTEXT'); - $sql .= "INDEX \`$index_name\` ON \`$table_name\` \(" + $sql .= "INDEX \`$index_name\` ON $table_name \(" . join(", ", @$index_fields) . "\)"; return ($sql); @@ -169,10 +163,9 @@ sub get_create_database_sql { # We only create as utf8 if we have no params (meaning we're doing # a new installation) or if the utf8 param is on. - my $create_utf8 - = Bugzilla->params->{'utf8'} || !defined Bugzilla->params->{'utf8'}; - my $charset = $create_utf8 ? "CHARACTER SET utf8" : ''; - return ("CREATE DATABASE $name $charset"); + my $charset = Bugzilla::DB::Mysql->utf8_charset; + my $collate = Bugzilla::DB::Mysql->utf8_collate; + return ("CREATE DATABASE $name CHARACTER SET $charset COLLATE $collate"); } # MySQL has a simpler ALTER TABLE syntax than ANSI. diff --git a/Bugzilla/DB/Schema/Oracle.pm b/Bugzilla/DB/Schema/Oracle.pm index 416e9204b5..3f589b3378 100644 --- a/Bugzilla/DB/Schema/Oracle.pm +++ b/Bugzilla/DB/Schema/Oracle.pm @@ -17,7 +17,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::DB::Schema); +use base qw(Bugzilla::DB::Schema); use Carp qw(confess); use Bugzilla::Util; diff --git a/Bugzilla/DB/Schema/Pg.pm b/Bugzilla/DB/Schema/Pg.pm index cf28a02d96..908ad86924 100644 --- a/Bugzilla/DB/Schema/Pg.pm +++ b/Bugzilla/DB/Schema/Pg.pm @@ -17,7 +17,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::DB::Schema); +use base qw(Bugzilla::DB::Schema); use Storable qw(dclone); #------------------------------------------------------------------------------ diff --git a/Bugzilla/DB/Schema/Sqlite.pm b/Bugzilla/DB/Schema/Sqlite.pm index 57361d2bbf..5173ae3bd8 100644 --- a/Bugzilla/DB/Schema/Sqlite.pm +++ b/Bugzilla/DB/Schema/Sqlite.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::DB::Schema); +use base qw(Bugzilla::DB::Schema); use Bugzilla::Error; use Bugzilla::Util qw(generate_random_password); diff --git a/Bugzilla/DB/Sqlite.pm b/Bugzilla/DB/Sqlite.pm index c180fd0d76..26741c4dee 100644 --- a/Bugzilla/DB/Sqlite.pm +++ b/Bugzilla/DB/Sqlite.pm @@ -8,10 +8,9 @@ package Bugzilla::DB::Sqlite; use 5.10.1; -use strict; -use warnings; +use Moo; -use parent qw(Bugzilla::DB); +extends qw(Bugzilla::DB); use Bugzilla::Constants; use Bugzilla::Error; @@ -69,7 +68,7 @@ sub _sqlite_position_ci { # Constructor # ############### -sub new { +sub BUILDARGS { my ($class, $params) = @_; my $db_name = $params->{db_name}; @@ -99,11 +98,11 @@ sub new { sqlite_unicode => Bugzilla->params->{'utf8'}, }; - my $self - = $class->db_new({dsn => $dsn, user => '', pass => '', attrs => $attrs}); + return {dsn => $dsn, user => '', pass => '', attrs => $attrs}; +} - # Needed by TheSchwartz - $self->{private_bz_dsn} = $dsn; +sub on_dbi_connected { + my ($class, $dbh) = @_; my %pragmas = ( @@ -129,12 +128,12 @@ sub new { ); while (my ($name, $value) = each %pragmas) { - $self->do("PRAGMA $name = $value"); + $dbh->do("PRAGMA $name = $value"); } - $self->sqlite_create_collation('bugzilla', \&_sqlite_collate_ci); - $self->sqlite_create_function('position', 2, \&_sqlite_position); - $self->sqlite_create_function('iposition', 2, \&_sqlite_position_ci); + $dbh->sqlite_create_collation('bugzilla', \&_sqlite_collate_ci); + $dbh->sqlite_create_function('position', 2, \&_sqlite_position); + $dbh->sqlite_create_function('iposition', 2, \&_sqlite_position_ci); # SQLite has a "substr" function, but other DBs call it "SUBSTRING" # so that's what we use, and I don't know of any way in SQLite to diff --git a/Bugzilla/Error.pm b/Bugzilla/Error.pm index ac56b9b027..42b2dea04b 100644 --- a/Bugzilla/Error.pm +++ b/Bugzilla/Error.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Exporter); +use base qw(Exporter); @Bugzilla::Error::EXPORT = qw(ThrowCodeError ThrowTemplateError ThrowUserError); diff --git a/Bugzilla/Extension.pm b/Bugzilla/Extension.pm index a5522583e9..4e01b5d9c9 100644 --- a/Bugzilla/Extension.pm +++ b/Bugzilla/Extension.pm @@ -245,7 +245,7 @@ F: package Bugzilla::Extension::Foo use strict; - use parent qw(Bugzilla::Extension); + use base qw(Bugzilla::Extension); our $VERSION = '0.02'; use constant NAME => 'Foo'; diff --git a/Bugzilla/Field.pm b/Bugzilla/Field.pm index 97013af513..6b38e4d3af 100644 --- a/Bugzilla/Field.pm +++ b/Bugzilla/Field.pm @@ -61,7 +61,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Exporter Bugzilla::Object); +use base qw(Exporter Bugzilla::Object); @Bugzilla::Field::EXPORT = qw(check_field get_field_id get_legal_field_values); use Bugzilla::Constants; diff --git a/Bugzilla/Field/Choice.pm b/Bugzilla/Field/Choice.pm index bd82a8e3f0..b96af2187f 100644 --- a/Bugzilla/Field/Choice.pm +++ b/Bugzilla/Field/Choice.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Field::ChoiceInterface Bugzilla::Object); +use base qw(Bugzilla::Field::ChoiceInterface Bugzilla::Object); use Bugzilla::Config qw(SetParam write_params); use Bugzilla::Constants; @@ -99,7 +99,7 @@ sub type { if (!defined *{"${package}::DB_TABLE"}) { eval < '$field_name'; EOC } diff --git a/Bugzilla/Flag.pm b/Bugzilla/Flag.pm index fb43d306bc..969e8bc706 100644 --- a/Bugzilla/Flag.pm +++ b/Bugzilla/Flag.pm @@ -51,7 +51,7 @@ use Bugzilla::Mailer; use Bugzilla::Constants; use Bugzilla::Field; -use parent qw(Bugzilla::Object Exporter); +use base qw(Bugzilla::Object Exporter); @Bugzilla::Flag::EXPORT = qw(SKIP_REQUESTEE_ON_ERROR); ############################### diff --git a/Bugzilla/FlagType.pm b/Bugzilla/FlagType.pm index a08ee83b90..ade62c1150 100644 --- a/Bugzilla/FlagType.pm +++ b/Bugzilla/FlagType.pm @@ -43,7 +43,7 @@ use Bugzilla::Group; use Email::Address; use List::MoreUtils qw(uniq); -use parent qw(Bugzilla::Object); +use base qw(Bugzilla::Object); ############################### #### Initialization #### diff --git a/Bugzilla/Group.pm b/Bugzilla/Group.pm index 8715c4cfeb..3763e74fcb 100644 --- a/Bugzilla/Group.pm +++ b/Bugzilla/Group.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Object); +use base qw(Bugzilla::Object); use Bugzilla::Constants; use Bugzilla::Util; diff --git a/Bugzilla/Install/CPAN.pm b/Bugzilla/Install/CPAN.pm index 4321cac619..dd6db28daf 100644 --- a/Bugzilla/Install/CPAN.pm +++ b/Bugzilla/Install/CPAN.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Exporter); +use base qw(Exporter); our @EXPORT = qw( BZ_LIB diff --git a/Bugzilla/Install/Filesystem.pm b/Bugzilla/Install/Filesystem.pm index 8d61632235..406e46bda9 100644 --- a/Bugzilla/Install/Filesystem.pm +++ b/Bugzilla/Install/Filesystem.pm @@ -34,7 +34,7 @@ use File::Spec; use IO::File; use POSIX (); -use parent qw(Exporter); +use base qw(Exporter); our @EXPORT = qw( update_filesystem create_htaccess diff --git a/Bugzilla/Install/Localconfig.pm b/Bugzilla/Install/Localconfig.pm index bc45573098..e06a517488 100644 --- a/Bugzilla/Install/Localconfig.pm +++ b/Bugzilla/Install/Localconfig.pm @@ -28,7 +28,7 @@ use File::Basename qw(dirname); use Safe; use Term::ANSIColor; -use parent qw(Exporter); +use base qw(Exporter); our @EXPORT_OK = qw( read_localconfig diff --git a/Bugzilla/Install/Requirements.pm b/Bugzilla/Install/Requirements.pm index 852f7f78e0..83a1c5b7a8 100644 --- a/Bugzilla/Install/Requirements.pm +++ b/Bugzilla/Install/Requirements.pm @@ -23,7 +23,7 @@ use Bugzilla::Install::Util qw(install_string bin_loc use List::Util qw(max); use Term::ANSIColor; -use parent qw(Exporter); +use base qw(Exporter); our @EXPORT = qw( REQUIRED_MODULES OPTIONAL_MODULES @@ -64,11 +64,11 @@ use constant APACHE => qw(apachectl httpd apache2 apache); # If we don't find any of the above binaries in the normal PATH, # these are extra places we look. use constant APACHE_PATH => [qw( - /usr/sbin - /usr/local/sbin - /usr/libexec - /usr/local/libexec - )]; + /usr/sbin + /usr/local/sbin + /usr/libexec + /usr/local/libexec +)]; # The below two constants are subroutines so that they can implement # a hook. Other than that they are actually constants. @@ -114,6 +114,10 @@ sub REQUIRED_MODULES { version => ($^V >= v5.13.3) ? '1.614' : '1.54' }, + {package => 'DBIx-Connector', module => 'DBIx::Connector', version => '0.56',}, + + {package => 'Moo', module => 'Moo', version => '2.003004',}, + # 2.24 contains several useful text virtual methods. {package => 'Template-Toolkit', module => 'Template', version => '2.24'}, @@ -747,7 +751,7 @@ sub have_vers { my $blacklisted; if ($vok && $params->{blacklist}) { $blacklisted = grep($vnum =~ /$_/, @{$params->{blacklist}}); - $vok = 0 if $blacklisted; + $vok = 0 if $blacklisted; } if ($output) { diff --git a/Bugzilla/Install/Util.pm b/Bugzilla/Install/Util.pm index 6179772415..4c4957c770 100644 --- a/Bugzilla/Install/Util.pm +++ b/Bugzilla/Install/Util.pm @@ -25,7 +25,7 @@ use Scalar::Util qw(tainted); use Term::ANSIColor qw(colored); use PerlIO; -use parent qw(Exporter); +use base qw(Exporter); our @EXPORT_OK = qw( bin_loc get_version_and_os diff --git a/Bugzilla/Job/BugMail.pm b/Bugzilla/Job/BugMail.pm index a6deb57771..157fd2971a 100644 --- a/Bugzilla/Job/BugMail.pm +++ b/Bugzilla/Job/BugMail.pm @@ -12,7 +12,7 @@ use strict; use warnings; use Bugzilla::BugMail; -BEGIN { eval "use parent qw(Bugzilla::Job::Mailer)"; } +BEGIN { eval "use base qw(Bugzilla::Job::Mailer)"; } sub work { my ($class, $job) = @_; diff --git a/Bugzilla/Job/Mailer.pm b/Bugzilla/Job/Mailer.pm index 544d86107b..c2f1fea11e 100644 --- a/Bugzilla/Job/Mailer.pm +++ b/Bugzilla/Job/Mailer.pm @@ -12,7 +12,7 @@ use strict; use warnings; use Bugzilla::Mailer; -BEGIN { eval "use parent qw(TheSchwartz::Worker)"; } +BEGIN { eval "use base qw(TheSchwartz::Worker)"; } # The longest we expect a job to possibly take, in seconds. use constant grab_for => 300; diff --git a/Bugzilla/JobQueue.pm b/Bugzilla/JobQueue.pm index e481820078..4777e6b0ca 100644 --- a/Bugzilla/JobQueue.pm +++ b/Bugzilla/JobQueue.pm @@ -56,7 +56,7 @@ sub new { # to write to it. my $self = $class->SUPER::new( databases => [{ - dsn => Bugzilla->dbh_main->{private_bz_dsn}, + dsn => Bugzilla->dbh_main->dsn, user => $lc->{db_user}, pass => $lc->{db_pass}, prefix => 'ts_', diff --git a/Bugzilla/JobQueue/Runner.pm b/Bugzilla/JobQueue/Runner.pm index a9eb0bca49..d339d498b7 100644 --- a/Bugzilla/JobQueue/Runner.pm +++ b/Bugzilla/JobQueue/Runner.pm @@ -23,7 +23,7 @@ use Pod::Usage; use Bugzilla::Constants; use Bugzilla::JobQueue; use Bugzilla::Util qw(get_text); -BEGIN { eval "use parent qw(Daemon::Generic)"; } +BEGIN { eval "use base qw(Daemon::Generic)"; } our $VERSION = BUGZILLA_VERSION; diff --git a/Bugzilla/Keyword.pm b/Bugzilla/Keyword.pm index f1cb6cadf1..5c17e5797e 100644 --- a/Bugzilla/Keyword.pm +++ b/Bugzilla/Keyword.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Object); +use base qw(Bugzilla::Object); use Bugzilla::Error; use Bugzilla::Util; diff --git a/Bugzilla/MIME.pm b/Bugzilla/MIME.pm index 660799e661..6df7ce2b29 100644 --- a/Bugzilla/MIME.pm +++ b/Bugzilla/MIME.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Email::MIME); +use base qw(Email::MIME); sub new { my ($class, $msg) = @_; diff --git a/Bugzilla/Mailer.pm b/Bugzilla/Mailer.pm index a5f79b9bcc..0783bbf16a 100644 --- a/Bugzilla/Mailer.pm +++ b/Bugzilla/Mailer.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Exporter); +use base qw(Exporter); @Bugzilla::Mailer::EXPORT = qw(MessageToMTA build_thread_marker generate_email); use Bugzilla::Constants; diff --git a/Bugzilla/Migrate/Gnats.pm b/Bugzilla/Migrate/Gnats.pm index a5aa642e14..a8c26bd30d 100644 --- a/Bugzilla/Migrate/Gnats.pm +++ b/Bugzilla/Migrate/Gnats.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Migrate); +use base qw(Bugzilla::Migrate); use Bugzilla::Constants; use Bugzilla::Install::Util qw(indicate_progress); diff --git a/Bugzilla/Milestone.pm b/Bugzilla/Milestone.pm index 815a111f80..8b9288410d 100644 --- a/Bugzilla/Milestone.pm +++ b/Bugzilla/Milestone.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Object); +use base qw(Bugzilla::Object); use Bugzilla::Constants; use Bugzilla::Util; diff --git a/Bugzilla/Product.pm b/Bugzilla/Product.pm index 2b39c2819f..f826386ca9 100644 --- a/Bugzilla/Product.pm +++ b/Bugzilla/Product.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Field::ChoiceInterface Bugzilla::Object); +use base qw(Bugzilla::Field::ChoiceInterface Bugzilla::Object); use Bugzilla::Constants; use Bugzilla::Util; diff --git a/Bugzilla/RNG.pm b/Bugzilla/RNG.pm index b92cbd7204..37ac937a29 100644 --- a/Bugzilla/RNG.pm +++ b/Bugzilla/RNG.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Exporter); +use base qw(Exporter); use Bugzilla::Constants qw(ON_WINDOWS); use Math::Random::ISAAC; diff --git a/Bugzilla/Report.pm b/Bugzilla/Report.pm index 84ea3b38b3..1d44e03dde 100644 --- a/Bugzilla/Report.pm +++ b/Bugzilla/Report.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Object); +use base qw(Bugzilla::Object); use Bugzilla::CGI; use Bugzilla::Constants; diff --git a/Bugzilla/Search.pm b/Bugzilla/Search.pm index 2005fe4db8..017e854069 100644 --- a/Bugzilla/Search.pm +++ b/Bugzilla/Search.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Exporter); +use base qw(Exporter); @Bugzilla::Search::EXPORT = qw( IsValidQueryType split_order_term @@ -1790,7 +1790,6 @@ sub _handle_chart { $field = FIELD_MAP->{$field} || $field; my ($string_value, $orig_value); - state $is_mysql = $dbh->isa('Bugzilla::DB::Mysql') ? 1 : 0; if (ref $value eq 'ARRAY') { @@ -1799,17 +1798,11 @@ sub _handle_chart { @$value = grep { defined $_ and $_ ne '' } @$value; return if !@$value; $orig_value = join(',', @$value); - if ($field eq 'longdesc' && $is_mysql) { - @$value = map { _convert_unicode_characters($_) } @$value; - } $string_value = join(',', @$value); } else { return if $value eq ''; $orig_value = $value; - if ($field eq 'longdesc' && $is_mysql) { - $value = _convert_unicode_characters($value); - } $string_value = $value; } @@ -1870,19 +1863,6 @@ sub _handle_chart { $condition->translated(\%search_args); } -# XXX - This is a hack for MySQL which doesn't understand Unicode characters -# above U+FFFF, see Bugzilla::Comment::_check_thetext(). This hack can go away -# once we require MySQL 5.5.3 and use utf8mb4. -sub _convert_unicode_characters { - my $string = shift; - - # Perl 5.13.8 and older complain about non-characters. - no warnings 'utf8'; - $string - =~ s/([\x{10000}-\x{10FFFF}])/"\x{FDD0}[" . uc(sprintf('U+%04x', ord($1))) . "]\x{FDD1}"/eg; - return $string; -} - ################################## # do_search_function And Helpers # ################################## diff --git a/Bugzilla/Search/ClauseGroup.pm b/Bugzilla/Search/ClauseGroup.pm index 5c77917346..deecb0ce35 100644 --- a/Bugzilla/Search/ClauseGroup.pm +++ b/Bugzilla/Search/ClauseGroup.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Search::Clause); +use base qw(Bugzilla::Search::Clause); use Bugzilla::Error; use Bugzilla::Search::Condition qw(condition); diff --git a/Bugzilla/Search/Condition.pm b/Bugzilla/Search/Condition.pm index 9ddb6a8986..36c6c11f2e 100644 --- a/Bugzilla/Search/Condition.pm +++ b/Bugzilla/Search/Condition.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Exporter); +use base qw(Exporter); our @EXPORT_OK = qw(condition); sub new { diff --git a/Bugzilla/Search/Quicksearch.pm b/Bugzilla/Search/Quicksearch.pm index 85cb2770f3..1a9e462f6f 100644 --- a/Bugzilla/Search/Quicksearch.pm +++ b/Bugzilla/Search/Quicksearch.pm @@ -22,7 +22,7 @@ use List::Util qw(min max); use List::MoreUtils qw(firstidx); use Text::ParseWords qw(parse_line); -use parent qw(Exporter); +use base qw(Exporter); @Bugzilla::Search::Quicksearch::EXPORT = qw(quicksearch); # Custom mappings for some fields. diff --git a/Bugzilla/Search/Recent.pm b/Bugzilla/Search/Recent.pm index 5c12db1560..3a5d9f244b 100644 --- a/Bugzilla/Search/Recent.pm +++ b/Bugzilla/Search/Recent.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Object); +use base qw(Bugzilla::Object); use Bugzilla::Constants; use Bugzilla::Error; diff --git a/Bugzilla/Search/Saved.pm b/Bugzilla/Search/Saved.pm index c988e8997c..72ff822f55 100644 --- a/Bugzilla/Search/Saved.pm +++ b/Bugzilla/Search/Saved.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Object); +use base qw(Bugzilla::Object); use Bugzilla::CGI; use Bugzilla::Constants; diff --git a/Bugzilla/Sender/Transport/Sendmail.pm b/Bugzilla/Sender/Transport/Sendmail.pm index d2be2cded9..2c08304b98 100644 --- a/Bugzilla/Sender/Transport/Sendmail.pm +++ b/Bugzilla/Sender/Transport/Sendmail.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Email::Sender::Transport::Sendmail); +use base qw(Email::Sender::Transport::Sendmail); use Email::Sender::Failure; diff --git a/Bugzilla/Status.pm b/Bugzilla/Status.pm index 615c7b2501..a318de7295 100644 --- a/Bugzilla/Status.pm +++ b/Bugzilla/Status.pm @@ -15,7 +15,7 @@ use warnings; # ChoiceInterface, because a bug status literally is a special type # of Field::Choice, not just an object that happens to have the same # methods. -use parent qw(Bugzilla::Field::Choice Exporter); +use base qw(Bugzilla::Field::Choice Exporter); @Bugzilla::Status::EXPORT = qw( BUG_STATE_OPEN SPECIAL_STATUS_WORKFLOW_ACTIONS diff --git a/Bugzilla/Template.pm b/Bugzilla/Template.pm index ea319b4f06..dfe8069fe5 100644 --- a/Bugzilla/Template.pm +++ b/Bugzilla/Template.pm @@ -37,7 +37,7 @@ use IO::Dir; use List::MoreUtils qw(firstidx); use Scalar::Util qw(blessed); -use parent qw(Template); +use base qw(Template); use constant FORMAT_TRIPLE => '%19s|%-28s|%-28s'; use constant FORMAT_3_SIZE => [19, 28, 28]; diff --git a/Bugzilla/Template/Context.pm b/Bugzilla/Template/Context.pm index 01c8c59811..bbd7a01c51 100644 --- a/Bugzilla/Template/Context.pm +++ b/Bugzilla/Template/Context.pm @@ -12,7 +12,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Template::Context); +use base qw(Template::Context); use Bugzilla::Hook; use Scalar::Util qw(blessed); diff --git a/Bugzilla/Template/Plugin/Bugzilla.pm b/Bugzilla/Template/Plugin/Bugzilla.pm index 0734fb9425..b076a9d7c0 100644 --- a/Bugzilla/Template/Plugin/Bugzilla.pm +++ b/Bugzilla/Template/Plugin/Bugzilla.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Template::Plugin); +use base qw(Template::Plugin); use Bugzilla; diff --git a/Bugzilla/Template/Plugin/Hook.pm b/Bugzilla/Template/Plugin/Hook.pm index c57db42236..fddb989c03 100644 --- a/Bugzilla/Template/Plugin/Hook.pm +++ b/Bugzilla/Template/Plugin/Hook.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Template::Plugin); +use base qw(Template::Plugin); use Bugzilla::Constants; use Bugzilla::Install::Util qw(template_include_path); diff --git a/Bugzilla/Token.pm b/Bugzilla/Token.pm index 62106c5e54..81455e5ab3 100644 --- a/Bugzilla/Token.pm +++ b/Bugzilla/Token.pm @@ -22,7 +22,7 @@ use Date::Parse; use File::Basename; use Digest::SHA qw(hmac_sha256_base64); -use parent qw(Exporter); +use base qw(Exporter); @Bugzilla::Token::EXPORT = qw(issue_api_token issue_session_token check_token_data delete_token diff --git a/Bugzilla/User.pm b/Bugzilla/User.pm index 5426cc8fa5..bec81dadc0 100644 --- a/Bugzilla/User.pm +++ b/Bugzilla/User.pm @@ -31,7 +31,7 @@ use Storable qw(dclone); use URI; use URI::QueryParam; -use parent qw(Bugzilla::Object Exporter); +use base qw(Bugzilla::Object Exporter); @Bugzilla::User::EXPORT = qw(is_available_username login_to_id validate_password validate_password_check USER_MATCH_MULTIPLE USER_MATCH_FAILED USER_MATCH_SUCCESS diff --git a/Bugzilla/User/APIKey.pm b/Bugzilla/User/APIKey.pm index d2e337c5ea..d9a9b16ac8 100644 --- a/Bugzilla/User/APIKey.pm +++ b/Bugzilla/User/APIKey.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Object); +use base qw(Bugzilla::Object); use Bugzilla::User; use Bugzilla::Util qw(generate_random_password trim); diff --git a/Bugzilla/User/Setting.pm b/Bugzilla/User/Setting.pm index 67f5c56844..0f528e9466 100644 --- a/Bugzilla/User/Setting.pm +++ b/Bugzilla/User/Setting.pm @@ -12,7 +12,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Exporter); +use base qw(Exporter); # Module stuff diff --git a/Bugzilla/User/Setting/Lang.pm b/Bugzilla/User/Setting/Lang.pm index d1aeb34216..5f49bc6e4d 100644 --- a/Bugzilla/User/Setting/Lang.pm +++ b/Bugzilla/User/Setting/Lang.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::User::Setting); +use base qw(Bugzilla::User::Setting); use Bugzilla::Constants; diff --git a/Bugzilla/User/Setting/Skin.pm b/Bugzilla/User/Setting/Skin.pm index 0447b02ab6..c28a44221e 100644 --- a/Bugzilla/User/Setting/Skin.pm +++ b/Bugzilla/User/Setting/Skin.pm @@ -12,7 +12,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::User::Setting); +use base qw(Bugzilla::User::Setting); use Bugzilla::Constants; use File::Spec::Functions; diff --git a/Bugzilla/User/Setting/Timezone.pm b/Bugzilla/User/Setting/Timezone.pm index b6b2503b5d..6e20f1fc27 100644 --- a/Bugzilla/User/Setting/Timezone.pm +++ b/Bugzilla/User/Setting/Timezone.pm @@ -13,7 +13,7 @@ use warnings; use DateTime::TimeZone; -use parent qw(Bugzilla::User::Setting); +use base qw(Bugzilla::User::Setting); use Bugzilla::Constants; diff --git a/Bugzilla/UserAgent.pm b/Bugzilla/UserAgent.pm index 1995cc82ff..6a531136b9 100644 --- a/Bugzilla/UserAgent.pm +++ b/Bugzilla/UserAgent.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Exporter); +use base qw(Exporter); our @EXPORT = qw(detect_platform detect_op_sys); use Bugzilla::Field; diff --git a/Bugzilla/Util.pm b/Bugzilla/Util.pm index 5724797778..ae85ff389c 100644 --- a/Bugzilla/Util.pm +++ b/Bugzilla/Util.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Exporter); +use base qw(Exporter); @Bugzilla::Util::EXPORT = qw(trick_taint detaint_natural detaint_signed html_quote url_quote xml_quote css_class_quote html_light_quote diff --git a/Bugzilla/Version.pm b/Bugzilla/Version.pm index dfc5a8e0f2..f4e90d5cad 100644 --- a/Bugzilla/Version.pm +++ b/Bugzilla/Version.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Object Exporter); +use base qw(Bugzilla::Object Exporter); @Bugzilla::Version::EXPORT = qw(vers_cmp); diff --git a/Bugzilla/WebService/Bug.pm b/Bugzilla/WebService/Bug.pm index 5852928c1a..5e366670be 100644 --- a/Bugzilla/WebService/Bug.pm +++ b/Bugzilla/WebService/Bug.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::WebService); +use base qw(Bugzilla::WebService); use Bugzilla::Comment; use Bugzilla::Comment::TagWeights; diff --git a/Bugzilla/WebService/BugUserLastVisit.pm b/Bugzilla/WebService/BugUserLastVisit.pm index 1285073764..3937f32d99 100644 --- a/Bugzilla/WebService/BugUserLastVisit.pm +++ b/Bugzilla/WebService/BugUserLastVisit.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::WebService); +use base qw(Bugzilla::WebService); use Bugzilla::Bug; use Bugzilla::Error; diff --git a/Bugzilla/WebService/Bugzilla.pm b/Bugzilla/WebService/Bugzilla.pm index f93892068a..23e0348915 100644 --- a/Bugzilla/WebService/Bugzilla.pm +++ b/Bugzilla/WebService/Bugzilla.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::WebService); +use base qw(Bugzilla::WebService); use Bugzilla::Constants; use Bugzilla::Util qw(datetime_from); use Bugzilla::WebService::Util qw(validate filter_wants); diff --git a/Bugzilla/WebService/Classification.pm b/Bugzilla/WebService/Classification.pm index ab539b3395..525b8e6792 100644 --- a/Bugzilla/WebService/Classification.pm +++ b/Bugzilla/WebService/Classification.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw (Bugzilla::WebService); +use base qw (Bugzilla::WebService); use Bugzilla::Classification; use Bugzilla::Error; diff --git a/Bugzilla/WebService/Constants.pm b/Bugzilla/WebService/Constants.pm index a2f83f528b..74ca897924 100644 --- a/Bugzilla/WebService/Constants.pm +++ b/Bugzilla/WebService/Constants.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Exporter); +use base qw(Exporter); our @EXPORT = qw( WS_ERROR_CODE diff --git a/Bugzilla/WebService/FlagType.pm b/Bugzilla/WebService/FlagType.pm index 9dc240c7f7..a9515eb7a6 100644 --- a/Bugzilla/WebService/FlagType.pm +++ b/Bugzilla/WebService/FlagType.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::WebService); +use base qw(Bugzilla::WebService); use Bugzilla::Component; use Bugzilla::Constants; use Bugzilla::Error; diff --git a/Bugzilla/WebService/Group.pm b/Bugzilla/WebService/Group.pm index c92583d0b1..4467883a4e 100644 --- a/Bugzilla/WebService/Group.pm +++ b/Bugzilla/WebService/Group.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::WebService); +use base qw(Bugzilla::WebService); use Bugzilla::Constants; use Bugzilla::Error; use Bugzilla::WebService::Util qw(validate translate params_to_objects); diff --git a/Bugzilla/WebService/Product.pm b/Bugzilla/WebService/Product.pm index a7980172e9..350dadde35 100644 --- a/Bugzilla/WebService/Product.pm +++ b/Bugzilla/WebService/Product.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::WebService); +use base qw(Bugzilla::WebService); use Bugzilla::Product; use Bugzilla::User; use Bugzilla::Error; diff --git a/Bugzilla/WebService/Server/REST.pm b/Bugzilla/WebService/Server/REST.pm index 143b938b65..70cd82efef 100644 --- a/Bugzilla/WebService/Server/REST.pm +++ b/Bugzilla/WebService/Server/REST.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::WebService::Server::JSONRPC); +use base qw(Bugzilla::WebService::Server::JSONRPC); use Bugzilla::Constants; use Bugzilla::Error; diff --git a/Bugzilla/WebService/Server/XMLRPC.pm b/Bugzilla/WebService/Server/XMLRPC.pm index f96f960da3..0e48b05725 100644 --- a/Bugzilla/WebService/Server/XMLRPC.pm +++ b/Bugzilla/WebService/Server/XMLRPC.pm @@ -132,7 +132,7 @@ use 5.10.1; use strict; use warnings; -# We can't use "use parent" because XMLRPC::Serializer doesn't return +# We can't use "use base" because XMLRPC::Serializer doesn't return # a true value. use XMLRPC::Lite; our @ISA = qw(XMLRPC::Deserializer); @@ -287,7 +287,7 @@ use warnings; use Scalar::Util qw(blessed reftype); -# We can't use "use parent" because XMLRPC::Serializer doesn't return +# We can't use "use base" because XMLRPC::Serializer doesn't return # a true value. use XMLRPC::Lite; our @ISA = qw(XMLRPC::Serializer); diff --git a/Bugzilla/WebService/User.pm b/Bugzilla/WebService/User.pm index 5910218318..2078cc9a3d 100644 --- a/Bugzilla/WebService/User.pm +++ b/Bugzilla/WebService/User.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::WebService); +use base qw(Bugzilla::WebService); use Bugzilla::Constants; use Bugzilla::Error; diff --git a/Bugzilla/WebService/Util.pm b/Bugzilla/WebService/Util.pm index 3e70921b37..2b7e3de722 100644 --- a/Bugzilla/WebService/Util.pm +++ b/Bugzilla/WebService/Util.pm @@ -18,7 +18,7 @@ use Bugzilla::Error; use Storable qw(dclone); use List::MoreUtils qw(any none); -use parent qw(Exporter); +use base qw(Exporter); # We have to "require", not "use" this, because otherwise it tries to # use features of Test::More during import(). diff --git a/Bugzilla/Whine.pm b/Bugzilla/Whine.pm index 081933cba0..67fc6cc5d6 100644 --- a/Bugzilla/Whine.pm +++ b/Bugzilla/Whine.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Object); +use base qw(Bugzilla::Object); use Bugzilla::Constants; use Bugzilla::Error; diff --git a/Bugzilla/Whine/Query.pm b/Bugzilla/Whine/Query.pm index 6648eab666..95b0ab6f17 100644 --- a/Bugzilla/Whine/Query.pm +++ b/Bugzilla/Whine/Query.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Object); +use base qw(Bugzilla::Object); use Bugzilla::Constants; use Bugzilla::Search::Saved; diff --git a/Bugzilla/Whine/Schedule.pm b/Bugzilla/Whine/Schedule.pm index 7517a3f26e..84b901b58d 100644 --- a/Bugzilla/Whine/Schedule.pm +++ b/Bugzilla/Whine/Schedule.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Object); +use base qw(Bugzilla::Object); use Bugzilla::Constants; diff --git a/docs/lib/Pod/Simple/HTML/Bugzilla.pm b/docs/lib/Pod/Simple/HTML/Bugzilla.pm index 5a2203473e..c95b031cfa 100644 --- a/docs/lib/Pod/Simple/HTML/Bugzilla.pm +++ b/docs/lib/Pod/Simple/HTML/Bugzilla.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Pod::Simple::HTML); +use base qw(Pod::Simple::HTML); # Without this constant, HTMLBatch will throw undef warnings. use constant VERSION => $Pod::Simple::HTML::VERSION; diff --git a/docs/lib/Pod/Simple/HTMLBatch/Bugzilla.pm b/docs/lib/Pod/Simple/HTMLBatch/Bugzilla.pm index bc96c9a0e7..d800e176e1 100644 --- a/docs/lib/Pod/Simple/HTMLBatch/Bugzilla.pm +++ b/docs/lib/Pod/Simple/HTMLBatch/Bugzilla.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Pod::Simple::HTMLBatch); +use base qw(Pod::Simple::HTMLBatch); # This is the same hack that HTMLBatch does to "import" this subroutine. BEGIN { *esc = \&Pod::Simple::HTML::esc } diff --git a/extensions/BmpConvert/Extension.pm b/extensions/BmpConvert/Extension.pm index 84a2c81dcf..313a734fe0 100644 --- a/extensions/BmpConvert/Extension.pm +++ b/extensions/BmpConvert/Extension.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Extension); +use base qw(Bugzilla::Extension); use Image::Magick; diff --git a/extensions/Example/Extension.pm b/extensions/Example/Extension.pm index 1ecb3e692f..227c132658 100644 --- a/extensions/Example/Extension.pm +++ b/extensions/Example/Extension.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Extension); +use base qw(Bugzilla::Extension); use Bugzilla::Constants; use Bugzilla::Error; diff --git a/extensions/Example/lib/Auth/Login.pm b/extensions/Example/lib/Auth/Login.pm index 49af42c220..6f3a19f3ae 100644 --- a/extensions/Example/lib/Auth/Login.pm +++ b/extensions/Example/lib/Auth/Login.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Auth::Login); +use base qw(Bugzilla::Auth::Login); use constant user_can_create_account => 0; use Bugzilla::Constants; diff --git a/extensions/Example/lib/Auth/Verify.pm b/extensions/Example/lib/Auth/Verify.pm index 591c1d4f8f..b82f09d11d 100644 --- a/extensions/Example/lib/Auth/Verify.pm +++ b/extensions/Example/lib/Auth/Verify.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Auth::Verify); +use base qw(Bugzilla::Auth::Verify); use Bugzilla::Constants; # A verifier that always fails. diff --git a/extensions/Example/lib/WebService.pm b/extensions/Example/lib/WebService.pm index f461fee6f8..f50c6e6cb5 100644 --- a/extensions/Example/lib/WebService.pm +++ b/extensions/Example/lib/WebService.pm @@ -10,7 +10,7 @@ package Bugzilla::Extension::Example::WebService; use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::WebService); +use base qw(Bugzilla::WebService); use Bugzilla::Error; use constant PUBLIC_METHODS => qw( diff --git a/extensions/MoreBugUrl/Extension.pm b/extensions/MoreBugUrl/Extension.pm index a6eae1be53..c32a246982 100644 --- a/extensions/MoreBugUrl/Extension.pm +++ b/extensions/MoreBugUrl/Extension.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Extension); +use base qw(Bugzilla::Extension); use constant MORE_SUB_CLASSES => qw( Bugzilla::Extension::MoreBugUrl::BitBucket diff --git a/extensions/MoreBugUrl/lib/BitBucket.pm b/extensions/MoreBugUrl/lib/BitBucket.pm index 683f9aeb30..9b30735648 100644 --- a/extensions/MoreBugUrl/lib/BitBucket.pm +++ b/extensions/MoreBugUrl/lib/BitBucket.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::BugUrl); +use base qw(Bugzilla::BugUrl); ############################### #### Methods #### diff --git a/extensions/MoreBugUrl/lib/GetSatisfaction.pm b/extensions/MoreBugUrl/lib/GetSatisfaction.pm index 34c86b65f3..d69a6c736c 100644 --- a/extensions/MoreBugUrl/lib/GetSatisfaction.pm +++ b/extensions/MoreBugUrl/lib/GetSatisfaction.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::BugUrl); +use base qw(Bugzilla::BugUrl); ############################### #### Methods #### diff --git a/extensions/MoreBugUrl/lib/PHP.pm b/extensions/MoreBugUrl/lib/PHP.pm index 9419bcd148..29fcc662f5 100644 --- a/extensions/MoreBugUrl/lib/PHP.pm +++ b/extensions/MoreBugUrl/lib/PHP.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::BugUrl); +use base qw(Bugzilla::BugUrl); ############################### #### Methods #### diff --git a/extensions/MoreBugUrl/lib/RT.pm b/extensions/MoreBugUrl/lib/RT.pm index 54dc2dd4ce..52aab48d1f 100644 --- a/extensions/MoreBugUrl/lib/RT.pm +++ b/extensions/MoreBugUrl/lib/RT.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::BugUrl); +use base qw(Bugzilla::BugUrl); ############################### #### Methods #### diff --git a/extensions/MoreBugUrl/lib/Redmine.pm b/extensions/MoreBugUrl/lib/Redmine.pm index 712dab1971..577d08bbb2 100644 --- a/extensions/MoreBugUrl/lib/Redmine.pm +++ b/extensions/MoreBugUrl/lib/Redmine.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::BugUrl); +use base qw(Bugzilla::BugUrl); ############################### #### Methods #### diff --git a/extensions/MoreBugUrl/lib/ReviewBoard.pm b/extensions/MoreBugUrl/lib/ReviewBoard.pm index 48cbecf117..49c904523e 100644 --- a/extensions/MoreBugUrl/lib/ReviewBoard.pm +++ b/extensions/MoreBugUrl/lib/ReviewBoard.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::BugUrl); +use base qw(Bugzilla::BugUrl); ############################### #### Methods #### diff --git a/extensions/MoreBugUrl/lib/Rietveld.pm b/extensions/MoreBugUrl/lib/Rietveld.pm index 55a18b0b27..de3cafefa9 100644 --- a/extensions/MoreBugUrl/lib/Rietveld.pm +++ b/extensions/MoreBugUrl/lib/Rietveld.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::BugUrl); +use base qw(Bugzilla::BugUrl); ############################### #### Methods #### diff --git a/extensions/MoreBugUrl/lib/Savane.pm b/extensions/MoreBugUrl/lib/Savane.pm index ff0cd657f8..a0ea2f825a 100644 --- a/extensions/MoreBugUrl/lib/Savane.pm +++ b/extensions/MoreBugUrl/lib/Savane.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::BugUrl); +use base qw(Bugzilla::BugUrl); ############################### #### Methods #### diff --git a/extensions/OldBugMove/Extension.pm b/extensions/OldBugMove/Extension.pm index 70dc5ad300..135b854692 100644 --- a/extensions/OldBugMove/Extension.pm +++ b/extensions/OldBugMove/Extension.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Extension); +use base qw(Bugzilla::Extension); use Bugzilla::Constants; use Bugzilla::Error; use Bugzilla::Field::Choice; diff --git a/extensions/Voting/Extension.pm b/extensions/Voting/Extension.pm index a46162ed2a..7beefb990f 100644 --- a/extensions/Voting/Extension.pm +++ b/extensions/Voting/Extension.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Bugzilla::Extension); +use base qw(Bugzilla::Extension); use Bugzilla::Bug; use Bugzilla::BugMail; diff --git a/t/Support/Systemexec.pm b/t/Support/Systemexec.pm index e73763f8f0..d5e0f91b1e 100644 --- a/t/Support/Systemexec.pm +++ b/t/Support/Systemexec.pm @@ -11,7 +11,7 @@ use 5.10.1; use strict; use warnings; -use parent qw(Exporter); +use base qw(Exporter); @Support::Systemexec::EXPORT = qw(system exec); sub system($$@) { diff --git a/t/Support/Templates.pm b/t/Support/Templates.pm index e08686e0fb..3e186b5896 100644 --- a/t/Support/Templates.pm +++ b/t/Support/Templates.pm @@ -12,7 +12,7 @@ use strict; use warnings; use lib 't'; -use parent qw(Exporter); +use base qw(Exporter); @Support::Templates::EXPORT = qw(@languages @include_paths @english_default_include_paths @referenced_files %actual_files $num_actual_files); diff --git a/template/en/default/setup/strings.txt.pl b/template/en/default/setup/strings.txt.pl index 0efc378bbd..94e9a5c35d 100644 --- a/template/en/default/setup/strings.txt.pl +++ b/template/en/default/setup/strings.txt.pl @@ -335,6 +335,12 @@ EOT InnoDB is disabled in your MySQL installation. Bugzilla requires InnoDB to be enabled. Please enable it and then re-run checksetup.pl. +END + mysql_innodb_settings => <<'END', +Bugzilla requires the following MySQL InnoDB settings: +innodb_file_format = Barracuda +innodb_file_per_table = 1 +innodb_large_prefix = 1 END mysql_index_renaming => <<'END', We are about to rename old indexes. The estimated time to complete @@ -342,7 +348,8 @@ renaming is ##minutes## minutes. You cannot interrupt this action once it has begun. If you would like to cancel, press Ctrl-C now... (Waiting 45 seconds...) END - mysql_utf8_conversion => <<'END', + mysql_row_format_conversion => "Converting ##table## to row format ##format##.", + mysql_utf8_conversion => <<'END', WARNING: We are about to convert your table storage format to UTF-8. This allows Bugzilla to correctly store and sort international characters. However, if you have any non-UTF-8 data in your database, diff --git a/xt/lib/Bugzilla/Test/Search/AndTest.pm b/xt/lib/Bugzilla/Test/Search/AndTest.pm index 6132c0eb69..8df566836d 100644 --- a/xt/lib/Bugzilla/Test/Search/AndTest.pm +++ b/xt/lib/Bugzilla/Test/Search/AndTest.pm @@ -8,7 +8,7 @@ # This test combines two field/operator combinations using AND in # a single boolean chart. package Bugzilla::Test::Search::AndTest; -use parent qw(Bugzilla::Test::Search::OrTest); +use base qw(Bugzilla::Test::Search::OrTest); use Bugzilla::Test::Search::Constants; use List::MoreUtils qw(all); diff --git a/xt/lib/Bugzilla/Test/Search/Constants.pm b/xt/lib/Bugzilla/Test/Search/Constants.pm index 84080cfe8b..1b8768f68f 100644 --- a/xt/lib/Bugzilla/Test/Search/Constants.pm +++ b/xt/lib/Bugzilla/Test/Search/Constants.pm @@ -12,7 +12,7 @@ # More detailed information on each constant is available in the comments # in this file. package Bugzilla::Test::Search::Constants; -use parent qw(Exporter); +use base qw(Exporter); use Bugzilla::Constants; use Bugzilla::Util qw(generate_random_password); diff --git a/xt/lib/Bugzilla/Test/Search/CustomTest.pm b/xt/lib/Bugzilla/Test/Search/CustomTest.pm index 7455d48282..14fc4454fe 100644 --- a/xt/lib/Bugzilla/Test/Search/CustomTest.pm +++ b/xt/lib/Bugzilla/Test/Search/CustomTest.pm @@ -9,7 +9,7 @@ # Tests like this are specified in CUSTOM_SEARCH_TESTS in # Bugzilla::Test::Search::Constants. package Bugzilla::Test::Search::CustomTest; -use parent qw(Bugzilla::Test::Search::FieldTest); +use base qw(Bugzilla::Test::Search::FieldTest); use strict; use warnings; diff --git a/xt/lib/Bugzilla/Test/Search/FieldTestNormal.pm b/xt/lib/Bugzilla/Test/Search/FieldTestNormal.pm index 101c090539..51e353eb37 100644 --- a/xt/lib/Bugzilla/Test/Search/FieldTestNormal.pm +++ b/xt/lib/Bugzilla/Test/Search/FieldTestNormal.pm @@ -10,7 +10,7 @@ package Bugzilla::Test::Search::FieldTestNormal; use strict; use warnings; -use parent qw(Bugzilla::Test::Search::FieldTest); +use base qw(Bugzilla::Test::Search::FieldTest); use Scalar::Util qw(blessed); diff --git a/xt/lib/Bugzilla/Test/Search/InjectionTest.pm b/xt/lib/Bugzilla/Test/Search/InjectionTest.pm index f34acc6bb5..090841e87c 100644 --- a/xt/lib/Bugzilla/Test/Search/InjectionTest.pm +++ b/xt/lib/Bugzilla/Test/Search/InjectionTest.pm @@ -8,7 +8,7 @@ # This module represents the SQL Injection tests that get run on a single # operator/field combination for Bugzilla::Test::Search. package Bugzilla::Test::Search::InjectionTest; -use parent qw(Bugzilla::Test::Search::FieldTest); +use base qw(Bugzilla::Test::Search::FieldTest); use strict; use warnings; diff --git a/xt/lib/Bugzilla/Test/Search/NotTest.pm b/xt/lib/Bugzilla/Test/Search/NotTest.pm index ea0ecc5b2c..07367960df 100644 --- a/xt/lib/Bugzilla/Test/Search/NotTest.pm +++ b/xt/lib/Bugzilla/Test/Search/NotTest.pm @@ -12,7 +12,7 @@ # it to OrTest and AndTest, but without Moose there isn't much of an # easy way to do that. package Bugzilla::Test::Search::NotTest; -use parent qw(Bugzilla::Test::Search::FieldTest); +use base qw(Bugzilla::Test::Search::FieldTest); use strict; use warnings; use Bugzilla::Test::Search::Constants; diff --git a/xt/lib/Bugzilla/Test/Search/OrTest.pm b/xt/lib/Bugzilla/Test/Search/OrTest.pm index ebb16089d1..82b4aac690 100644 --- a/xt/lib/Bugzilla/Test/Search/OrTest.pm +++ b/xt/lib/Bugzilla/Test/Search/OrTest.pm @@ -8,7 +8,7 @@ # This test combines two field/operator combinations using OR in # a single boolean chart. package Bugzilla::Test::Search::OrTest; -use parent qw(Bugzilla::Test::Search::FieldTest); +use base qw(Bugzilla::Test::Search::FieldTest); use Bugzilla::Test::Search::Constants; use List::MoreUtils qw(all any uniq);