Mailing List Archive

rt branch 5.0/db-type-mariadb created. rt-5.0.5-114-geb873f1880
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "rt".

The branch, 5.0/db-type-mariadb has been created
at eb873f18808f7c2db1be3d007a907f87189252f0 (commit)

- Log -----------------------------------------------------------------
commit eb873f18808f7c2db1be3d007a907f87189252f0
Author: Jim Brandt <jbrandt@bestpractical.com>
Date: Tue Jan 16 11:20:46 2024 -0500

Add explicit support for MariaDB in addition to MySQL

diff --git a/configure.ac b/configure.ac
index dd34674364..e352b84ee3 100755
--- a/configure.ac
+++ b/configure.ac
@@ -116,11 +116,11 @@ AC_SUBST(LIBS_GROUP)
dnl DB_TYPE
AC_ARG_WITH(db-type,
AS_HELP_STRING([--with-db-type=TYPE],
- [.sort of database RT will use (default: mysql) (mysql, Pg, Oracle and SQLite are valid)]),
+ [.sort of database RT will use (default: mysql) (mysql, MariaDB Pg, Oracle and SQLite are valid)]),
DB_TYPE=$withval,
DB_TYPE=mysql)
-if test "$DB_TYPE" != 'mysql' -a "$DB_TYPE" != 'Pg' -a "$DB_TYPE" != 'SQLite' -a "$DB_TYPE" != 'Oracle' ; then
- AC_MSG_ERROR([Only Oracle, Pg, mysql and SQLite are valid db types])
+if test "$DB_TYPE" != 'mysql' -a "$DB_TYPE" != 'MariaDB' -a "$DB_TYPE" != 'Pg' -a "$DB_TYPE" != 'SQLite' -a "$DB_TYPE" != 'Oracle' ; then
+ AC_MSG_ERROR([.Only Oracle, Pg, mysql, MariaDB and SQLite are valid db types])
fi
AC_SUBST(DB_TYPE)

diff --git a/etc/RT_Config.pm.in b/etc/RT_Config.pm.in
index 3ac04ff28a..2308fcfe5b 100644
--- a/etc/RT_Config.pm.in
+++ b/etc/RT_Config.pm.in
@@ -193,7 +193,9 @@ Set( @StaticRoots, () );
=item C<$DatabaseType>

Database driver being used; case matters. Valid types are "mysql",
-"Oracle", and "Pg". "SQLite" is also available for non-production use.
+"MariaDB", "Oracle", and "Pg".
+
+"SQLite" is also available for non-production use.

=cut

