[Rt-commit] rt branch 5.0/db-type-mariadb created. rt-5.0.5-114-geb873f1880

BPS Git Server git at git.bestpractical.com
Tue Jan 16 16:21:00 UTC 2024


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 at 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


More information about the rt-commit mailing list