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.