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

BPS Git Server git at git.bestpractical.com
Wed Jan 17 19:32:02 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  12783930e17f8e4daf9750c9d832704c43d0d802 (commit)

- Log -----------------------------------------------------------------
commit 12783930e17f8e4daf9750c9d832704c43d0d802
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/etc/acl.MariaDB b/etc/acl.MariaDB
new file mode 100644
index 0000000000..da148bde66
--- /dev/null
+++ b/etc/acl.MariaDB
@@ -0,0 +1,38 @@
+
+sub acl {
+    my $dbh = shift;
+    my $db_name = RT->Config->Get('DatabaseName');
+    my $db_rthost = RT->Config->Get('DatabaseRTHost');
+    my $db_user = RT->Config->Get('DatabaseUser');
+    my $db_pass = RT->Config->Get('DatabasePassword');
+    unless ( $db_user ) {
+        RT->Logger->warn("DatabaseUser option is not defined or empty. Skipping...");
+        return;
+    }
+    if ( $db_user eq 'root' ) {
+        RT->Logger->warn("DatabaseUser is root. Skipping...");
+        return;
+    }
+    $db_name =~ s/([_%\\])/\\$1/g;
+
+    if ( my $version = ( $dbh->selectrow_array("show variables like 'version'") )[1] ) {
+        if ( $version !~ /mariadb/i && $version =~ /^(\d+)\./ ) {
+            # run 2 part acl update for mysql 8 or higher
+            if ( $1 >= 8 ) {
+                return (
+                    "CREATE USER IF NOT EXISTS '$db_user'\@'$db_rthost' IDENTIFIED BY '$db_pass';",
+                    "GRANT SELECT,INSERT,CREATE,INDEX,UPDATE,DELETE ON `$db_name`.* TO '$db_user'\@'$db_rthost';",
+                );
+            }
+        }
+    }
+
+    return (
+        "GRANT SELECT,INSERT,CREATE,INDEX,UPDATE,DELETE
+               ON `$db_name`.*
+               TO '$db_user'\@'$db_rthost'
+               IDENTIFIED BY '$db_pass';",
+    );
+}
+
+1;
diff --git a/etc/schema.MariaDB b/etc/schema.MariaDB
new file mode 100644
index 0000000000..382a10fc43
--- /dev/null
+++ b/etc/schema.MariaDB
@@ -0,0 +1,616 @@
+
+CREATE TABLE Attachments (
+  id BIGINT NOT NULL  AUTO_INCREMENT,
+  TransactionId BIGINT NOT NULL  ,
+  Parent BIGINT NOT NULL DEFAULT 0  ,
+  MessageId varchar(160) CHARACTER SET ascii NULL  ,
+  Subject varchar(255) NULL  ,
+  Filename varchar(255) NULL  ,
+  ContentType varchar(80) CHARACTER SET ascii NULL  ,
+  ContentEncoding varchar(80) CHARACTER SET ascii NULL  ,
+  Content LONGBLOB NULL  ,
+  Headers LONGTEXT NULL  ,
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE INDEX Attachments2 ON Attachments (TransactionId) ;
+CREATE INDEX Attachments3 ON Attachments (Parent, TransactionId) ;
+CREATE INDEX Attachments4 ON Attachments (Filename) ;
+
+CREATE TABLE Queues (
+  id INTEGER NOT NULL  AUTO_INCREMENT,
+  Name varchar(200) NOT NULL  ,
+  Description varchar(255) NULL  ,
+  CorrespondAddress varchar(120) NULL,
+  CommentAddress varchar(120) NULL,
+  Lifecycle varchar(32) NULL,
+  SubjectTag varchar(120) NULL,
+  SortOrder integer NOT NULL DEFAULT 0 ,
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NOT NULL DEFAULT 0  ,
+  LastUpdated DATETIME NULL  ,
+  SLADisabled int2 NOT NULL DEFAULT 1 ,
+  Disabled int2 NOT NULL DEFAULT 0 ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE UNIQUE INDEX Queues1 ON Queues (Name) ;
+CREATE INDEX Queues2 ON Queues (Disabled) ;
+
+
+
+CREATE TABLE Links (
+  id INTEGER NOT NULL  AUTO_INCREMENT,
+  Base varchar(240) NULL,
+  Target varchar(240) NULL,
+  Type varchar(20) CHARACTER SET ascii NOT NULL ,
+  LocalTarget integer NOT NULL DEFAULT 0  ,
+  LocalBase integer NOT NULL DEFAULT 0  ,
+  LastUpdatedBy integer NOT NULL DEFAULT 0  ,
+  LastUpdated DATETIME NULL  ,
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE INDEX Links1 ON Links (Base);
+CREATE INDEX Links2 ON Links (Target);
+CREATE INDEX Links3 ON Links (LocalBase);
+CREATE INDEX Links4 ON Links (LocalTarget);
+CREATE INDEX Links5 ON Links (Type);
+
+
+
+CREATE TABLE Principals (
+        id INTEGER  AUTO_INCREMENT not null,
+        PrincipalType VARCHAR(16) not null,
+        Disabled int2 NOT NULL DEFAULT 0 ,
+        PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+
+CREATE TABLE `Groups` (
+  id INTEGER NOT NULL  AUTO_INCREMENT,
+  Name varchar(200) NULL  ,
+  Description varchar(255) NULL  ,
+  Domain varchar(64) CHARACTER SET ascii NULL,
+  Instance integer,
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NOT NULL DEFAULT 0  ,
+  LastUpdated DATETIME NULL  ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE INDEX Groups1 ON `Groups` (Domain, Name, Instance);
+CREATE INDEX Groups2 On `Groups` (Instance);
+
+CREATE TABLE ScripConditions (
+  id INTEGER NOT NULL  AUTO_INCREMENT,
+  Name varchar(200) NULL  ,
+  Description varchar(255) NULL  ,
+  ExecModule varchar(60) CHARACTER SET ascii NULL,
+  Argument VARBINARY(255) NULL  ,
+  ApplicableTransTypes varchar(60) CHARACTER SET ascii NULL  ,
+
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NOT NULL DEFAULT 0  ,
+  LastUpdated DATETIME NULL  ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+
+CREATE TABLE Transactions (
+  id BIGINT NOT NULL  AUTO_INCREMENT,
+  ObjectType varchar(64) CHARACTER SET ascii NOT NULL,
+  ObjectId integer NOT NULL DEFAULT 0  ,
+  TimeTaken integer NOT NULL DEFAULT 0  ,
+  Type varchar(20) CHARACTER SET ascii NULL,
+  Field varchar(255) CHARACTER SET ascii NULL,
+  OldValue varchar(255) NULL  ,
+  NewValue varchar(255) NULL  ,
+  ReferenceType varchar(255) CHARACTER SET ascii NULL,
+  OldReference integer NULL  ,
+  NewReference integer NULL  ,
+  Data varchar(255) NULL  ,
+
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE INDEX Transactions1 ON Transactions (ObjectType, ObjectId);
+
+
+
+CREATE TABLE Scrips (
+  id INTEGER NOT NULL  AUTO_INCREMENT,
+  Description varchar(255),
+  ScripCondition integer NOT NULL DEFAULT 0  ,
+  ScripAction integer NOT NULL DEFAULT 0  ,
+  CustomIsApplicableCode text NULL  ,
+  CustomPrepareCode text NULL  ,
+  CustomCommitCode text NULL  ,
+  Disabled int2 NOT NULL DEFAULT 0 ,
+  Template varchar(200) NOT NULL  ,
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NOT NULL DEFAULT 0  ,
+  LastUpdated DATETIME NULL  ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE TABLE ObjectScrips (
+  id INTEGER NOT NULL  AUTO_INCREMENT,
+  Scrip integer NOT NULL  ,
+  Stage varchar(32) CHARACTER SET ascii NOT NULL DEFAULT 'TransactionCreate',
+  ObjectId integer NOT NULL,
+  SortOrder integer NOT NULL DEFAULT 0  ,
+
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NOT NULL DEFAULT 0  ,
+  LastUpdated DATETIME NULL  ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE UNIQUE INDEX ObjectScrips1 ON ObjectScrips (ObjectId, Scrip);
+
+CREATE TABLE ACL (
+  id INTEGER NOT NULL  AUTO_INCREMENT,
+  PrincipalType varchar(25) CHARACTER SET ascii NOT NULL, #"User" "Group", "Owner", "Cc" "AdminCc", "Requestor"
+
+  PrincipalId integer NOT NULL DEFAULT 0 , #Foreign key to principals
+  RightName varchar(25) CHARACTER SET ascii NOT NULL,
+  ObjectType varchar(25) CHARACTER SET ascii NOT NULL,
+  ObjectId integer NOT NULL default 0,
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NOT NULL DEFAULT 0  ,
+  LastUpdated DATETIME NULL  ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE INDEX  ACL1 on ACL(RightName, ObjectType, ObjectId,PrincipalType,PrincipalId);
+
+
+
+CREATE TABLE GroupMembers (
+  id INTEGER NOT NULL AUTO_INCREMENT,
+  GroupId integer NOT NULL DEFAULT 0,
+  MemberId integer NOT NULL DEFAULT 0,  #Foreign key to Principals
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NOT NULL DEFAULT 0  ,
+  LastUpdated DATETIME NULL  ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+CREATE UNIQUE INDEX GroupMembers1 on GroupMembers (GroupId, MemberId);
+
+
+
+
+create table CachedGroupMembers (
+        id int auto_increment,
+        GroupId int, # foreign key to Principals
+        MemberId int, # foreign key to Principals
+        Via int, #foreign key to CachedGroupMembers. (may point to $self->id)
+        ImmediateParentId int, #foreign key to prinicpals.
+                               # this points to the group that the member is
+                               # a member of, for ease of deletes.
+        Disabled int2 NOT NULL DEFAULT 0 , # if this cached group member is a member of this group by way of a disabled
+                                           # group or this group is disabled, this will be set to 1
+                                           # this allows us to not find members of disabled subgroups when listing off
+                                           # group members recursively.
+                                           # Also, this allows us to have the ACL system elide members of disabled groups
+        PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE INDEX DisGrouMem  on CachedGroupMembers (GroupId,MemberId,Disabled);
+CREATE INDEX CachedGroupMembers2 on CachedGroupMembers (MemberId, GroupId, Disabled);
+CREATE INDEX CachedGroupMembers3 on CachedGroupMembers (MemberId, ImmediateParentId);
+
+
+
+CREATE TABLE Users (
+  id INTEGER NOT NULL  AUTO_INCREMENT,
+  Name varchar(200) NOT NULL  ,
+  Password VARCHAR(256) NULL  ,
+  AuthToken VARCHAR(16) CHARACTER SET ascii NULL  ,
+  Comments TEXT NULL  ,
+  Signature TEXT NULL  ,
+  EmailAddress varchar(120) NULL  ,
+  FreeformContactInfo TEXT NULL  ,
+  Organization varchar(200) NULL  ,
+  RealName varchar(120) NULL  ,
+  NickName varchar(16) NULL  ,
+  Lang varchar(16) NULL  ,
+  Gecos varchar(16) NULL  ,
+  HomePhone varchar(30) NULL  ,
+  WorkPhone varchar(30) NULL  ,
+  MobilePhone varchar(30) NULL  ,
+  PagerPhone varchar(30) NULL  ,
+  Address1 varchar(200) NULL  ,
+  Address2 varchar(200) NULL  ,
+  City varchar(100) NULL  ,
+  State varchar(100) NULL  ,
+  Zip varchar(16) NULL  ,
+  Country varchar(50) NULL  ,
+  Timezone varchar(50) NULL  ,
+  SMIMECertificate text NULL,
+
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NOT NULL DEFAULT 0  ,
+  LastUpdated DATETIME NULL  ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+
+CREATE UNIQUE INDEX Users1 ON Users (Name) ;
+CREATE INDEX Users4 ON Users (EmailAddress);
+
+
+
+
+CREATE TABLE Tickets (
+  id INTEGER NOT NULL  AUTO_INCREMENT,
+  EffectiveId integer NOT NULL DEFAULT 0  ,
+  IsMerged int2 NULL DEFAULT NULL,
+  Queue integer NOT NULL DEFAULT 0  ,
+  Type varchar(16) CHARACTER SET ascii NULL  ,
+  Owner integer NOT NULL DEFAULT 0  ,
+  Subject varchar(200) NULL DEFAULT '[no subject]' ,
+  InitialPriority integer NOT NULL DEFAULT 0  ,
+  FinalPriority integer NOT NULL DEFAULT 0  ,
+  Priority integer NOT NULL DEFAULT 0  ,
+  TimeEstimated integer NOT NULL DEFAULT 0  ,
+  TimeWorked integer NOT NULL DEFAULT 0  ,
+  Status varchar(64) NULL  ,
+  SLA varchar(64) NULL  ,
+  TimeLeft integer NOT NULL DEFAULT 0  ,
+  Told DATETIME NULL  ,
+  Starts DATETIME NULL  ,
+  Started DATETIME NULL  ,
+  Due DATETIME NULL  ,
+  Resolved DATETIME NULL  ,
+
+
+  LastUpdatedBy integer NOT NULL DEFAULT 0  ,
+  LastUpdated DATETIME NULL  ,
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE INDEX Tickets1 ON Tickets (Queue, Status) ;
+CREATE INDEX Tickets2 ON Tickets (Owner) ;
+CREATE INDEX Tickets6 ON Tickets (EffectiveId, Type) ;
+
+
+
+CREATE TABLE ScripActions (
+  id INTEGER NOT NULL  AUTO_INCREMENT,
+  Name varchar(200) NULL  ,
+  Description varchar(255) NULL  ,
+  ExecModule varchar(60) CHARACTER SET ascii NULL,
+  Argument VARBINARY(255) NULL  ,
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NOT NULL DEFAULT 0  ,
+  LastUpdated DATETIME NULL  ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+
+
+CREATE TABLE Templates (
+  id INTEGER NOT NULL  AUTO_INCREMENT,
+  Queue integer NOT NULL DEFAULT 0 ,
+  Name varchar(200) NOT NULL  ,
+  Description varchar(255) NULL  ,
+  Type varchar(16) CHARACTER SET ascii NULL  ,
+  Content TEXT NULL  ,
+  LastUpdated DATETIME NULL  ,
+  LastUpdatedBy integer NOT NULL DEFAULT 0  ,
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+
+
+CREATE TABLE ObjectCustomFieldValues (
+  id INTEGER NOT NULL  AUTO_INCREMENT,
+  CustomField int NOT NULL  ,
+  ObjectType varchar(255) CHARACTER SET ascii NOT NULL,     # Final target of the Object
+  ObjectId BIGINT NOT NULL  ,                  # New -- Replaces Ticket
+  SortOrder integer NOT NULL DEFAULT 0  ,   # New -- ordering for multiple values
+
+  Content varchar(255) NULL  ,
+  LargeContent LONGBLOB NULL,               # New -- to hold 255+ strings
+  ContentType varchar(80) CHARACTER SET ascii NULL,                 # New -- only text/* gets searched
+  ContentEncoding varchar(80) CHARACTER SET ascii NULL  ,           # New -- for binary Content
+
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NOT NULL DEFAULT 0  ,
+  LastUpdated DATETIME NULL  ,
+  Disabled int2 NOT NULL DEFAULT 0 ,        # New -- whether the value was current
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE INDEX ObjectCustomFieldValues1 ON ObjectCustomFieldValues (Content);
+CREATE INDEX ObjectCustomFieldValues2 ON ObjectCustomFieldValues (CustomField,ObjectType,ObjectId);
+CREATE INDEX ObjectCustomFieldValues3 ON ObjectCustomFieldValues (SortOrder);
+
+
+
+CREATE TABLE CustomFields (
+  id INTEGER NOT NULL  AUTO_INCREMENT,
+  Name varchar(200) NULL  ,
+  Type varchar(200) CHARACTER SET ascii NULL  , # Changed -- 'Single' and 'Multiple' is moved out
+  RenderType varchar(64) CHARACTER SET ascii NULL  ,
+  MaxValues integer,            # New -- was 'Single'(1) and 'Multiple'(0)
+  Pattern TEXT NULL  ,  # New -- Must validate against this
+  BasedOn INTEGER NULL,
+  ValuesClass varchar(64) CHARACTER SET ascii NULL  ,
+  Description varchar(255) NULL  ,
+  SortOrder integer NOT NULL DEFAULT 0  ,
+  LookupType varchar(255) CHARACTER SET ascii NOT NULL,
+  EntryHint varchar(255) NULL,
+  ValidationHint varchar(255) NULL,
+  UniqueValues int2 NOT NULL DEFAULT 0 ,
+  CanonicalizeClass varchar(64) CHARACTER SET ascii NULL  ,
+
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NOT NULL DEFAULT 0  ,
+  LastUpdated DATETIME NULL  ,
+  Disabled int2 NOT NULL DEFAULT 0 ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+
+
+CREATE TABLE ObjectCustomFields (
+  id INTEGER NOT NULL  AUTO_INCREMENT,
+  CustomField integer NOT NULL  ,
+  ObjectId integer NOT NULL,
+  SortOrder integer NOT NULL DEFAULT 0  ,
+
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NOT NULL DEFAULT 0  ,
+  LastUpdated DATETIME NULL  ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE INDEX ObjectCustomFields1 ON ObjectCustomFields (ObjectId);
+
+
+
+CREATE TABLE CustomFieldValues (
+  id INTEGER NOT NULL  AUTO_INCREMENT,
+  CustomField int NOT NULL  ,
+  Name varchar(200) NULL  ,
+  Description varchar(255) NULL  ,
+  SortOrder integer NOT NULL DEFAULT 0  ,
+  Category VARCHAR(255) NULL,
+
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NOT NULL DEFAULT 0  ,
+  LastUpdated DATETIME NULL  ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE INDEX CustomFieldValues1 ON CustomFieldValues (CustomField);
+
+
+
+
+CREATE TABLE Attributes (
+  id INTEGER NOT NULL  AUTO_INCREMENT,
+  Name varchar(255) NULL  ,
+  Description varchar(255) NULL  ,
+  Content LONGBLOB,
+  ContentType varchar(16) CHARACTER SET ascii,
+  ObjectType varchar(64) CHARACTER SET ascii,
+  ObjectId integer, # foreign key to anything
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NOT NULL DEFAULT 0  ,
+  LastUpdated DATETIME NULL  ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE INDEX Attributes1 on Attributes(Name);
+CREATE INDEX Attributes2 on Attributes(ObjectType, ObjectId);
+
+
+
+# sessions is used by Apache::Session to keep sessions in the database.
+# We should have a reaper script somewhere.
+
+CREATE TABLE sessions (
+    id char(32) NOT NULL,
+    a_session LONGBLOB,
+    LastUpdated TIMESTAMP,
+    PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE TABLE Classes (
+  id int(11) NOT NULL auto_increment,
+  Name varchar(255) NOT NULL default '',
+  Description varchar(255) NOT NULL default '',
+  SortOrder int(11) NOT NULL default '0',
+  Disabled int(2) NOT NULL default '0',
+  Creator int(11) NOT NULL default '0',
+  Created datetime default NULL,
+  LastUpdatedBy int(11) NOT NULL default '0',
+  LastUpdated datetime default NULL,
+  PRIMARY KEY  (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE TABLE Articles (
+  id int(11) NOT NULL auto_increment,
+  Name varchar(255) NOT NULL default '',
+  Summary varchar(255) NOT NULL default '',
+  SortOrder int(11) NOT NULL default '0',
+  Class int(11) NOT NULL default '0',
+  Parent int(11) NOT NULL default '0',
+  URI varchar(255) character set ascii default NULL,
+  Disabled int(2) NOT NULL default '0',
+  Creator int(11) NOT NULL default '0',
+  Created datetime default NULL,
+  LastUpdatedBy int(11) NOT NULL default '0',
+  LastUpdated datetime default NULL,
+  PRIMARY KEY  (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE TABLE Topics (
+  id int(11) NOT NULL auto_increment,
+  Parent int(11) NOT NULL default '0',
+  Name varchar(255) NOT NULL default '',
+  Description varchar(255) NOT NULL default '',
+  ObjectType varchar(64) character set ascii NOT NULL default '',
+  ObjectId int(11) NOT NULL default '0',
+  PRIMARY KEY  (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE TABLE ObjectTopics (
+  id int(11) NOT NULL auto_increment,
+  Topic int(11) NOT NULL default '0',
+  ObjectType varchar(64) character set ascii NOT NULL default '',
+  ObjectId int(11) NOT NULL default '0',
+  PRIMARY KEY  (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE TABLE ObjectClasses (
+  id int(11) NOT NULL auto_increment,
+  Class int(11) NOT NULL default '0',
+  ObjectType varchar(255) character set ascii NOT NULL default '',
+  ObjectId int(11) NOT NULL default '0',
+  Creator int(11) NOT NULL default '0',
+  Created datetime default NULL,
+  LastUpdatedBy int(11) NOT NULL default '0',
+  LastUpdated datetime default NULL,
+  PRIMARY KEY  (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE TABLE Assets (
+    id                int(11)         NOT NULL AUTO_INCREMENT,
+    Name              varchar(255)    NOT NULL DEFAULT '',
+    Catalog           int(11)         NOT NULL DEFAULT 0,
+    Status            varchar(64)     NOT NULL DEFAULT '',
+    Description       varchar(255)    NOT NULL DEFAULT '',
+    Creator           int(11)         NOT NULL DEFAULT 0,
+    Created           datetime                 DEFAULT NULL,
+    LastUpdatedBy     int(11)         NOT NULL DEFAULT 0,
+    LastUpdated       datetime                 DEFAULT NULL,
+    PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE INDEX AssetsName ON Assets (Name);
+CREATE INDEX AssetsStatus ON Assets (Status);
+CREATE INDEX AssetsCatalog ON Assets (Catalog);
+
+CREATE TABLE Catalogs (
+    id                int(11)         NOT NULL AUTO_INCREMENT,
+    Name              varchar(255)    NOT NULL DEFAULT '',
+    Lifecycle         varchar(32)     NOT NULL DEFAULT 'assets',
+    Description       varchar(255)    NOT NULL DEFAULT '',
+    Disabled          int2            NOT NULL DEFAULT 0,
+    Creator           int(11)         NOT NULL DEFAULT 0,
+    Created           datetime                 DEFAULT NULL,
+    LastUpdatedBy     int(11)         NOT NULL DEFAULT 0,
+    LastUpdated       datetime                 DEFAULT NULL,
+    PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE INDEX CatalogsName ON Catalogs (Name);
+CREATE INDEX CatalogsDisabled ON Catalogs (Disabled);
+
+CREATE TABLE CustomRoles (
+  id INTEGER NOT NULL  AUTO_INCREMENT,
+  Name varchar(200) NULL  ,
+  Description varchar(255) NULL  ,
+  MaxValues integer,
+  EntryHint varchar(255) NULL  ,
+  LookupType varchar(255) CHARACTER SET ascii NOT NULL,
+
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NOT NULL DEFAULT 0  ,
+  LastUpdated DATETIME NULL  ,
+  Disabled int2 NOT NULL DEFAULT 0 ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE TABLE ObjectCustomRoles (
+  id INTEGER NOT NULL  AUTO_INCREMENT,
+  CustomRole integer NOT NULL  ,
+  ObjectId integer NOT NULL,
+  SortOrder integer NOT NULL DEFAULT 0  ,
+
+  Creator integer NOT NULL DEFAULT 0  ,
+  Created DATETIME NULL  ,
+  LastUpdatedBy integer NOT NULL DEFAULT 0  ,
+  LastUpdated DATETIME NULL  ,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE UNIQUE INDEX ObjectCustomRoles1 ON ObjectCustomRoles (ObjectId, CustomRole);
+
+CREATE TABLE Configurations (
+    id                int(11)         NOT NULL AUTO_INCREMENT,
+    Name              varchar(255)    NOT NULL,
+    Content           longblob        NULL,
+    ContentType       varchar(80)     CHARACTER SET ascii NULL,
+    Disabled          int2            NOT NULL DEFAULT 0,
+    Creator           int(11)         NOT NULL DEFAULT 0,
+    Created           datetime                 DEFAULT NULL,
+    LastUpdatedBy     int(11)         NOT NULL DEFAULT 0,
+    LastUpdated       datetime                 DEFAULT NULL,
+    PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE INDEX Configurations1 ON Configurations (Name, Disabled);
+CREATE INDEX Configurations2 ON Configurations (Disabled);
+
+CREATE TABLE AuthTokens (
+    id                int(11)         NOT NULL AUTO_INCREMENT,
+    Owner             int(11)         NOT NULL DEFAULT 0,
+    Token             varchar(256)    NULL,
+    Description       varchar(255)    NOT NULL DEFAULT '',
+    LastUsed          datetime                 DEFAULT NULL,
+    Creator           int(11)         NOT NULL DEFAULT 0,
+    Created           datetime                 DEFAULT NULL,
+    LastUpdatedBy     int(11)         NOT NULL DEFAULT 0,
+    LastUpdated       datetime                 DEFAULT NULL,
+    Expires           datetime                 DEFAULT NULL,
+    PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE INDEX AuthTokensOwner ON AuthTokens (Owner);
+
+CREATE TABLE Shorteners (
+  id             INTEGER     NOT NULL AUTO_INCREMENT,
+  Code           VARCHAR(40) NOT NULL,
+  Content        LONGTEXT    NOT NULL,
+  Permanent      INT2        NOT NULL DEFAULT 0,
+  Creator        INTEGER     NOT NULL DEFAULT 0,
+  Created        DATETIME    NULL,
+  LastUpdatedBy  INTEGER     NULL DEFAULT 0,
+  LastUpdated    DATETIME    NULL,
+  LastAccessedBy INTEGER     NULL DEFAULT 0,
+  LastAccessed   DATETIME    NULL,
+  PRIMARY KEY (id)
+) ENGINE=InnoDB CHARACTER SET utf8mb4;
+
+CREATE UNIQUE INDEX Shorteners1 ON Shorteners(Code);
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