From 3f8be182648e90a71d9dc2f0492ab79758c7737f Mon Sep 17 00:00:00 2001
From: Guus der Kinderen
Date: Fri, 3 Apr 2026 15:34:12 +0200
Subject: [PATCH] OF-3239: Add MariaDB as a first-class supported database
MariaDB was previously handled implicitly by mapping it to DatabaseType.mysql in DbConnectionManager.setMetaData() and sharing all MySQL SQL scripts. This commit gives MariaDB its own identity throughout the codebase.
This adds a copy of the Mysql install and upgrade script under the 'mariadb' name, ensuring that any existing MariaDB installation that was previously running under the Mysql type can continue to upgrade through any path.
Introduces two new CI jobs (mariadb-install and mariadb-upgrade) that mirror the structure of the existing mysql-install and mysql-upgrade jobs, giving MariaDB the same level of automated testing as other supported databases.
Update documentation to reflect MariaDB as a first-class database.
---
.../continuous-integration-workflow.yml | 89 +++-
build/ci/compose/mariadb.yml | 17 +
build/ci/updater/pom.xml | 5 +
.../src/database/openfire_mariadb.sql | 384 ++++++++++++++++++
.../database/upgrade/1/openfire_mariadb.sql | 55 +++
.../database/upgrade/10/openfire_mariadb.sql | 8 +
.../database/upgrade/11/openfire_mariadb.sql | 9 +
.../database/upgrade/12/openfire_mariadb.sql | 4 +
.../database/upgrade/13/openfire_mariadb.sql | 16 +
.../database/upgrade/14/openfire_mariadb.sql | 7 +
.../database/upgrade/15/openfire_mariadb.sql | 12 +
.../database/upgrade/16/openfire_mariadb.sql | 14 +
.../database/upgrade/17/openfire_mariadb.sql | 116 ++++++
.../database/upgrade/18/openfire_mariadb.sql | 5 +
.../database/upgrade/19/openfire_mariadb.sql | 135 ++++++
.../database/upgrade/2/openfire_mariadb.sql | 42 ++
.../database/upgrade/20/openfire_mariadb.sql | 5 +
.../database/upgrade/21/openfire_mariadb.sql | 3 +
.../database/upgrade/22/openfire_mariadb.sql | 7 +
.../database/upgrade/23/openfire_mariadb.sql | 2 +
.../database/upgrade/24/openfire_mariadb.sql | 3 +
.../database/upgrade/25/openfire_mariadb.sql | 7 +
.../database/upgrade/26/openfire_mariadb.sql | 4 +
.../database/upgrade/27/openfire_mariadb.sql | 4 +
.../database/upgrade/28/openfire_mariadb.sql | 3 +
.../database/upgrade/29/openfire_mariadb.sql | 5 +
.../database/upgrade/30/openfire_mariadb.sql | 3 +
.../database/upgrade/31/openfire_mariadb.sql | 13 +
.../database/upgrade/32/openfire_mariadb.sql | 6 +
.../database/upgrade/33/openfire_mariadb.sql | 3 +
.../database/upgrade/34/openfire_mariadb.sql | 3 +
.../database/upgrade/35/openfire_mariadb.sql | 3 +
.../database/upgrade/36/openfire_mariadb.sql | 12 +
.../database/upgrade/37/openfire_mariadb.sql | 3 +
.../database/upgrade/38/openfire_mariadb.sql | 28 ++
.../database/upgrade/4/openfire_mariadb.sql | 6 +
.../database/upgrade/5/openfire_mariadb.sql | 13 +
.../database/upgrade/6/openfire_mariadb.sql | 13 +
.../database/upgrade/7/openfire_mariadb.sql | 101 +++++
.../database/upgrade/8/openfire_mariadb.sql | 25 ++
.../database/upgrade/9/openfire_mariadb.sql | 18 +
documentation/database.html | 99 ++++-
documentation/db-clustering-guide.html | 3 +
documentation/migration-blowfish-pbkdf2.html | 4 +
xmppserver/pom.xml | 5 +
.../database/DbConnectionManager.java | 8 +-
46 files changed, 1323 insertions(+), 7 deletions(-)
create mode 100644 build/ci/compose/mariadb.yml
create mode 100644 distribution/src/database/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/1/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/10/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/11/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/12/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/13/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/14/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/15/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/16/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/17/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/18/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/19/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/2/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/20/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/21/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/22/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/23/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/24/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/25/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/26/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/27/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/28/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/29/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/30/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/31/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/32/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/33/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/34/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/35/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/36/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/37/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/38/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/4/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/5/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/6/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/7/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/8/openfire_mariadb.sql
create mode 100644 distribution/src/database/upgrade/9/openfire_mariadb.sql
diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml
index b6bd796554..0b92d50255 100644
--- a/.github/workflows/continuous-integration-workflow.yml
+++ b/.github/workflows/continuous-integration-workflow.yml
@@ -350,7 +350,7 @@ jobs:
set -e
CODE_SAYS=$(grep 'int DATABASE_VERSION =' xmppserver/src/main/java/org/jivesoftware/database/SchemaManager.java | sed -e 's/.*= //' -e 's/;//')
NEXT=$((CODE_SAYS + 1))
- for dbname in db2 hsqldb mysql oracle postgresql sqlserver sybase; do
+ for dbname in db2 hsqldb mariadb mysql oracle postgresql sqlserver sybase; do
# Ensure that a file exists for CODE_SAYS
if [ ! -f distribution/src/database/upgrade/${CODE_SAYS}/openfire_${dbname}.sql ]; then
echo "ERROR: Expected to find a database upgrade script for ${dbname} and version ${CODE_SAYS}, but no such file exists."
@@ -684,6 +684,87 @@ jobs:
./mvnw -B clean package exec:java -Dexec.args="$GITHUB_WORKSPACE"
+ mariadb-install:
+ name: Test MariaDB install script
+ needs: [build, should-do-database-tests, check_branch]
+ runs-on: ubuntu-latest
+ if: ${{ needs.should-do-database-tests.outputs.check == 'true' || needs.check_branch.outputs.is_publishable_branch == 'true'}}
+ steps:
+ - name: Checkout Openfire
+ uses: actions/checkout@v6
+ - name: Set up JDK 17 Zulu
+ uses: actions/setup-java@v5
+ with:
+ java-version: 17
+ distribution: zulu
+ cache: maven
+ - name: Restore mvn repo artifacts from build job
+ uses: actions/download-artifact@v8
+ with:
+ name: Maven Repository
+ path: ~/.m2/repository/org/igniterealtime/openfire/
+ - name: Set environment variables
+ run: |
+ echo "CONNECTION_STRING=jdbc:mariadb://localhost:3306/openfire?rewriteBatchedStatements=true&characterEncoding=UTF-8&characterSetResults=UTF-8&serverTimezone=UTC" >> $GITHUB_ENV
+ echo "CONNECTION_DRIVER=org.mariadb.jdbc.Driver" >> $GITHUB_ENV
+ echo "CONNECTION_USERNAME=root" >> $GITHUB_ENV
+ echo "CONNECTION_PASSWORD=SecurePa55w0rd" >> $GITHUB_ENV
+ OPENFIREVSN=$(./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout)
+ echo "OPENFIREVSN=$OPENFIREVSN" >> $GITHUB_ENV
+ echo "JAVA_HOME=$(echo $JAVA_HOME_17_X64)" >> $GITHUB_ENV
+ - name: Start database server with an empty database
+ run: |
+ mkdir olddb
+ echo 'CREATE TABLE imready AS (SELECT 1);' > $GITHUB_WORKSPACE/olddb/ZZZ-signal-ready.sql
+ docker compose -f ./build/ci/compose/mariadb.yml up --detach --wait
+ - name: Build & run database tester
+ run: |
+ pushd ./build/ci/updater
+ ./mvnw -B clean package exec:java -Dexec.args="$GITHUB_WORKSPACE"
+
+
+ mariadb-upgrade:
+ name: Test MariaDB upgrade scripts
+ needs: [build, should-do-database-tests, check_branch]
+ runs-on: ubuntu-latest
+ if: ${{ needs.should-do-database-tests.outputs.check == 'true' || needs.check_branch.outputs.is_publishable_branch == 'true'}}
+ steps:
+ - name: Checkout Openfire
+ uses: actions/checkout@v6
+ - name: Set up JDK 17 Zulu
+ uses: actions/setup-java@v5
+ with:
+ java-version: 17
+ distribution: zulu
+ cache: maven
+ - name: Restore mvn repo artifacts from build job
+ uses: actions/download-artifact@v8
+ with:
+ name: Maven Repository
+ path: ~/.m2/repository/org/igniterealtime/openfire/
+ - name: Set environment variables
+ run: |
+ echo "CONNECTION_STRING=jdbc:mariadb://localhost:3306/openfire?rewriteBatchedStatements=true&characterEncoding=UTF-8&characterSetResults=UTF-8&serverTimezone=UTC" >> $GITHUB_ENV
+ echo "CONNECTION_DRIVER=org.mariadb.jdbc.Driver" >> $GITHUB_ENV
+ echo "CONNECTION_USERNAME=root" >> $GITHUB_ENV
+ echo "CONNECTION_PASSWORD=SecurePa55w0rd" >> $GITHUB_ENV
+ OPENFIREVSN=$(./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout)
+ echo "OPENFIREVSN=$OPENFIREVSN" >> $GITHUB_ENV
+ echo "JAVA_HOME=$(echo $JAVA_HOME_17_X64)" >> $GITHUB_ENV
+ - name: Download an old Openfire database installation script
+ run: |
+ mkdir olddb
+ curl https://raw.githubusercontent.com/igniterealtime/Openfire/v4.3.0/distribution/src/database/openfire_mysql.sql > $GITHUB_WORKSPACE/olddb/openfire_mariadb.sql
+ echo 'CREATE TABLE imready AS (SELECT 1);' > $GITHUB_WORKSPACE/olddb/ZZZ-signal-ready.sql
+ - name: Start database server, install old version of the Openfire database
+ run: |
+ docker compose -f ./build/ci/compose/mariadb.yml up --detach --wait
+ - name: Execute Openfire's database upgrade scripts
+ run: |
+ pushd ./build/ci/updater
+ ./mvnw -B clean package exec:java -Dexec.args="$GITHUB_WORKSPACE"
+
+
oracle-install:
name: Test Oracle install scripts
needs: [build, should-do-database-tests, check_branch]
@@ -768,7 +849,7 @@ jobs:
publish-maven:
name: Publish to Maven
runs-on: ubuntu-latest
- needs: [aioxmpp, connectivity, integration, xitf, check_branch, hsqldb-install, hsqldb-upgrade, sqlserver-install, sqlserver-upgrade, postgres-install, postgres-upgrade, mysql-install, mysql-upgrade, oracle-install, oracle-upgrade]
+ needs: [aioxmpp, connectivity, integration, xitf, check_branch, hsqldb-install, hsqldb-upgrade, sqlserver-install, sqlserver-upgrade, postgres-install, postgres-upgrade, mysql-install, mysql-upgrade, mariadb-install, mariadb-upgrade, oracle-install, oracle-upgrade]
if: ${{github.repository == 'igniterealtime/Openfire' && github.event_name == 'push' && needs.check_branch.outputs.is_publishable_branch == 'true'}}
steps:
@@ -795,7 +876,7 @@ jobs:
publish-docker:
name: Publish to GitHub's Docker registry
runs-on: ubuntu-latest
- needs: [build-docker, aioxmpp, connectivity, integration, xitf, check_branch, hsqldb-install, hsqldb-upgrade, sqlserver-install, sqlserver-upgrade, postgres-install, postgres-upgrade, mysql-install, mysql-upgrade, oracle-install, oracle-upgrade]
+ needs: [build-docker, aioxmpp, connectivity, integration, xitf, check_branch, hsqldb-install, hsqldb-upgrade, sqlserver-install, sqlserver-upgrade, postgres-install, postgres-upgrade, mysql-install, mysql-upgrade, mariadb-install, mariadb-upgrade, oracle-install, oracle-upgrade]
if: |
github.event_name == 'push' &&
(contains(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main')
@@ -854,7 +935,7 @@ jobs:
build-deb-artifact:
name: Generate DEB artifact
runs-on: ubuntu-latest
- needs: [aioxmpp, connectivity, integration, xitf, check_branch, hsqldb-install, hsqldb-upgrade, sqlserver-install, sqlserver-upgrade, postgres-install, postgres-upgrade, mysql-install, mysql-upgrade, oracle-install, oracle-upgrade]
+ needs: [aioxmpp, connectivity, integration, xitf, check_branch, hsqldb-install, hsqldb-upgrade, sqlserver-install, sqlserver-upgrade, postgres-install, postgres-upgrade, mysql-install, mysql-upgrade, mariadb-install, mariadb-upgrade, oracle-install, oracle-upgrade]
steps:
- uses: actions/checkout@v6
with:
diff --git a/build/ci/compose/mariadb.yml b/build/ci/compose/mariadb.yml
new file mode 100644
index 0000000000..2f999bc272
--- /dev/null
+++ b/build/ci/compose/mariadb.yml
@@ -0,0 +1,17 @@
+services:
+ db:
+ image: mariadb:12.2.2
+ ports:
+ - "3306:3306"
+ environment:
+ - MARIADB_ROOT_PASSWORD=${CONNECTION_PASSWORD}
+ - MARIADB_DATABASE=openfire
+ healthcheck:
+ test: [ "CMD-SHELL", "exit | mariadb -h 127.0.0.1 -u root -p$$MARIADB_ROOT_PASSWORD openfire -e 'select * from imready'" ]
+ interval: 5s
+ timeout: 20s
+ retries: 30
+ volumes:
+ - ${GITHUB_WORKSPACE}/olddb:/docker-entrypoint-initdb.d
+
+
diff --git a/build/ci/updater/pom.xml b/build/ci/updater/pom.xml
index 2213313305..c4a024113d 100644
--- a/build/ci/updater/pom.xml
+++ b/build/ci/updater/pom.xml
@@ -59,6 +59,11 @@
+
+ org.mariadb.jdbc
+ mariadb-java-client
+ 3.5.8
+ org.postgresqlpostgresql
diff --git a/distribution/src/database/openfire_mariadb.sql b/distribution/src/database/openfire_mariadb.sql
new file mode 100644
index 0000000000..b5777e3343
--- /dev/null
+++ b/distribution/src/database/openfire_mariadb.sql
@@ -0,0 +1,384 @@
+
+CREATE TABLE ofUser (
+ username VARCHAR(64) NOT NULL,
+ storedKey VARCHAR(32),
+ serverKey VARCHAR(32),
+ salt VARCHAR(32),
+ iterations INTEGER,
+ plainPassword VARCHAR(32),
+ encryptedPassword VARCHAR(255),
+ name VARCHAR(100),
+ email VARCHAR(100),
+ creationDate CHAR(15) NOT NULL,
+ modificationDate CHAR(15) NOT NULL,
+ PRIMARY KEY (username),
+ INDEX ofUser_cDate_idx (creationDate)
+);
+
+CREATE TABLE ofUserProp (
+ username VARCHAR(64) NOT NULL,
+ name VARCHAR(100) NOT NULL,
+ propValue TEXT NOT NULL,
+ PRIMARY KEY (username, name)
+);
+
+CREATE TABLE ofUserFlag (
+ username VARCHAR(64) NOT NULL,
+ name VARCHAR(100) NOT NULL,
+ startTime CHAR(15),
+ endTime CHAR(15),
+ PRIMARY KEY (username, name),
+ INDEX ofUserFlag_sTime_idx (startTime),
+ INDEX ofUserFlag_eTime_idx (endTime)
+);
+
+CREATE TABLE ofOffline (
+ username VARCHAR(64) NOT NULL,
+ messageID BIGINT NOT NULL,
+ creationDate CHAR(15) NOT NULL,
+ messageSize INTEGER NOT NULL,
+ stanza TEXT NOT NULL,
+ PRIMARY KEY (username, messageID)
+);
+
+CREATE TABLE ofPresence (
+ username VARCHAR(64) NOT NULL,
+ offlinePresence TEXT,
+ offlineDate CHAR(15) NOT NULL,
+ PRIMARY KEY (username)
+);
+
+CREATE TABLE ofRoster (
+ rosterID BIGINT NOT NULL,
+ username VARCHAR(64) NOT NULL,
+ jid VARCHAR(1024) NOT NULL,
+ sub TINYINT NOT NULL,
+ ask TINYINT NOT NULL,
+ recv TINYINT NOT NULL,
+ nick VARCHAR(255),
+ stanza TEXT,
+ PRIMARY KEY (rosterID),
+ INDEX ofRoster_unameid_idx (username),
+ INDEX ofRoster_jid_idx (jid(255))
+);
+
+CREATE TABLE ofRosterGroups (
+ rosterID BIGINT NOT NULL,
+ `rank` TINYINT NOT NULL,
+ groupName VARCHAR(255) NOT NULL,
+ PRIMARY KEY (rosterID, `rank`),
+ INDEX ofRosterGroup_rosterid_idx (rosterID)
+);
+
+CREATE TABLE ofVCard (
+ username VARCHAR(64) NOT NULL,
+ vcard MEDIUMTEXT NOT NULL,
+ PRIMARY KEY (username)
+);
+
+CREATE TABLE ofGroup (
+ groupName VARCHAR(50) NOT NULL,
+ description VARCHAR(255),
+ PRIMARY KEY (groupName)
+);
+
+CREATE TABLE ofGroupProp (
+ groupName VARCHAR(50) NOT NULL,
+ name VARCHAR(100) NOT NULL,
+ propValue TEXT NOT NULL,
+ PRIMARY KEY (groupName, name)
+);
+
+CREATE TABLE ofGroupUser (
+ groupName VARCHAR(50) NOT NULL,
+ username VARCHAR(100) NOT NULL,
+ administrator TINYINT NOT NULL,
+ PRIMARY KEY (groupName, username, administrator)
+);
+
+CREATE TABLE ofID (
+ idType INTEGER NOT NULL,
+ id BIGINT NOT NULL,
+ PRIMARY KEY (idType)
+);
+
+CREATE TABLE ofProperty (
+ name VARCHAR(100) NOT NULL,
+ propValue TEXT NOT NULL,
+ encrypted INTEGER,
+ iv CHAR(24),
+ PRIMARY KEY (name)
+);
+
+
+CREATE TABLE ofVersion (
+ name VARCHAR(50) NOT NULL,
+ version INTEGER NOT NULL,
+ PRIMARY KEY (name)
+);
+
+CREATE TABLE ofExtComponentConf (
+ subdomain VARCHAR(255) NOT NULL,
+ wildcard TINYINT NOT NULL,
+ secret VARCHAR(255),
+ permission VARCHAR(10) NOT NULL,
+ PRIMARY KEY (subdomain)
+);
+
+CREATE TABLE ofRemoteServerConf (
+ xmppDomain VARCHAR(255) NOT NULL,
+ remotePort INTEGER,
+ permission VARCHAR(10) NOT NULL,
+ PRIMARY KEY (xmppDomain)
+);
+
+CREATE TABLE ofPrivacyList (
+ username VARCHAR(64) NOT NULL,
+ name VARCHAR(100) NOT NULL,
+ isDefault TINYINT NOT NULL,
+ list TEXT NOT NULL,
+ PRIMARY KEY (username, name),
+ INDEX ofPrivacyList_default_idx (username, isDefault)
+);
+
+CREATE TABLE ofSecurityAuditLog (
+ msgID BIGINT NOT NULL,
+ username VARCHAR(64) NOT NULL,
+ entryStamp BIGINT NOT NULL,
+ summary VARCHAR(255) NOT NULL,
+ node VARCHAR(255) NOT NULL,
+ details TEXT,
+ PRIMARY KEY (msgID),
+ INDEX ofSecurityAuditLog_tstamp_idx (entryStamp),
+ INDEX ofSecurityAuditLog_uname_idx (username)
+);
+
+# MUC Tables
+
+CREATE TABLE ofMucService (
+ serviceID BIGINT NOT NULL,
+ subdomain VARCHAR(255) NOT NULL,
+ description VARCHAR(255),
+ isHidden TINYINT NOT NULL,
+ PRIMARY KEY (subdomain),
+ INDEX ofMucService_serviceid_idx (serviceID)
+);
+
+CREATE TABLE ofMucServiceProp (
+ serviceID BIGINT NOT NULL,
+ name VARCHAR(100) NOT NULL,
+ propValue TEXT NOT NULL,
+ PRIMARY KEY (serviceID, name)
+);
+
+CREATE TABLE ofMucRoom (
+ serviceID BIGINT NOT NULL,
+ roomID BIGINT NOT NULL,
+ creationDate CHAR(15) NOT NULL,
+ modificationDate CHAR(15) NOT NULL,
+ name VARCHAR(50) NOT NULL,
+ naturalName VARCHAR(255) NOT NULL,
+ description VARCHAR(255),
+ lockedDate CHAR(15) NOT NULL,
+ emptyDate CHAR(15) NULL,
+ canChangeSubject TINYINT NOT NULL,
+ maxUsers INTEGER NOT NULL,
+ publicRoom TINYINT NOT NULL,
+ moderated TINYINT NOT NULL,
+ membersOnly TINYINT NOT NULL,
+ canInvite TINYINT NOT NULL,
+ roomPassword VARCHAR(50) NULL,
+ canDiscoverJID TINYINT NOT NULL,
+ logEnabled TINYINT NOT NULL,
+ retireOnDeletion TINYINT NOT NULL,
+ preserveHistOnDel TINYINT NOT NULL,
+ subject TEXT NULL,
+ rolesToBroadcast TINYINT NOT NULL,
+ useReservedNick TINYINT NOT NULL,
+ canChangeNick TINYINT NOT NULL,
+ canRegister TINYINT NOT NULL,
+ allowpm TINYINT NULL,
+ fmucEnabled TINYINT NULL,
+ fmucOutboundNode VARCHAR(255) NULL,
+ fmucOutboundMode TINYINT NULL,
+ fmucInboundNodes VARCHAR(4000) NULL,
+ PRIMARY KEY (serviceID,name),
+ INDEX ofMucRoom_roomid_idx (roomID),
+ INDEX ofMucRoom_serviceid_idx (serviceID)
+);
+
+CREATE TABLE ofMucRoomProp (
+ roomID BIGINT NOT NULL,
+ name VARCHAR(100) NOT NULL,
+ propValue TEXT NOT NULL,
+ PRIMARY KEY (roomID, name)
+);
+
+CREATE TABLE ofMucRoomRetiree (
+ serviceID BIGINT NOT NULL,
+ name VARCHAR(50) NOT NULL,
+ alternateJID VARCHAR(2000),
+ reason VARCHAR(1024),
+ retiredAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (serviceID,name)
+);
+
+CREATE TABLE ofMucAffiliation (
+ roomID BIGINT NOT NULL,
+ jid TEXT NOT NULL,
+ affiliation TINYINT NOT NULL,
+ PRIMARY KEY (roomID,jid(70))
+);
+
+CREATE TABLE ofMucMember (
+ roomID BIGINT NOT NULL,
+ jid TEXT NOT NULL,
+ nickname VARCHAR(255) NULL,
+ firstName VARCHAR(100) NULL,
+ lastName VARCHAR(100) NULL,
+ url VARCHAR(100) NULL,
+ email VARCHAR(100) NULL,
+ faqentry VARCHAR(100) NULL,
+ PRIMARY KEY (roomID,jid(70))
+);
+
+CREATE TABLE ofMucConversationLog (
+ roomID BIGINT NOT NULL,
+ messageID BIGINT NOT NULL,
+ sender TEXT NOT NULL,
+ nickname VARCHAR(255) NULL,
+ logTime CHAR(15) NOT NULL,
+ subject VARCHAR(255) NULL,
+ body TEXT NULL,
+ stanza TEXT NULL,
+ INDEX ofMucConversationLog_roomtime_idx (roomID, logTime),
+ INDEX ofMucConversationLog_time_idx (logTime),
+ INDEX ofMucConversationLog_msg_id (messageID)
+);
+
+# PubSub Tables
+
+CREATE TABLE ofPubsubNode (
+ serviceID VARCHAR(100) NOT NULL,
+ nodeID VARCHAR(100) NOT NULL,
+ leaf TINYINT NOT NULL,
+ creationDate CHAR(15) NOT NULL,
+ modificationDate CHAR(15) NOT NULL,
+ parent VARCHAR(100) NULL,
+ deliverPayloads TINYINT NOT NULL,
+ maxPayloadSize INTEGER NULL,
+ persistItems TINYINT NULL,
+ maxItems INTEGER NULL,
+ notifyConfigChanges TINYINT NOT NULL,
+ notifyDelete TINYINT NOT NULL,
+ notifyRetract TINYINT NOT NULL,
+ presenceBased TINYINT NOT NULL,
+ sendItemSubscribe TINYINT NOT NULL,
+ publisherModel VARCHAR(15) NOT NULL,
+ subscriptionEnabled TINYINT NOT NULL,
+ configSubscription TINYINT NOT NULL,
+ accessModel VARCHAR(10) NOT NULL,
+ payloadType VARCHAR(100) NULL,
+ bodyXSLT VARCHAR(100) NULL,
+ dataformXSLT VARCHAR(100) NULL,
+ creator VARCHAR(255) NOT NULL,
+ description VARCHAR(255) NULL,
+ language VARCHAR(255) NULL,
+ name VARCHAR(50) NULL,
+ replyPolicy VARCHAR(15) NULL,
+ associationPolicy VARCHAR(15) NULL,
+ maxLeafNodes INTEGER NULL,
+ PRIMARY KEY (serviceID, nodeID)
+);
+
+CREATE TABLE ofPubsubNodeJIDs (
+ serviceID VARCHAR(100) NOT NULL,
+ nodeID VARCHAR(100) NOT NULL,
+ jid VARCHAR(255) NOT NULL,
+ associationType VARCHAR(20) NOT NULL,
+ PRIMARY KEY (serviceID, nodeID, jid(70))
+);
+
+CREATE TABLE ofPubsubNodeGroups (
+ serviceID VARCHAR(100) NOT NULL,
+ nodeID VARCHAR(100) NOT NULL,
+ rosterGroup VARCHAR(100) NOT NULL,
+ INDEX ofPubsubNodeGroups_idx (serviceID, nodeID)
+);
+
+CREATE TABLE ofPubsubAffiliation (
+ serviceID VARCHAR(100) NOT NULL,
+ nodeID VARCHAR(100) NOT NULL,
+ jid VARCHAR(255) NOT NULL,
+ affiliation VARCHAR(10) NOT NULL,
+ PRIMARY KEY (serviceID, nodeID, jid(70))
+);
+
+CREATE TABLE ofPubsubItem (
+ serviceID VARCHAR(100) NOT NULL,
+ nodeID VARCHAR(100) NOT NULL,
+ id VARCHAR(100) NOT NULL,
+ jid VARCHAR(255) NOT NULL,
+ creationDate CHAR(15) NOT NULL,
+ payload MEDIUMTEXT NULL,
+ PRIMARY KEY (serviceID, nodeID, id)
+);
+
+CREATE TABLE ofPubsubSubscription (
+ serviceID VARCHAR(100) NOT NULL,
+ nodeID VARCHAR(100) NOT NULL,
+ id VARCHAR(100) NOT NULL,
+ jid VARCHAR(255) NOT NULL,
+ owner VARCHAR(255) NOT NULL,
+ state VARCHAR(15) NOT NULL,
+ deliver TINYINT NOT NULL,
+ digest TINYINT NOT NULL,
+ digest_frequency INT NOT NULL,
+ expire CHAR(15) NULL,
+ includeBody TINYINT NOT NULL,
+ showValues VARCHAR(30) NULL,
+ subscriptionType VARCHAR(10) NOT NULL,
+ subscriptionDepth TINYINT NOT NULL,
+ keyword VARCHAR(200) NULL,
+ PRIMARY KEY (serviceID, nodeID, id)
+);
+
+CREATE TABLE ofPubsubDefaultConf (
+ serviceID VARCHAR(100) NOT NULL,
+ leaf TINYINT NOT NULL,
+ deliverPayloads TINYINT NOT NULL,
+ maxPayloadSize INTEGER NOT NULL,
+ persistItems TINYINT NOT NULL,
+ maxItems INTEGER NOT NULL,
+ notifyConfigChanges TINYINT NOT NULL,
+ notifyDelete TINYINT NOT NULL,
+ notifyRetract TINYINT NOT NULL,
+ presenceBased TINYINT NOT NULL,
+ sendItemSubscribe TINYINT NOT NULL,
+ publisherModel VARCHAR(15) NOT NULL,
+ subscriptionEnabled TINYINT NOT NULL,
+ accessModel VARCHAR(10) NOT NULL,
+ language VARCHAR(255) NULL,
+ replyPolicy VARCHAR(15) NULL,
+ associationPolicy VARCHAR(15) NOT NULL,
+ maxLeafNodes INTEGER NOT NULL,
+ PRIMARY KEY (serviceID, leaf)
+);
+
+# Finally, insert default table values.
+
+INSERT INTO ofID (idType, id) VALUES (18, 1);
+INSERT INTO ofID (idType, id) VALUES (19, 1);
+INSERT INTO ofID (idType, id) VALUES (23, 1);
+INSERT INTO ofID (idType, id) VALUES (26, 2);
+INSERT INTO ofID (idType, id) VALUES (27, 1);
+
+# Entry for admin user
+INSERT INTO ofUser (username, plainPassword, name, email, creationDate, modificationDate)
+ VALUES ('admin', 'admin', 'Administrator', 'admin@example.com', '0', '0');
+
+# Entry for default conference service
+INSERT INTO ofMucService (serviceID, subdomain, isHidden) VALUES (1, 'conference', 0);
+
+# Do this last, as it is used by a continuous integration check to verify that the entire script was executed successfully.
+INSERT INTO ofVersion (name, version) VALUES ('openfire', 38);
diff --git a/distribution/src/database/upgrade/1/openfire_mariadb.sql b/distribution/src/database/upgrade/1/openfire_mariadb.sql
new file mode 100644
index 0000000000..fd1baf5ef0
--- /dev/null
+++ b/distribution/src/database/upgrade/1/openfire_mariadb.sql
@@ -0,0 +1,55 @@
+
+# jiveGroup: Recreate table from scratch
+DROP TABLE jiveGroup;
+CREATE TABLE jiveGroup (
+ groupName VARCHAR(50) NOT NULL,
+ description VARCHAR(255),
+ PRIMARY KEY (groupName)
+);
+
+# jiveGroupProp: Recreate table from scratch
+DROP TABLE jiveGroupProp;
+CREATE TABLE jiveGroupProp (
+ groupName VARCHAR(50) NOT NULL,
+ name VARCHAR(100) NOT NULL,
+ propValue TEXT NOT NULL,
+ PRIMARY KEY (groupName, name)
+);
+
+# jiveGroupUser: Recreate table from scratch
+DROP TABLE jiveGroupUser;
+CREATE TABLE jiveGroupUser (
+ groupName VARCHAR(50) NOT NULL,
+ username VARCHAR(32) NOT NULL,
+ administrator TINYINT NOT NULL,
+ PRIMARY KEY (groupName, username, administrator)
+);
+
+# mucRoom: Add new columns: "lockedDate" and "emptyDate". Rename column "invitationRequired" to "membersOnly". Delete columns: "lastActiveDate" and "inMemory".
+ALTER TABLE mucRoom ADD COLUMN lockedDate CHAR(15) NOT NULL AFTER description;
+ALTER TABLE mucRoom ADD COLUMN emptyDate CHAR(15) NULL AFTER lockedDate;
+ALTER TABLE mucRoom CHANGE invitationRequired membersOnly TINYINT NOT NULL;
+ALTER TABLE mucRoom DROP COLUMN lastActiveDate;
+ALTER TABLE mucRoom DROP COLUMN inMemory;
+
+
+# mucMember: Add new columns
+ALTER TABLE mucMember ADD COLUMN firstName VARCHAR(100) NULL;
+ALTER TABLE mucMember ADD COLUMN lastName VARCHAR(100) NULL;
+ALTER TABLE mucMember ADD COLUMN url VARCHAR(100) NULL;
+ALTER TABLE mucMember ADD COLUMN email VARCHAR(100) NULL;
+ALTER TABLE mucMember ADD COLUMN faqentry VARCHAR(100) NULL;
+
+# mucConversationLog: Add new index
+ALTER TABLE mucConversationLog ADD INDEX mucLog_time_idx (time);
+
+# Deletes no longer needed entries
+DELETE FROM jiveID where idType = 3;
+DELETE FROM jiveID where idType = 4;
+
+# Add jiveVersion table
+CREATE TABLE jiveVersion (
+ majorVersion INTEGER NOT NULL,
+ minorVersion INTEGER NOT NULL
+);
+INSERT INTO jiveVersion (majorVersion, minorVersion) VALUES (2, 1);
diff --git a/distribution/src/database/upgrade/10/openfire_mariadb.sql b/distribution/src/database/upgrade/10/openfire_mariadb.sql
new file mode 100644
index 0000000000..be3ca6ac68
--- /dev/null
+++ b/distribution/src/database/upgrade/10/openfire_mariadb.sql
@@ -0,0 +1,8 @@
+
+CREATE TABLE jiveSASLAuthorized (
+ username VARCHAR(64) NOT NULL,
+ principal TEXT NOT NULL,
+ PRIMARY KEY (username, principal(200))
+);
+
+UPDATE jiveVersion set version=10 where name = 'openfire';
diff --git a/distribution/src/database/upgrade/11/openfire_mariadb.sql b/distribution/src/database/upgrade/11/openfire_mariadb.sql
new file mode 100644
index 0000000000..5c90cb7423
--- /dev/null
+++ b/distribution/src/database/upgrade/11/openfire_mariadb.sql
@@ -0,0 +1,9 @@
+
+CREATE TABLE jivePresence (
+ username VARCHAR(64) NOT NULL,
+ offlinePresence TEXT,
+ offlineDate CHAR(15) NOT NULL,
+ PRIMARY KEY (username)
+);
+
+UPDATE jiveVersion set version=11 where name = 'openfire';
diff --git a/distribution/src/database/upgrade/12/openfire_mariadb.sql b/distribution/src/database/upgrade/12/openfire_mariadb.sql
new file mode 100644
index 0000000000..176b66da05
--- /dev/null
+++ b/distribution/src/database/upgrade/12/openfire_mariadb.sql
@@ -0,0 +1,4 @@
+
+ALTER TABLE mucConversationLog CHANGE time logTime CHAR(15) NOT NULL;
+
+UPDATE jiveVersion set version=12 where name = 'openfire';
diff --git a/distribution/src/database/upgrade/13/openfire_mariadb.sql b/distribution/src/database/upgrade/13/openfire_mariadb.sql
new file mode 100644
index 0000000000..90ccd0071a
--- /dev/null
+++ b/distribution/src/database/upgrade/13/openfire_mariadb.sql
@@ -0,0 +1,16 @@
+
+ALTER TABLE pubsubItem CHANGE payload payload MEDIUMTEXT;
+
+ALTER TABLE jiveRemoteServerConf CHANGE domain xmppDomain VARCHAR(255) NOT NULL;
+
+ALTER TABLE jiveOffline CHANGE message stanza TEXT NOT NULL;
+
+ALTER TABLE jiveVCard CHANGE value vcard MEDIUMTEXT NOT NULL;
+
+ALTER TABLE jivePrivate CHANGE value privateData TEXT NOT NULL;
+
+ALTER TABLE jiveUser CHANGE password plainPassword VARCHAR(32);
+
+ALTER TABLE mucRoom CHANGE password roomPassword VARCHAR(50);
+
+UPDATE jiveVersion set version=13 where name = 'openfire';
diff --git a/distribution/src/database/upgrade/14/openfire_mariadb.sql b/distribution/src/database/upgrade/14/openfire_mariadb.sql
new file mode 100644
index 0000000000..fc87ae2b86
--- /dev/null
+++ b/distribution/src/database/upgrade/14/openfire_mariadb.sql
@@ -0,0 +1,7 @@
+# jiveRoster: Change jid column to varchar
+ALTER TABLE jiveRoster CHANGE COLUMN jid jid varchar(1024) not null;
+
+# jiveRoster: Add new index
+ALTER TABLE jiveRoster ADD INDEX jiveRoster_jid_idx (jid);
+
+UPDATE jiveVersion set version=14 where name = 'openfire';
diff --git a/distribution/src/database/upgrade/15/openfire_mariadb.sql b/distribution/src/database/upgrade/15/openfire_mariadb.sql
new file mode 100644
index 0000000000..ed34a43e73
--- /dev/null
+++ b/distribution/src/database/upgrade/15/openfire_mariadb.sql
@@ -0,0 +1,12 @@
+# create jiveUserFlag table
+CREATE TABLE jiveUserFlag (
+ username VARCHAR(64) NOT NULL,
+ name VARCHAR(100) NOT NULL,
+ startTime CHAR(15),
+ endTime CHAR(15),
+ PRIMARY KEY (username, name),
+ INDEX jiveUser_sTime_idx (startTime),
+ INDEX jiveUser_eTime_idx (endTime)
+);
+
+UPDATE jiveVersion set version=15 where name = 'openfire';
diff --git a/distribution/src/database/upgrade/16/openfire_mariadb.sql b/distribution/src/database/upgrade/16/openfire_mariadb.sql
new file mode 100644
index 0000000000..a28bed5df6
--- /dev/null
+++ b/distribution/src/database/upgrade/16/openfire_mariadb.sql
@@ -0,0 +1,14 @@
+# create table jiveSecurityAuditLog
+CREATE TABLE jiveSecurityAuditLog (
+ msgID BIGINT NOT NULL,
+ username VARCHAR(64) NOT NULL,
+ entryStamp BIGINT NOT NULL,
+ summary VARCHAR(255) NOT NULL,
+ node VARCHAR(255) NOT NULL,
+ details TEXT,
+ PRIMARY KEY (msgID),
+ INDEX jiveSecAuditLog_tstamp_idx (entryStamp),
+ INDEX jiveSecAuditLog_uname_idx (username)
+);
+
+UPDATE jiveVersion set version=16 where name = 'openfire';
diff --git a/distribution/src/database/upgrade/17/openfire_mariadb.sql b/distribution/src/database/upgrade/17/openfire_mariadb.sql
new file mode 100644
index 0000000000..e3fd1e6967
--- /dev/null
+++ b/distribution/src/database/upgrade/17/openfire_mariadb.sql
@@ -0,0 +1,116 @@
+# create table mucService
+CREATE TABLE mucService (
+ serviceID BIGINT NOT NULL,
+ subdomain VARCHAR(255) NOT NULL,
+ description VARCHAR(255),
+ PRIMARY KEY (subdomain),
+ INDEX mucService_serviceid_idx (serviceID)
+);
+
+# create table mucServiceProp
+CREATE TABLE mucServiceProp (
+ serviceID BIGINT NOT NULL,
+ name VARCHAR(100) NOT NULL,
+ propValue TEXT NOT NULL,
+ PRIMARY KEY (serviceID, name)
+);
+
+# add new indexed column to mucRoom
+ALTER TABLE mucRoom ADD COLUMN serviceID BIGINT NOT NULL DEFAULT 1 FIRST;
+ALTER TABLE mucRoom ADD INDEX mucRoom_serviceid_idx (serviceID);
+
+# change mucRooms primary key to be referenced around serviceID
+ALTER TABLE mucRoom DROP PRIMARY KEY;
+ALTER TABLE mucRoom ADD PRIMARY KEY (serviceID,name);
+
+# add default entry for conference service and associated jiveID value
+INSERT INTO mucService (serviceID, subdomain) VALUES (1, 'conference');
+INSERT INTO jiveID (idType, id) VALUES (26, 1);
+
+# update conference name/desc if theres a custom one set
+UPDATE mucService SET mucService.subdomain = ( SELECT jiveProperty.propValue FROM jiveProperty WHERE jiveProperty.name = 'xmpp.muc.service' )
+ WHERE EXISTS ( SELECT jiveProperty.propValue FROM jiveProperty WHERE jiveProperty.name = 'xmpp.muc.service' );
+DELETE FROM jiveProperty WHERE name = 'xmpp.muc.service';
+
+UPDATE mucService SET mucService.description = ( SELECT jiveProperty.propValue FROM jiveProperty WHERE jiveProperty.name = 'muc.service-name' )
+ WHERE EXISTS ( SELECT jiveProperty.propValue FROM jiveProperty WHERE jiveProperty.name = 'muc.service-name' );
+DELETE FROM jiveProperty WHERE name = 'muc.service-name';
+
+# transfer all system properties to muc specific properties
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'room.canOccupantsChangeSubject',propValue FROM jiveProperty WHERE name = 'muc.room.canOccupantsChangeSubject';
+DELETE FROM jiveProperty WHERE name = 'muc.room.canOccupantsChangeSubject';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'room.maxUsers',propValue FROM jiveProperty WHERE name = 'muc.room.maxUsers';
+DELETE FROM jiveProperty WHERE name = 'muc.room.maxUsers';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'room.publicRoom',propValue FROM jiveProperty WHERE name = 'muc.room.publicRoom';
+DELETE FROM jiveProperty WHERE name = 'muc.room.publicRoom';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'room.persistent',propValue FROM jiveProperty WHERE name = 'muc.room.persistent';
+DELETE FROM jiveProperty WHERE name = 'muc.room.persistent';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'room.moderated',propValue FROM jiveProperty WHERE name = 'muc.room.moderated';
+DELETE FROM jiveProperty WHERE name = 'muc.room.moderated';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'room.membersOnly',propValue FROM jiveProperty WHERE name = 'muc.room.membersOnly';
+DELETE FROM jiveProperty WHERE name = 'muc.room.membersOnly';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'room.canOccupantsInvite',propValue FROM jiveProperty WHERE name = 'muc.room.canOccupantsInvite';
+DELETE FROM jiveProperty WHERE name = 'muc.room.canOccupantsInvite';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'room.canAnyoneDiscoverJID',propValue FROM jiveProperty WHERE name = 'muc.room.canAnyoneDiscoverJID';
+DELETE FROM jiveProperty WHERE name = 'muc.room.canAnyoneDiscoverJID';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'room.logEnabled',propValue FROM jiveProperty WHERE name = 'muc.room.logEnabled';
+DELETE FROM jiveProperty WHERE name = 'muc.room.logEnabled';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'room.loginRestrictedToNickname',propValue FROM jiveProperty WHERE name = 'muc.room.loginRestrictedToNickname';
+DELETE FROM jiveProperty WHERE name = 'muc.room.loginRestrictedToNickname';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'room.canChangeNickname',propValue FROM jiveProperty WHERE name = 'muc.room.canChangeNickname';
+DELETE FROM jiveProperty WHERE name = 'muc.room.canChangeNickname';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'room.registrationEnabled',propValue FROM jiveProperty WHERE name = 'muc.room.registrationEnabled';
+DELETE FROM jiveProperty WHERE name = 'muc.room.registrationEnabled';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'tasks.user.timeout',propValue FROM jiveProperty WHERE name = 'xmpp.muc.tasks.user.timeout';
+DELETE FROM jiveProperty WHERE name = 'xmpp.muc.tasks.user.timeout';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'tasks.user.idle',propValue FROM jiveProperty WHERE name = 'xmpp.muc.tasks.user.idle';
+DELETE FROM jiveProperty WHERE name = 'xmpp.muc.tasks.user.idle';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'tasks.log.timeout',propValue FROM jiveProperty WHERE name = 'xmpp.muc.tasks.log.timeout';
+DELETE FROM jiveProperty WHERE name = 'xmpp.muc.tasks.log.timeout';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'tasks.log.batchsize',propValue FROM jiveProperty WHERE name = 'xmpp.muc.tasks.log.batchsize';
+DELETE FROM jiveProperty WHERE name = 'xmpp.muc.tasks.log.batchsize';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'sysadmin.jid',propValue FROM jiveProperty WHERE name = 'xmpp.muc.sysadmin.jid';
+DELETE FROM jiveProperty WHERE name = 'xmpp.muc.sysadmin.jid';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'discover.locked',propValue FROM jiveProperty WHERE name = 'xmpp.muc.discover.locked';
+DELETE FROM jiveProperty WHERE name = 'xmpp.muc.discover.locked';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'create.anyone',propValue FROM jiveProperty WHERE name = 'xmpp.muc.create.anyone';
+DELETE FROM jiveProperty WHERE name = 'xmpp.muc.create.anyone';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'create.jid',propValue FROM jiveProperty WHERE name = 'xmpp.muc.create.jid';
+DELETE FROM jiveProperty WHERE name = 'xmpp.muc.create.jid';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'enabled',propValue FROM jiveProperty WHERE name = 'xmpp.muc.enabled';
+DELETE FROM jiveProperty WHERE name = 'xmpp.muc.enabled';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'unload.empty_days',propValue FROM jiveProperty WHERE name = 'xmpp.muc.unload.empty_days';
+DELETE FROM jiveProperty WHERE name = 'xmpp.muc.unload.empty_days';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'discover.locked',propValue FROM jiveProperty WHERE name = 'xmpp.muc.discover.locked';
+DELETE FROM jiveProperty WHERE name = 'xmpp.muc.discover.locked';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'history.maxNumber',propValue FROM jiveProperty WHERE name = 'xmpp.muc.history.maxNumber';
+DELETE FROM jiveProperty WHERE name = 'xmpp.muc.history.maxNumber';
+
+INSERT INTO mucServiceProp(serviceID,name,propValue) SELECT 1,'history.type',propValue FROM jiveProperty WHERE name = 'xmpp.muc.history.type';
+DELETE FROM jiveProperty WHERE name = 'xmpp.muc.history.type';
+
+
+UPDATE jiveVersion set version=17 where name = 'openfire';
diff --git a/distribution/src/database/upgrade/18/openfire_mariadb.sql b/distribution/src/database/upgrade/18/openfire_mariadb.sql
new file mode 100644
index 0000000000..1f5237efd0
--- /dev/null
+++ b/distribution/src/database/upgrade/18/openfire_mariadb.sql
@@ -0,0 +1,5 @@
+# add isHidden column to mucService, with isHidden set to false by default
+ALTER TABLE mucService ADD COLUMN isHidden TINYINT NOT NULL DEFAULT 0;
+
+
+UPDATE jiveVersion set version=18 where name = 'openfire';
diff --git a/distribution/src/database/upgrade/19/openfire_mariadb.sql b/distribution/src/database/upgrade/19/openfire_mariadb.sql
new file mode 100644
index 0000000000..62c1aa64ad
--- /dev/null
+++ b/distribution/src/database/upgrade/19/openfire_mariadb.sql
@@ -0,0 +1,135 @@
+# Rename jiveUser to ofUser
+ALTER TABLE jiveUser DROP INDEX jiveUser_cDate_idx;
+RENAME TABLE jiveUser TO ofUser;
+ALTER TABLE ofUser ADD INDEX ofUser_cDate_idx (creationDate);
+
+# Rename jiveUserProp to ofUserProp
+RENAME TABLE jiveUserProp TO ofUserProp;
+
+# Rename jiveUserFlag to ofUserFlag
+ALTER TABLE jiveUserFlag DROP INDEX jiveUser_sTime_idx;
+ALTER TABLE jiveUserFlag DROP INDEX jiveUser_eTime_idx;
+RENAME TABLE jiveUserFlag TO ofUserFlag;
+ALTER TABLE ofUserFlag ADD INDEX ofUserFlag_sTime_idx (startTime);
+ALTER TABLE ofUserFlag ADD INDEX ofUserFlag_eTime_idx (endTime);
+
+# Rename jiveGroup to ofGroup
+RENAME TABLE jiveGroup TO ofGroup;
+
+# Rename jiveGroupProp to ofGroupProp
+RENAME TABLE jiveGroupProp TO ofGroupProp;
+
+# Rename jiveGroupUser to ofGroupUser
+RENAME TABLE jiveGroupUser TO ofGroupUser;
+
+# Rename jivePrivate to ofPrivate
+RENAME TABLE jivePrivate TO ofPrivate;
+
+# Rename jiveOffline to ofOffline
+RENAME TABLE jiveOffline TO ofOffline;
+
+# Rename jivePresence to ofPresence
+RENAME TABLE jivePresence TO ofPresence;
+
+# Make sure that the jid column of jiveRoster is a varchar instead of text
+ALTER TABLE jiveRoster CHANGE COLUMN jid jid VARCHAR(1024) NOT NULL;
+
+# Rename jiveRoster to ofRoster
+ALTER TABLE jiveRoster DROP INDEX jiveRoster_unameid_idx;
+ALTER TABLE jiveRoster DROP INDEX jiveRoster_jid_idx;
+RENAME TABLE jiveRoster TO ofRoster;
+ALTER TABLE ofRoster ADD INDEX ofRoster_unameid_idx (username);
+ALTER TABLE ofRoster ADD INDEX ofRoster_jid_idx (jid);
+
+# Rename jiveRosterGroups to ofRosterGroups
+ALTER TABLE jiveRosterGroups DROP INDEX jiveRosterGroup_rosterid_idx;
+RENAME TABLE jiveRosterGroups TO ofRosterGroups;
+ALTER TABLE ofRosterGroups ADD INDEX ofRosterGroup_rosterid_idx (rosterID);
+
+# Rename jiveVCard to ofVCard
+RENAME TABLE jiveVCard TO ofVCard;
+
+# Rename jiveID to ofID
+RENAME TABLE jiveID TO ofID;
+
+# Rename jiveProperty to ofProperty
+RENAME TABLE jiveProperty TO ofProperty;
+
+# Rename jiveVersion to ofVersion
+RENAME TABLE jiveVersion TO ofVersion;
+
+# Rename jiveExtComponentConf to ofExtComponentConf
+RENAME TABLE jiveExtComponentConf TO ofExtComponentConf;
+
+# Rename jiveRemoteServerConf to ofRemoteServerConf
+RENAME TABLE jiveRemoteServerConf TO ofRemoteServerConf;
+
+# Rename jivePrivacyList to ofPrivacyList
+ALTER TABLE jivePrivacyList DROP INDEX jivePList_default_idx;
+RENAME TABLE jivePrivacyList TO ofPrivacyList;
+ALTER TABLE ofPrivacyList ADD INDEX ofPrivacyList_default_idx (username, isDefault);
+
+# Rename jiveSASLAuthorized to ofSASLAuthorized
+RENAME TABLE jiveSASLAuthorized TO ofSASLAuthorized;
+
+# Rename jiveSecurityAuditLog to ofSecurityAuditLog
+ALTER TABLE jiveSecurityAuditLog DROP INDEX jiveSecAuditLog_tstamp_idx;
+ALTER TABLE jiveSecurityAuditLog DROP INDEX jiveSecAuditLog_uname_idx;
+RENAME TABLE jiveSecurityAuditLog TO ofSecurityAuditLog;
+ALTER TABLE ofSecurityAuditLog ADD INDEX ofSecurityAuditLog_tstamp_idx (entryStamp);
+ALTER TABLE ofSecurityAuditLog ADD INDEX ofSecurityAuditLog_uname_idx (username);
+
+# Rename mucService to ofMucService
+ALTER TABLE mucService DROP INDEX mucService_serviceid_idx;
+RENAME TABLE mucService TO ofMucService;
+ALTER TABLE ofMucService ADD INDEX ofMucService_serviceid_idx (serviceID);
+
+# Rename mucServiceProp to ofMucServiceProp
+RENAME TABLE mucServiceProp TO ofMucServiceProp;
+
+# Rename mucRoom to ofMucRoom
+ALTER TABLE mucRoom DROP INDEX mucRoom_roomid_idx;
+ALTER TABLE mucRoom DROP INDEX mucRoom_serviceid_idx;
+RENAME TABLE mucRoom TO ofMucRoom;
+ALTER TABLE ofMucRoom ADD INDEX ofMucRoom_roomid_idx (roomID);
+ALTER TABLE ofMucRoom ADD INDEX ofMucRoom_serviceid_idx (serviceID);
+
+# Rename mucRoomProp to ofMucRoomProp
+RENAME TABLE mucRoomProp TO ofMucRoomProp;
+
+# Rename mucAffiliation to ofMucAffiliation
+RENAME TABLE mucAffiliation TO ofMucAffiliation;
+
+# Rename mucMember to ofMucMember
+RENAME TABLE mucMember TO ofMucMember;
+
+# Rename mucConversationLog to ofMucConversationLog
+ALTER TABLE mucConversationLog DROP INDEX mucLog_time_idx;
+RENAME TABLE mucConversationLog TO ofMucConversationLog;
+ALTER TABLE ofMucConversationLog ADD INDEX ofMucConversationLog_time_idx (logTime);
+
+# Rename pubsubNode to ofPubsubNode
+RENAME TABLE pubsubNode TO ofPubsubNode;
+
+# Rename pubsubNodeJIDs to ofPubsubNodeJIDs
+RENAME TABLE pubsubNodeJIDs TO ofPubsubNodeJIDs;
+
+# Rename pubsubNodeGroups to ofPubsubNodeGroups
+ALTER TABLE pubsubNodeGroups DROP INDEX pubsubNodeGroups_idx;
+RENAME TABLE pubsubNodeGroups TO ofPubsubNodeGroups;
+ALTER TABLE ofPubsubNodeGroups ADD INDEX ofPubsubNodeGroups_idx (serviceID, nodeID);
+
+# Rename pubsubAffiliation to ofPubsubAffiliation
+RENAME TABLE pubsubAffiliation TO ofPubsubAffiliation;
+
+# Rename pubsubItem to ofPubsubItem
+RENAME TABLE pubsubItem TO ofPubsubItem;
+
+# Rename pubsubSubscription to ofPubsubSubscription
+RENAME TABLE pubsubSubscription TO ofPubsubSubscription;
+
+# Rename pubsubDefaultConf to ofPubsubDefaultConf
+RENAME TABLE pubsubDefaultConf TO ofPubsubDefaultConf;
+
+# Update version
+UPDATE ofVersion SET version = 19 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/2/openfire_mariadb.sql b/distribution/src/database/upgrade/2/openfire_mariadb.sql
new file mode 100644
index 0000000000..7ed065dc83
--- /dev/null
+++ b/distribution/src/database/upgrade/2/openfire_mariadb.sql
@@ -0,0 +1,42 @@
+
+# Update jiveVersion to JM 2.2
+UPDATE jiveVersion SET majorVersion=2, minorVersion=2;
+
+# jiveExtComponentConf: Create new table
+CREATE TABLE jiveExtComponentConf (
+ subdomain VARCHAR(255) NOT NULL,
+ secret VARCHAR(255),
+ permission VARCHAR(10) NOT NULL,
+ PRIMARY KEY (subdomain)
+);
+
+# jiveRemoteServerConf: Create new table
+CREATE TABLE jiveRemoteServerConf (
+ domain VARCHAR(255) NOT NULL,
+ remotePort INTEGER,
+ permission VARCHAR(10) NOT NULL,
+ PRIMARY KEY (domain)
+);
+
+# mucRoomProp: Create new table
+CREATE TABLE mucRoomProp (
+ roomID BIGINT NOT NULL,
+ name VARCHAR(100) NOT NULL,
+ propValue TEXT NOT NULL,
+ PRIMARY KEY (roomID, name)
+);
+
+# mucRoom: Add new columns: "useReservedNick", "canChangeNick" and "canRegister".
+ALTER TABLE mucRoom ADD COLUMN useReservedNick TINYINT NOT NULL;
+ALTER TABLE mucRoom ADD COLUMN canChangeNick TINYINT NOT NULL;
+ALTER TABLE mucRoom ADD COLUMN canRegister TINYINT NOT NULL;
+
+UPDATE mucRoom set useReservedNick=0, canChangeNick=1, canRegister=1;
+
+# jiveVCard: Recreate table from scratch
+DROP TABLE jiveVCard;
+CREATE TABLE jiveVCard (
+ username VARCHAR(32) NOT NULL,
+ value TEXT NOT NULL,
+ PRIMARY KEY (username)
+);
diff --git a/distribution/src/database/upgrade/20/openfire_mariadb.sql b/distribution/src/database/upgrade/20/openfire_mariadb.sql
new file mode 100644
index 0000000000..556a4f40ed
--- /dev/null
+++ b/distribution/src/database/upgrade/20/openfire_mariadb.sql
@@ -0,0 +1,5 @@
+# add wildcard column to ofExtComponentConf
+ALTER TABLE ofExtComponentConf ADD COLUMN wildcard TINYINT NOT NULL DEFAULT 0;
+
+# Update version
+UPDATE ofVersion SET version = 20 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/21/openfire_mariadb.sql b/distribution/src/database/upgrade/21/openfire_mariadb.sql
new file mode 100644
index 0000000000..3e3f5d8cfc
--- /dev/null
+++ b/distribution/src/database/upgrade/21/openfire_mariadb.sql
@@ -0,0 +1,3 @@
+# The database update has been implemented in org.jivesoftware.database.bugfix.OF33.java
+# Update version
+UPDATE ofVersion SET version = 21 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/22/openfire_mariadb.sql b/distribution/src/database/upgrade/22/openfire_mariadb.sql
new file mode 100644
index 0000000000..b33be2c76a
--- /dev/null
+++ b/distribution/src/database/upgrade/22/openfire_mariadb.sql
@@ -0,0 +1,7 @@
+// add columns for SASL SCRAM-SHA-1
+ALTER TABLE ofUser ADD COLUMN storedKey VARCHAR(32);
+ALTER TABLE ofUser ADD COLUMN serverKey VARCHAR(32);
+ALTER TABLE ofUser ADD COLUMN salt VARCHAR(32);
+ALTER TABLE ofUser ADD COLUMN iterations INTEGER;
+
+UPDATE ofVersion SET version = 22 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/23/openfire_mariadb.sql b/distribution/src/database/upgrade/23/openfire_mariadb.sql
new file mode 100644
index 0000000000..26ebc326f1
--- /dev/null
+++ b/distribution/src/database/upgrade/23/openfire_mariadb.sql
@@ -0,0 +1,2 @@
+ALTER TABLE ofMucRoom ADD COLUMN allowpm TINYINT NULL;
+UPDATE ofVersion SET version = 23 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/24/openfire_mariadb.sql b/distribution/src/database/upgrade/24/openfire_mariadb.sql
new file mode 100644
index 0000000000..df499090ca
--- /dev/null
+++ b/distribution/src/database/upgrade/24/openfire_mariadb.sql
@@ -0,0 +1,3 @@
+ALTER TABLE ofMucConversationLog ADD COLUMN stanza TEXT NULL;
+ALTER TABLE ofMucConversationLog ADD COLUMN messageID BIGINT NULL;
+UPDATE ofVersion SET version = 24 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/25/openfire_mariadb.sql b/distribution/src/database/upgrade/25/openfire_mariadb.sql
new file mode 100644
index 0000000000..4ef5de2530
--- /dev/null
+++ b/distribution/src/database/upgrade/25/openfire_mariadb.sql
@@ -0,0 +1,7 @@
+
+set @exist := (select count(*) from information_schema.statistics where table_name = 'ofMucConversationLog' and index_name = 'ofMucConvLog_msg_id' and table_schema = database());
+set @sqlstmt := if( @exist > 0, 'select ''INFO: Index already exists.''', 'create index ofMucConvLog_msg_id on ofMucConversationLog (messageID)');
+PREPARE stmt FROM @sqlstmt;
+EXECUTE stmt;
+
+UPDATE ofVersion SET version = 25 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/26/openfire_mariadb.sql b/distribution/src/database/upgrade/26/openfire_mariadb.sql
new file mode 100644
index 0000000000..516b3b9f5e
--- /dev/null
+++ b/distribution/src/database/upgrade/26/openfire_mariadb.sql
@@ -0,0 +1,4 @@
+ALTER TABLE ofProperty
+ ADD encrypted INTEGER;
+
+UPDATE ofVersion SET version = 26 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/27/openfire_mariadb.sql b/distribution/src/database/upgrade/27/openfire_mariadb.sql
new file mode 100644
index 0000000000..aadd11a544
--- /dev/null
+++ b/distribution/src/database/upgrade/27/openfire_mariadb.sql
@@ -0,0 +1,4 @@
+ALTER TABLE ofProperty
+ ADD iv CHAR(24);
+
+UPDATE ofVersion SET version = 27 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/28/openfire_mariadb.sql b/distribution/src/database/upgrade/28/openfire_mariadb.sql
new file mode 100644
index 0000000000..3adea3bcf8
--- /dev/null
+++ b/distribution/src/database/upgrade/28/openfire_mariadb.sql
@@ -0,0 +1,3 @@
+# The database update has been implemented in org.jivesoftware.database.bugfix.OF1515.java
+# Update version
+UPDATE ofVersion SET version = 28 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/29/openfire_mariadb.sql b/distribution/src/database/upgrade/29/openfire_mariadb.sql
new file mode 100644
index 0000000000..fc710637a5
--- /dev/null
+++ b/distribution/src/database/upgrade/29/openfire_mariadb.sql
@@ -0,0 +1,5 @@
+# Only when the update in 28 succeeded, drop the table that was used as its source.
+DROP TABLE ofPrivate;
+
+# Update version
+UPDATE ofVersion SET version = 29 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/30/openfire_mariadb.sql b/distribution/src/database/upgrade/30/openfire_mariadb.sql
new file mode 100644
index 0000000000..7c77ed4d5d
--- /dev/null
+++ b/distribution/src/database/upgrade/30/openfire_mariadb.sql
@@ -0,0 +1,3 @@
+INSERT INTO ofID (idType, id) VALUES (27, (SELECT coalesce(max(messageID), 1) FROM ofMucConversationLog) );
+
+UPDATE ofVersion SET version = 30 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/31/openfire_mariadb.sql b/distribution/src/database/upgrade/31/openfire_mariadb.sql
new file mode 100644
index 0000000000..db0f970d68
--- /dev/null
+++ b/distribution/src/database/upgrade/31/openfire_mariadb.sql
@@ -0,0 +1,13 @@
+# OF-2062: Allow for plenty of data to be stored.
+ALTER TABLE ofPubsubItem MODIFY payload LONGTEXT NULL;
+
+# OF-2061: Update the default configuration for leaf nodes of PEP services (those with a serviceID that contain the '@' symbol) to ensure that items are persisted.
+# provided that the maxPayloadSize still is at what Openfire used by default up to this point (5120).
+# OF-2062: Increase the maxPayloadSize in the default configuration for leaf nodes of PEP services (those with a serviceID that contain the '@' symbol,
+# which indicates that the serviceID matches a JID), provided that the maxPayloadSize still is at what Openfire used by default up to this point (5120).
+UPDATE ofPubsubDefaultConf SET persistItems = 1, maxPayloadSize = 10485760 WHERE serviceID LIKE '%@%' AND leaf = 1 AND maxPayloadSize = 5120;
+
+# OF-2061 & OF-262: Apply the same configuration change to all existing nodes that seem to use the default configuration.
+UPDATE ofPubsubNode SET persistItems = 1, maxPayloadSize = 10485760 WHERE serviceID LIKE '%@%' AND leaf = 1 AND maxPayloadSize = 5120;
+
+UPDATE ofVersion SET version = 31 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/32/openfire_mariadb.sql b/distribution/src/database/upgrade/32/openfire_mariadb.sql
new file mode 100644
index 0000000000..5647bb55ca
--- /dev/null
+++ b/distribution/src/database/upgrade/32/openfire_mariadb.sql
@@ -0,0 +1,6 @@
+ALTER TABLE ofMucRoom ADD COLUMN fmucEnabled TINYINT NULL;
+ALTER TABLE ofMucRoom ADD COLUMN fmucOutboundNode VARCHAR(255) NULL;
+ALTER TABLE ofMucRoom ADD COLUMN fmucOutboundMode TINYINT NULL;
+ALTER TABLE ofMucRoom ADD COLUMN fmucInboundNodes VARCHAR(4000) NULL;
+
+UPDATE ofVersion SET version = 32 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/33/openfire_mariadb.sql b/distribution/src/database/upgrade/33/openfire_mariadb.sql
new file mode 100644
index 0000000000..8736ebd3cc
--- /dev/null
+++ b/distribution/src/database/upgrade/33/openfire_mariadb.sql
@@ -0,0 +1,3 @@
+ALTER TABLE ofRoster ADD COLUMN stanza TEXT NULL;
+
+UPDATE ofVersion SET version = 33 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/34/openfire_mariadb.sql b/distribution/src/database/upgrade/34/openfire_mariadb.sql
new file mode 100644
index 0000000000..3867add0fc
--- /dev/null
+++ b/distribution/src/database/upgrade/34/openfire_mariadb.sql
@@ -0,0 +1,3 @@
+CREATE INDEX ofMucConversationLog_roomtime_idx ON ofMucConversationLog (roomID, logTime);
+
+UPDATE ofVersion SET version = 34 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/35/openfire_mariadb.sql b/distribution/src/database/upgrade/35/openfire_mariadb.sql
new file mode 100644
index 0000000000..1d863c3b90
--- /dev/null
+++ b/distribution/src/database/upgrade/35/openfire_mariadb.sql
@@ -0,0 +1,3 @@
+ALTER TABLE ofMucRoom ADD COLUMN preserveHistOnDel TINYINT NOT NULL DEFAULT 1;
+
+UPDATE ofVersion SET version = 35 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/36/openfire_mariadb.sql b/distribution/src/database/upgrade/36/openfire_mariadb.sql
new file mode 100644
index 0000000000..ad4a9a12a8
--- /dev/null
+++ b/distribution/src/database/upgrade/36/openfire_mariadb.sql
@@ -0,0 +1,12 @@
+ALTER TABLE ofMucRoom ADD COLUMN retireOnDeletion TINYINT NOT NULL DEFAULT 0;
+
+CREATE TABLE ofMucRoomRetiree (
+ serviceID BIGINT NOT NULL,
+ name VARCHAR(50) NOT NULL,
+ alternateJID VARCHAR(2000),
+ reason VARCHAR(1024),
+ retiredAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (serviceID,name)
+);
+
+UPDATE ofVersion SET version = 36 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/37/openfire_mariadb.sql b/distribution/src/database/upgrade/37/openfire_mariadb.sql
new file mode 100644
index 0000000000..ae7c1c2460
--- /dev/null
+++ b/distribution/src/database/upgrade/37/openfire_mariadb.sql
@@ -0,0 +1,3 @@
+DROP TABLE ofSASLAuthorized;
+
+UPDATE ofVersion SET version = 37 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/38/openfire_mariadb.sql b/distribution/src/database/upgrade/38/openfire_mariadb.sql
new file mode 100644
index 0000000000..067f6db966
--- /dev/null
+++ b/distribution/src/database/upgrade/38/openfire_mariadb.sql
@@ -0,0 +1,28 @@
+-- This copies the subject-defining stanza as stored in the message archive into the room's table, replacing any text
+-- based (non-stanza) subject that was stored there.
+-- In rare occasions (see OF-3131) the room can have a subject, while the history does not. In those cases, this script
+-- leaves the (non-stanza) subject in the ofMucRoom table intact (this means that the column holds a mixture of plain
+-- text and XMPP data).
+-- Note that the stanzas in ofMucConversationLog typically do not contain a timestamp (although one is provided in a
+-- separate column). If the subject that gets migrated to ofMucRoom is used as-is, the time of subject change is likely
+-- lost (until the room's subject gets changed). This is deemed an acceptable loss.
+ALTER TABLE ofMucRoom MODIFY subject TEXT NULL;
+
+UPDATE ofMucRoom r
+JOIN (
+ SELECT l.roomID, l.stanza
+ FROM ofMucConversationLog l
+ JOIN (
+ SELECT roomID, MAX(logTime) AS maxTime
+ FROM ofMucConversationLog
+ WHERE subject IS NOT NULL
+ GROUP BY roomID
+ ) latest
+ ON l.roomID = latest.roomID
+ AND l.logTime = latest.maxTime
+) c
+ON r.roomID = c.roomID
+SET r.subject = c.stanza
+WHERE c.stanza IS NOT NULL;
+
+UPDATE ofVersion SET version = 38 WHERE name = 'openfire';
diff --git a/distribution/src/database/upgrade/4/openfire_mariadb.sql b/distribution/src/database/upgrade/4/openfire_mariadb.sql
new file mode 100644
index 0000000000..7d94656688
--- /dev/null
+++ b/distribution/src/database/upgrade/4/openfire_mariadb.sql
@@ -0,0 +1,6 @@
+
+# Update jiveVersion to JM 2.4
+UPDATE jiveVersion SET majorVersion=2, minorVersion=4;
+
+# jiveGroupUser: Alter length of username column
+ALTER TABLE jiveGroupUser CHANGE username username varchar(100) NOT NULL;
diff --git a/distribution/src/database/upgrade/5/openfire_mariadb.sql b/distribution/src/database/upgrade/5/openfire_mariadb.sql
new file mode 100644
index 0000000000..165bee7310
--- /dev/null
+++ b/distribution/src/database/upgrade/5/openfire_mariadb.sql
@@ -0,0 +1,13 @@
+
+# Update jiveVersion to Openfire 2.5
+UPDATE jiveVersion SET majorVersion=2, minorVersion=5;
+
+# jivePrivacyList: Create new table
+CREATE TABLE jivePrivacyList (
+ username VARCHAR(32) NOT NULL,
+ name VARCHAR(100) NOT NULL,
+ isDefault TINYINT NOT NULL,
+ list TEXT NOT NULL,
+ PRIMARY KEY (username, name),
+ INDEX jivePList_default_idx (username, isDefault)
+);
diff --git a/distribution/src/database/upgrade/6/openfire_mariadb.sql b/distribution/src/database/upgrade/6/openfire_mariadb.sql
new file mode 100644
index 0000000000..9515c3a236
--- /dev/null
+++ b/distribution/src/database/upgrade/6/openfire_mariadb.sql
@@ -0,0 +1,13 @@
+
+# Update the jiveVersion table to new definition.
+DROP TABLE jiveVersion;
+CREATE TABLE jiveVersion (
+ name VARCHAR(50) NOT NULL,
+ version INTEGER NOT NULL,
+ PRIMARY KEY (name)
+);
+INSERT INTO jiveVersion (name, version) VALUES ('openfire', 6);
+
+# Make password column accept null, add encrypted password column.
+ALTER TABLE jiveUser MODIFY password VARCHAR(32) NULL;
+ALTER TABLE jiveUser ADD COLUMN encryptedPassword VARCHAR(255) NULL AFTER password;
diff --git a/distribution/src/database/upgrade/7/openfire_mariadb.sql b/distribution/src/database/upgrade/7/openfire_mariadb.sql
new file mode 100644
index 0000000000..4b07e97d1e
--- /dev/null
+++ b/distribution/src/database/upgrade/7/openfire_mariadb.sql
@@ -0,0 +1,101 @@
+
+# Create PubSub Tables
+
+CREATE TABLE pubsubNode (
+ serviceID VARCHAR(100) NOT NULL,
+ nodeID VARCHAR(100) NOT NULL,
+ leaf TINYINT NOT NULL,
+ creationDate CHAR(15) NOT NULL,
+ modificationDate CHAR(15) NOT NULL,
+ parent VARCHAR(100) NULL,
+ deliverPayloads TINYINT NOT NULL,
+ maxPayloadSize INTEGER NULL,
+ persistItems TINYINT NULL,
+ maxItems INTEGER NULL,
+ notifyConfigChanges TINYINT NOT NULL,
+ notifyDelete TINYINT NOT NULL,
+ notifyRetract TINYINT NOT NULL,
+ presenceBased TINYINT NOT NULL,
+ sendItemSubscribe TINYINT NOT NULL,
+ publisherModel VARCHAR(15) NOT NULL,
+ subscriptionEnabled TINYINT NOT NULL,
+ configSubscription TINYINT NOT NULL,
+ contacts VARCHAR(4000) NULL,
+ rosterGroups VARCHAR(4000) NULL,
+ accessModel VARCHAR(10) NOT NULL,
+ payloadType VARCHAR(100) NULL,
+ bodyXSLT VARCHAR(100) NULL,
+ dataformXSLT VARCHAR(100) NULL,
+ creator VARCHAR(1024) NOT NULL,
+ description VARCHAR(255) NULL,
+ language VARCHAR(255) NULL,
+ name VARCHAR(50) NULL,
+ replyPolicy VARCHAR(15) NULL,
+ replyRooms VARCHAR(4000) NULL,
+ replyTo VARCHAR(1024) NULL,
+ associationPolicy VARCHAR(15) NULL,
+ associationTrusted VARCHAR(4000) NULL,
+ maxLeafNodes INTEGER NULL,
+ PRIMARY KEY (serviceID, nodeID)
+);
+
+CREATE TABLE pubsubAffiliation (
+ serviceID VARCHAR(100) NOT NULL,
+ nodeID VARCHAR(100) NOT NULL,
+ jid VARCHAR(1024) NOT NULL,
+ affiliation VARCHAR(10) NOT NULL,
+ PRIMARY KEY (serviceID, nodeID, jid(70))
+);
+
+CREATE TABLE pubsubItem (
+ serviceID VARCHAR(100) NOT NULL,
+ nodeID VARCHAR(100) NOT NULL,
+ id VARCHAR(100) NOT NULL,
+ jid VARCHAR(1024) NOT NULL,
+ creationDate CHAR(15) NOT NULL,
+ payload TEXT NULL,
+ PRIMARY KEY (serviceID, nodeID, id)
+);
+
+CREATE TABLE pubsubSubscription (
+ serviceID VARCHAR(100) NOT NULL,
+ nodeID VARCHAR(100) NOT NULL,
+ id VARCHAR(100) NOT NULL,
+ jid VARCHAR(1024) NOT NULL,
+ owner VARCHAR(1024) NOT NULL,
+ state VARCHAR(15) NOT NULL,
+ deliver TINYINT NOT NULL,
+ digest TINYINT NOT NULL,
+ digest_frequency TINYINT NOT NULL,
+ expire CHAR(15) NULL,
+ includeBody TINYINT NOT NULL,
+ showValues VARCHAR(30) NOT NULL,
+ subscriptionType VARCHAR(10) NOT NULL,
+ subscriptionDepth TINYINT NOT NULL,
+ keyword VARCHAR(200) NULL,
+ PRIMARY KEY (serviceID, nodeID, id)
+);
+
+CREATE TABLE pubsubDefaultConf (
+ serviceID VARCHAR(100) NOT NULL,
+ leaf TINYINT NOT NULL,
+ deliverPayloads TINYINT NOT NULL,
+ maxPayloadSize INTEGER NOT NULL,
+ persistItems TINYINT NOT NULL,
+ maxItems INTEGER NOT NULL,
+ notifyConfigChanges TINYINT NOT NULL,
+ notifyDelete TINYINT NOT NULL,
+ notifyRetract TINYINT NOT NULL,
+ presenceBased TINYINT NOT NULL,
+ sendItemSubscribe TINYINT NOT NULL,
+ publisherModel VARCHAR(15) NOT NULL,
+ subscriptionEnabled TINYINT NOT NULL,
+ accessModel VARCHAR(10) NOT NULL,
+ language VARCHAR(255) NULL,
+ replyPolicy VARCHAR(15) NULL,
+ associationPolicy VARCHAR(15) NOT NULL,
+ maxLeafNodes INTEGER NOT NULL,
+ PRIMARY KEY (serviceID, leaf)
+);
+
+UPDATE jiveVersion set version=7 where name = 'openfire';
diff --git a/distribution/src/database/upgrade/8/openfire_mariadb.sql b/distribution/src/database/upgrade/8/openfire_mariadb.sql
new file mode 100644
index 0000000000..eef846027d
--- /dev/null
+++ b/distribution/src/database/upgrade/8/openfire_mariadb.sql
@@ -0,0 +1,25 @@
+
+# Drop old columns of pubSubNode
+ALTER TABLE pubsubNode DROP COLUMN contacts;
+ALTER TABLE pubsubNode DROP COLUMN rosterGroups;
+ALTER TABLE pubsubNode DROP COLUMN replyRooms;
+ALTER TABLE pubsubNode DROP COLUMN replyTo;
+ALTER TABLE pubsubNode DROP COLUMN associationTrusted;
+
+# Add new pubsub tables
+CREATE TABLE pubsubNodeJIDs (
+ serviceID VARCHAR(100) NOT NULL,
+ nodeID VARCHAR(100) NOT NULL,
+ jid VARCHAR(255) NOT NULL,
+ associationType VARCHAR(20) NOT NULL,
+ PRIMARY KEY (serviceID, nodeID, jid(70))
+);
+
+CREATE TABLE pubsubNodeGroups (
+ serviceID VARCHAR(100) NOT NULL,
+ nodeID VARCHAR(100) NOT NULL,
+ rosterGroup VARCHAR(100) NOT NULL,
+ INDEX pubsubNodeGroups_idx (serviceID, nodeID)
+);
+
+UPDATE jiveVersion set version=8 where name = 'openfire';
diff --git a/distribution/src/database/upgrade/9/openfire_mariadb.sql b/distribution/src/database/upgrade/9/openfire_mariadb.sql
new file mode 100644
index 0000000000..09968495cf
--- /dev/null
+++ b/distribution/src/database/upgrade/9/openfire_mariadb.sql
@@ -0,0 +1,18 @@
+
+# Increase size of username field
+ALTER TABLE jiveUser MODIFY username VARCHAR(64);
+ALTER TABLE jiveUserProp MODIFY username VARCHAR(64);
+
+ALTER TABLE jivePrivate DROP PRIMARY KEY;
+ALTER TABLE jivePrivate MODIFY username VARCHAR(64);
+ALTER TABLE jivePrivate ADD PRIMARY KEY (username, name, namespace(100));
+
+ALTER TABLE jiveOffline MODIFY username VARCHAR(64);
+ALTER TABLE jiveRoster MODIFY username VARCHAR(64);
+ALTER TABLE jiveVCard MODIFY username VARCHAR(64);
+ALTER TABLE jivePrivacyList MODIFY username VARCHAR(64);
+
+# Increase size of column digest_frequency in pubsubSubscription
+ALTER TABLE pubsubSubscription MODIFY digest_frequency INT NOT NULL;
+
+UPDATE jiveVersion set version=9 where name = 'openfire';
diff --git a/documentation/database.html b/documentation/database.html
index 40901bfac0..453a431599 100644
--- a/documentation/database.html
+++ b/documentation/database.html
@@ -27,7 +27,7 @@
Introduction
JDBC drivers are required for Openfire to communicate with your database. Suggested drivers for particular
- databases are noted below where applicable. Openfire bundles JDBC drivers for MySQL, Oracle, PostgreSQL,
+ databases are noted below where applicable. Openfire bundles JDBC drivers for MySQL, MariaDB, Oracle, PostgreSQL,
Microsoft SQL Server, and HSQLDB.