diff --git a/lib/RT/Attachment.pm b/lib/RT/Attachment.pm
index 682ec9873d..f4ac50523e 100644
--- a/lib/RT/Attachment.pm
+++ b/lib/RT/Attachment.pm
@@ -160,6 +160,11 @@ sub Create {
# octets which later will be double encoded in low-level code
$head = Encode::decode( 'UTF-8', $head );

+ # DBD::MariaDB is very strict and accepts only unicode strings
+ if ( RT->Config->Get('DatabaseType') eq 'MariaDB' ) {
+ $head = Encode::encode( 'UTF-8', $head );
+ }
+
# If a message has no bodyhandle, that means that it has subparts (or appears to)
# and we should act accordingly.
unless ( defined $Attachment->bodyhandle ) {
diff --git a/lib/RT/Config.pm b/lib/RT/Config.pm
index 96a7994338..8acd18bb07 100644
--- a/lib/RT/Config.pm
+++ b/lib/RT/Config.pm
@@ -806,7 +806,7 @@ our %META;
$RT::Logger->error("Column for full-text index is set to Content, not tsvector column; disabling");
$v->{Enable} = $v->{Indexed} = 0;
}
- } elsif ($dbtype eq 'mysql') {
+ } elsif ($dbtype eq 'mysql' || $dbtype eq 'MariaDB') {
if (not $v->{'Table'}) {
$RT::Logger->error("No Table set for full-text index; disabling");
$v->{Enable} = $v->{Indexed} = 0;
diff --git a/lib/RT/Handle.pm b/lib/RT/Handle.pm
index 02e4667d7f..7189bf0e39 100644
--- a/lib/RT/Handle.pm
+++ b/lib/RT/Handle.pm
@@ -131,7 +131,7 @@ sub Connect {
= defined $ENV{RT_DATABASE_QUERY_TIMEOUT} && length $ENV{RT_DATABASE_QUERY_TIMEOUT}
? $ENV{RT_DATABASE_QUERY_TIMEOUT}
: RT->Config->Get('DatabaseQueryTimeout');
- if ( $db_type eq 'mysql' ) {
+ if ( $db_type eq 'mysql' || $db_type eq 'MariaDB' ) {
# set the character set
$self->dbh->do("SET NAMES 'utf8mb4'");
if ( defined $timeout && length $timeout ) {
@@ -234,7 +234,7 @@ sub SystemDSN {
my $db_type = RT->Config->Get('DatabaseType');

my $dsn = $self->DSN;
- if ( $db_type eq 'mysql' ) {
+ if ( $db_type eq 'mysql' || $db_type eq 'MariaDB' ) {
# with mysql, you want to connect sans database to funge things
$dsn =~ s/dbname=\Q$db_name//;
}
@@ -283,13 +283,13 @@ sub CheckCompatibility {
my $state = shift || 'post';

my $db_type = RT->Config->Get('DatabaseType');
- if ( $db_type eq "mysql" ) {
+ if ( $db_type eq "mysql" || $db_type eq 'MariaDB' ) {
# Check which version we're running
my $version = ($dbh->selectrow_array("show variables like 'version'"))[1];
return (0, "couldn't get version of the mysql server")
unless $version;

- # MySQL and MariaDB are both 'mysql' type.
+ # MySQL and MariaDB are different types, but share many of the same checks
# the minimum version supported is MySQL 5.7.7 / MariaDB 10.2.5
# the version string for MariaDB includes "MariaDB" in Debian/RedHat
my $is_mariadb = $version =~ m{mariadb}i ? 1 : 0;
@@ -301,15 +301,15 @@ sub CheckCompatibility {
return ( 0, "RT 5.0.0 is unsupported on MariaDB versions before $mariadb_min_version. Your version is $version.")
if $is_mariadb && cmp_version( $version, $mariadb_min_version ) < 0;

- # MySQL must have InnoDB support
+ # MySQL and MariaDB must have InnoDB support
local $dbh->{FetchHashKeyName} = 'NAME_lc';
my $innodb = lc($dbh->selectall_hashref("SHOW ENGINES", "engine")->{InnoDB}{support} || "no");
if ( $innodb eq "no" ) {
- return (0, "RT requires that MySQL be compiled with InnoDB table support.\n".
+ return (0, "RT requires that MySQL/MariaDB be compiled with InnoDB table support.\n".
"See <http://dev.mysql.com/doc/mysql/en/innodb-storage-engine.html>\n".
"and check that there are no 'skip-innodb' lines in your my.cnf.");
} elsif ( $innodb eq "disabled" ) {
- return (0, "RT requires that MySQL InnoDB table support be enabled.\n".
+ return (0, "RT requires that MySQL/MariaDB InnoDB table support be enabled.\n".
"Remove the 'skip-innodb' or 'innodb = OFF' line from your my.cnf file, restart MySQL, and try again.\n");
}

@@ -400,7 +400,7 @@ sub CreateDatabase {
elsif ( $db_type eq 'Pg' ) {
$status = $dbh->do("CREATE DATABASE $db_name WITH ENCODING='UNICODE' TEMPLATE template0");
}
- elsif ( $db_type eq 'mysql' ) {
+ elsif ( $db_type eq 'mysql' || $db_type eq 'MariaDB' ) {
$status = $dbh->do("CREATE DATABASE `$db_name` DEFAULT CHARACTER SET utf8");
}
else {
@@ -442,7 +442,7 @@ sub DropDatabase {
$path = "$RT::VarPath/$path" unless substr($path, 0, 1) eq '/';
unlink $path or return (0, "Couldn't remove '$path': $!");
return (1);
- } elsif ( $db_type eq 'mysql' ) {
+ } elsif ( $db_type eq 'mysql' || $db_type eq 'MariaDB' ) {
$dbh->do("DROP DATABASE `$db_name`")
or return (0, $DBI::errstr);
} else {
@@ -2020,7 +2020,7 @@ sub Indexes {
my $dbh = $self->dbh;

my $list;
- if ( $db_type eq 'mysql' ) {
+ if ( $db_type eq 'mysql' || $db_type eq 'MariaDB' ) {
$list = $dbh->selectall_arrayref(
'select distinct table_name, index_name from information_schema.statistics where table_schema = ?',
undef, scalar RT->Config->Get('DatabaseName')
@@ -2082,7 +2082,7 @@ sub IndexInfo {
Table => lc $args{'Table'},
Name => lc $args{'Name'},
);
- if ( $db_type eq 'mysql' ) {
+ if ( $db_type eq 'mysql' || $db_type eq 'MariaDB' ) {
my $list = $dbh->selectall_arrayref(
'select NON_UNIQUE, COLUMN_NAME, SUB_PART
from information_schema.statistics
@@ -2190,7 +2190,7 @@ sub DropIndex {
local $dbh->{'RaiseError'} = 0;

my $res;
- if ( $db_type eq 'mysql' ) {
+ if ( $db_type eq 'mysql' || $db_type eq 'MariaDB' ) {
$args{'Table'} = $self->_CanonicTableNameMysql( $args{'Table'} );
$res = $dbh->do(
'drop index '. $dbh->quote_identifier($args{'Name'}) ." on ". $dbh->quote_identifier($args{'Table'}),
diff --git a/lib/RT/Installer.pm b/lib/RT/Installer.pm
index 3ee011a01d..9dcaebe4d7 100644
--- a/lib/RT/Installer.pm
+++ b/lib/RT/Installer.pm
@@ -62,13 +62,14 @@ my %Meta = (
grep {
my $m = 'DBD::' . $_;
RT::StaticUtil::RequireModule($m) ? 1 : 0
- } qw/mysql Pg SQLite Oracle/
+ } qw/mysql MariaDB Pg SQLite Oracle/
],
ValuesLabel => {
- mysql => 'MySQL', #loc
- Pg => 'PostgreSQL', #loc
- SQLite => 'SQLite', #loc
- Oracle => 'Oracle', #loc
+ mysql => 'MySQL', #loc
+ MariaDB => 'MariaDB', #loc
+ Pg => 'PostgreSQL', #loc
+ SQLite => 'SQLite', #loc
+ Oracle => 'Oracle', #loc
},
},
},
diff --git a/lib/RT/Interface/Web/Handler.pm b/lib/RT/Interface/Web/Handler.pm
index e7c4caafca..bb5cda4a50 100644
--- a/lib/RT/Interface/Web/Handler.pm
+++ b/lib/RT/Interface/Web/Handler.pm
@@ -87,7 +87,7 @@ sub InitSessionDir {
# Activate the following if running httpd as root (the normal case).
# Resets ownership of all files created by Mason at startup.
# Note that mysql uses DB for sessions, so there's no need to do this.
- unless ( RT->Config->Get('DatabaseType') =~ /(?:mysql|Pg)/ ) {
+ unless ( RT->Config->Get('DatabaseType') =~ /(?:mysql|MariaDB|Pg)/ ) {

# Clean up our umask to protect session files
umask(0077);
diff --git a/lib/RT/Interface/Web/Session.pm b/lib/RT/Interface/Web/Session.pm
index 585ffd1b55..4eb84264e6 100644
--- a/lib/RT/Interface/Web/Session.pm
+++ b/lib/RT/Interface/Web/Session.pm
@@ -97,9 +97,10 @@ sessions class names as values.

sub Backends {
return {
- mysql => 'Apache::Session::MySQL',
- Pg => 'Apache::Session::Postgres',
- Oracle => 'Apache::Session::Oracle',
+ mysql => 'Apache::Session::MySQL',
+ MariaDB => 'Apache::Session::MySQL',
+ Pg => 'Apache::Session::Postgres',
+ Oracle => 'Apache::Session::Oracle',
};
}

diff --git a/lib/RT/Record.pm b/lib/RT/Record.pm
index 3a87daf590..c45e800840 100644
--- a/lib/RT/Record.pm
+++ b/lib/RT/Record.pm
@@ -806,7 +806,6 @@ sub _EncodeLOB {
$Body = MIME::QuotedPrint::encode($Body);
}

-
return ($ContentEncoding, $Body, $MIMEType, $Filename, $note_args );
}

diff --git a/lib/RT/Tickets.pm b/lib/RT/Tickets.pm
index 275fe6653a..499e892b0f 100644
--- a/lib/RT/Tickets.pm
+++ b/lib/RT/Tickets.pm
@@ -1023,7 +1023,7 @@ sub _TransContentLimit {
QUOTEVALUE => 0,
);
}
- elsif ( $db_type eq 'mysql' and not $config->{Sphinx}) {
+ elsif ( ($db_type eq 'mysql' || $db_type eq 'MariaDB') and not $config->{Sphinx}) {
my $dbh = $RT::Handle->dbh;
$self->Limit(
%rest,
@@ -1045,7 +1045,7 @@ sub _TransContentLimit {
QUOTEVALUE => 0,
);
}
- elsif ( $db_type eq 'mysql' ) {
+ elsif ( $db_type eq 'mysql' || $db_type eq 'MariaDB' ) {
# XXX: We could theoretically skip the join to Attachments,
# and have Sphinx simply index and group by the TicketId,
# and join Ticket.id to that attribute, which would be much
diff --git a/lib/RT/Transactions.pm b/lib/RT/Transactions.pm
index e03d2995a8..7544cf4144 100644
--- a/lib/RT/Transactions.pm
+++ b/lib/RT/Transactions.pm
@@ -767,7 +767,7 @@ sub _AttachContentLimit {
QUOTEVALUE => 0,
);
}
- elsif ( $db_type eq 'mysql' and not $config->{Sphinx}) {
+ elsif ( ($db_type eq 'mysql' || $db_type eq 'MariaDB') and not $config->{Sphinx}) {
my $dbh = $RT::Handle->dbh;
$self->Limit(
%rest,
@@ -789,7 +789,7 @@ sub _AttachContentLimit {
QUOTEVALUE => 0,
);
}
- elsif ( $db_type eq 'mysql' ) {
+ elsif ( $db_type eq 'mysql' || $db_type eq 'MariaDB' ) {
# This is a special character. Note that \ does not escape
# itself (in Sphinx 2.1.0, at least), so 'foo\;bar' becoming
# 'foo\\;bar' is not a vulnerability, and is still parsed as
diff --git a/t/api/attachment.t b/t/api/attachment.t
index 0619c6b03c..552f9de517 100644
--- a/t/api/attachment.t
+++ b/t/api/attachment.t
@@ -65,6 +65,7 @@ is ($#headers, 2, "testing a bunch of singline multiple headers" );
);
}

+
diag 'Test clearing and replacing header and content in attachments table';
{
my $queue = RT::Test->load_or_create_queue( Name => 'General' );
diff --git a/t/api/db_indexes.t b/t/api/db_indexes.t
index fbc205d9ac..1e72e539db 100644
--- a/t/api/db_indexes.t
+++ b/t/api/db_indexes.t
@@ -47,7 +47,7 @@ note "test handle->DropIndexIfExists method";

note "test handle->IndexInfo method";
{
- if ($db_type ne 'Oracle' && $db_type ne 'mysql') {
+ if ($db_type ne 'Oracle' && $db_type ne 'mysql' && $db_type ne 'MariaDB') {
my %res = $handle->IndexInfo( Table => 'Attachments', Name => 'Attachments1' );
is_deeply(
\%res,
diff --git a/t/api/template.t b/t/api/template.t
index 1baac44b60..b02f114717 100644
--- a/t/api/template.t
+++ b/t/api/template.t
@@ -1,4 +1,4 @@
-
+use utf8;
use warnings;
use strict;

@@ -22,12 +22,12 @@ ok $alt_queue && $alt_queue->id, 'loaded or created queue';
my ($val,$msg) = $template->Create(
Queue => $queue->id,
Name => 'Test',
- Content => 'This is template content'
+ Content => 'This is template content with ????'
);
ok $val, "created a template" or diag "error: $msg";
ok my $id = $template->id, "id is defined";
is $template->Name, 'Test';
- is $template->Content, 'This is template content', "We created the object right";
+ is $template->Content, 'This is template content with ????', "We created the object right";

($val, $msg) = $template->SetContent( 'This is new template content');
ok $val, "changed content" or diag "error: $msg";

-----------------------------------------------------------------------


hooks/post-receive
--
rt
_______________________________________________
rt-commit mailing list
rt-commit@lists.bestpractical.com
https://lists.bestpractical.com/mailman/listinfo/rt-commit