Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 21 additions & 21 deletions distribution/src/database/openfire_postgresql.sql
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ CREATE TABLE ofUser (
encryptedPassword VARCHAR(255),
name VARCHAR(100),
email VARCHAR(100),
creationDate CHAR(15) NOT NULL,
modificationDate CHAR(15) NOT NULL,
creationDate TIMESTAMP WITH TIME ZONE NOT NULL,
modificationDate TIMESTAMP WITH TIME ZONE NOT NULL,
CONSTRAINT ofUser_pk PRIMARY KEY (username)
);
CREATE INDEX ofUser_cDate_idx ON ofUser (creationDate);
Expand All @@ -29,8 +29,8 @@ CREATE TABLE ofUserProp (
CREATE TABLE ofUserFlag (
username VARCHAR(64) NOT NULL,
name VARCHAR(100) NOT NULL,
startTime CHAR(15),
endTime CHAR(15),
startTime TIMESTAMP WITH TIME ZONE,
endTime TIMESTAMP WITH TIME ZONE,
CONSTRAINT ofUserFlag_pk PRIMARY KEY (username, name)
);
CREATE INDEX ofUserFlag_sTime_idx ON ofUserFlag (startTime);
Expand All @@ -40,7 +40,7 @@ CREATE INDEX ofUserFlag_eTime_idx ON ofUserFlag (endTime);
CREATE TABLE ofOffline (
username VARCHAR(64) NOT NULL,
messageID INTEGER NOT NULL,
creationDate CHAR(15) NOT NULL,
creationDate TIMESTAMP WITH TIME ZONE NOT NULL,
messageSize INTEGER NOT NULL,
stanza TEXT NOT NULL,
CONSTRAINT ofOffline_pk PRIMARY KEY (username, messageID)
Expand All @@ -50,7 +50,7 @@ CREATE TABLE ofOffline (
CREATE TABLE ofPresence (
username VARCHAR(64) NOT NULL,
offlinePresence TEXT,
offlineDate VARCHAR(15) NOT NULL,
offlineDate TIMESTAMP WITH TIME ZONE NOT NULL,
CONSTRAINT ofPresence_pk PRIMARY KEY (username)
);

Expand Down Expand Up @@ -108,7 +108,7 @@ CREATE TABLE ofGroupUser (
administrator INTEGER NOT NULL,
CONSTRAINT ofGroupUser_pk PRIMARY KEY (groupName, username, administrator)
);


CREATE TABLE ofID (
idType INTEGER NOT NULL,
Expand Down Expand Up @@ -189,13 +189,13 @@ CREATE TABLE ofMucServiceProp (
CREATE TABLE ofMucRoom (
serviceID INTEGER NOT NULL,
roomID INTEGER NOT NULL,
creationDate CHAR(15) NOT NULL,
modificationDate CHAR(15) NOT NULL,
creationDate TIMESTAMP WITH TIME ZONE NOT NULL,
modificationDate TIMESTAMP WITH TIME ZONE NOT NULL,
name VARCHAR(50) NOT NULL,
naturalName VARCHAR(255) NOT NULL,
description VARCHAR(255),
lockedDate CHAR(15) NOT NULL,
emptyDate CHAR(15) NULL,
lockedDate TIMESTAMP WITH TIME ZONE NOT NULL,
emptyDate TIMESTAMP WITH TIME ZONE NULL,
canChangeSubject INTEGER NOT NULL,
maxUsers INTEGER NOT NULL,
publicRoom INTEGER NOT NULL,
Expand Down Expand Up @@ -234,7 +234,7 @@ CREATE TABLE ofMucRoomRetiree (
name VARCHAR(50) NOT NULL,
alternateJID VARCHAR(2000),
reason VARCHAR(1024),
retiredAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
retiredAt TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP WITH TIME ZONE,
CONSTRAINT ofMucRoomRetiree_pk PRIMARY KEY (serviceID, name)
);

Expand All @@ -259,13 +259,13 @@ CREATE TABLE ofMucMember (

CREATE TABLE ofMucConversationLog (
roomID INTEGER NOT NULL,
messageID INTEGER NOT NULL,
messageID INTEGER NOT NULL,
sender VARCHAR(1024) NOT NULL,
nickname VARCHAR(255) NULL,
logTime CHAR(15) NOT NULL,
logTime TIMESTAMP WITH TIME ZONE NOT NULL,
subject VARCHAR(255) NULL,
body TEXT NULL,
stanza TEXT NULL
stanza TEXT NULL
);
CREATE INDEX ofMucConversationLog_roomtime_idx ON ofMucConversationLog (roomID, logTime);
CREATE INDEX ofMucConversationLog_time_idx ON ofMucConversationLog (logTime);
Expand All @@ -278,8 +278,8 @@ CREATE TABLE ofPubsubNode (
serviceID VARCHAR(100) NOT NULL,
nodeID VARCHAR(100) NOT NULL,
leaf INTEGER NOT NULL,
creationDate CHAR(15) NOT NULL,
modificationDate CHAR(15) NOT NULL,
creationDate TIMESTAMP WITH TIME ZONE NOT NULL,
modificationDate TIMESTAMP WITH TIME ZONE NOT NULL,
parent VARCHAR(100) NULL,
deliverPayloads INTEGER NOT NULL,
maxPayloadSize INTEGER NULL,
Expand Down Expand Up @@ -335,7 +335,7 @@ CREATE TABLE ofPubsubItem (
nodeID VARCHAR(100) NOT NULL,
id VARCHAR(100) NOT NULL,
jid VARCHAR(1024) NOT NULL,
creationDate CHAR(15) NOT NULL,
creationDate TIMESTAMP WITH TIME ZONE NOT NULL,
payload TEXT NULL,
CONSTRAINT ofPubsubItem_pk PRIMARY KEY (serviceID, nodeID, id)
);
Expand All @@ -350,7 +350,7 @@ CREATE TABLE ofPubsubSubscription (
deliver INTEGER NOT NULL,
digest INTEGER NOT NULL,
digest_frequency INTEGER NOT NULL,
expire CHAR(15) NULL,
expire TIMESTAMP WITH TIME ZONE NULL,
includeBody INTEGER NOT NULL,
showValues VARCHAR(30) NOT NULL,
subscriptionType VARCHAR(10) NOT NULL,
Expand Down Expand Up @@ -391,10 +391,10 @@ 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', '[email protected]', '0', '0');
VALUES ('admin', 'admin', 'Administrator', '[email protected]', 'epoch', 'epoch');

-- 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', 37);
INSERT INTO ofVersion (name, version) VALUES ('openfire', 38);
89 changes: 89 additions & 0 deletions distribution/src/database/upgrade/38/openfire_mysql.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
-- OF-2500: Switch from string-based to timestamp-based representations of date/time values.
ALTER TABLE ofUser
ADD COLUMN creationDateNew TIMESTAMP WITH TIME ZONE,
ADD COLUMN modificationDateNew TIMESTAMP;

UPDATE ofUser SET
creationDateNew = FROM_UNIXTIME(CAST(creationDate AS UNSIGNED) / 1000.0),
modificationDateNew = FROM_UNIXTIME(CAST(modificationDate AS UNSIGNED) / 1000.0);

ALTER TABLE ofUser
DROP COLUMN creationDate,
DROP COLUMN modificationDate;

ALTER TABLE ofUser
RENAME COLUMN creationDateNew TO creationDate,
RENAME COLUMN modificationDateNew TO modificationDate;



ALTER TABLE ofUserFlag
ADD COLUMN startTimeNew TIMESTAMP,
ADD COLUMN endTimeNew TIMESTAMP;

UPDATE ofUserFlag SET
startTimeNew = FROM_UNIXTIME(CAST(startTime AS UNSIGNED) / 1000.0),
endTimeNew = FROM_UNIXTIME(CAST(endTime AS UNSIGNED) / 1000.0);

ALTER TABLE ofUserFlag
DROP COLUMN startTime,
DROP COLUMN endTime;

ALTER TABLE ofUserFlag
RENAME COLUMN startTimeNew TO startTime,
RENAME COLUMN endTimeNew TO endTime;



ALTER TABLE ofOffline
ADD COLUMN creationDateNew TIMESTAMP

UPDATE ofOffline SET
creationDateNew = FROM_UNIXTIME(CAST(creationDate AS UNSIGNED) / 1000.0);

ALTER TABLE ofOffline
DROP COLUMN creationDate;

ALTER TABLE ofOffline
RENAME COLUMN creationDateNew TO creationDate;



ALTER TABLE ofOffline
ALTER COLUMN creationDate SET DATA TYPE TIMESTAMP
USING to_timestamp(CAST(creationDate AS BIGINT) / 1e3);


ALTER TABLE ofPresence
ALTER COLUMN offlineDate SET DATA TYPE TIMESTAMP
USING to_timestamp(CAST(offlineDate AS BIGINT) / 1e3);

ALTER TABLE ofMucRoom
ALTER COLUMN creationDate SET DATA TYPE TIMESTAMP
USING to_timestamp(CAST(creationDate AS BIGINT) / 1e3),
ALTER COLUMN modificationDate SET DATA TYPE TIMESTAMP
USING to_timestamp(CAST(modificationDate AS BIGINT) / 1e3),
ALTER COLUMN lockedDate SET DATA TYPE TIMESTAMP
USING to_timestamp(CAST(lockedDate AS BIGINT) / 1e3),
ALTER COLUMN emptyDate SET DATA TYPE TIMESTAMP
USING to_timestamp(CAST(emptyDate AS BIGINT) / 1e3);

ALTER TABLE ofMucConversationLog
ALTER COLUMN logTime SET DATA TYPE TIMESTAMP
USING to_timestamp(CAST(logTime AS BIGINT) / 1e3);

ALTER TABLE ofPubsubNode
ALTER COLUMN creationDate SET DATA TYPE TIMESTAMP
USING to_timestamp(CAST(creationDate AS BIGINT) / 1e3),
ALTER COLUMN modificationDate SET DATA TYPE TIMESTAMP
USING to_timestamp(CAST(modificationDate AS BIGINT) / 1e3);

ALTER TABLE ofPubsubItem
ALTER COLUMN creationDate SET DATA TYPE TIMESTAMP
USING to_timestamp(CAST(creationDate AS BIGINT) / 1e3);

ALTER TABLE ofPubsubSubscription
ALTER COLUMN expire SET DATA TYPE TIMESTAMP
USING to_timestamp(CAST(expire AS BIGINT) / 1e3);

UPDATE ofVersion SET version = 38 WHERE name = 'openfire';
51 changes: 51 additions & 0 deletions distribution/src/database/upgrade/38/openfire_postgresql.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
-- OF-2500: Switch from string-based to timestamp-based representations of date/time values.

ALTER TABLE ofUser
ALTER COLUMN creationDate SET DATA TYPE TIMESTAMP WITH TIME ZONE
USING to_timestamp(CAST(creationDate AS BIGINT) / 1000.0) AT TIME ZONE 'UTC',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This didn't work for me as the resulting timestamp is naive.

select (timestamp '1970-01-01 00:00:00 UTC' + cast(creationDate as bigint) / 1e3 * INTERVAL '1 second') at time zone 'UTC',
to_timestamp(CAST(creationDate AS BIGINT) / 1000.0) AT TIME ZONE 'UTC' from ofuser limit 1;
          timezone          |        timezone         
----------------------------+-------------------------
 2011-12-27 08:30:52.502-06 | 2011-12-27 14:30:52.502

Copy link
Member

@akrherz akrherz Sep 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This appears to work from my local testing

ALTER TABLE ofUser
    ALTER COLUMN creationDate SET DATA TYPE TIMESTAMP WITH TIME ZONE
        USING (timestamp '1970-01-01 00:00:00' + cast(creationDate as bigint) / 1000.0 * INTERVAL '1 second') at time zone 'UTC',
    ALTER COLUMN modificationDate SET DATA TYPE TIMESTAMP WITH TIME ZONE
        USING (timestamp '1970-01-01 00:00:00' + cast(modificationDate as bigint) / 1000.0 * INTERVAL '1 second') at time zone 'UTC';

ALTER COLUMN modificationDate SET DATA TYPE TIMESTAMP WITH TIME ZONE
USING to_timestamp(CAST(modificationDate AS BIGINT) / 1000.0) AT TIME ZONE 'UTC';

ALTER TABLE ofUserFlag
ALTER COLUMN startTime SET DATA TYPE TIMESTAMP WITH TIME ZONE
USING to_timestamp(CAST(startTime AS BIGINT) / 1000.0) AT TIME ZONE 'UTC',
ALTER COLUMN endTime SET DATA TYPE TIMESTAMP WITH TIME ZONE
USING to_timestamp(CAST(endTime AS BIGINT) / 1000.0) AT TIME ZONE 'UTC';

ALTER TABLE ofOffline
ALTER COLUMN creationDate SET DATA TYPE TIMESTAMP WITH TIME ZONE
USING to_timestamp(CAST(creationDate AS BIGINT) / 1000.0) AT TIME ZONE 'UTC';

ALTER TABLE ofPresence
ALTER COLUMN offlineDate SET DATA TYPE TIMESTAMP WITH TIME ZONE
USING to_timestamp(CAST(offlineDate AS BIGINT) / 1000.0) AT TIME ZONE 'UTC';

ALTER TABLE ofMucRoom
ALTER COLUMN creationDate SET DATA TYPE TIMESTAMP WITH TIME ZONE
USING to_timestamp(CAST(creationDate AS BIGINT) / 1000.0) AT TIME ZONE 'UTC',
ALTER COLUMN modificationDate SET DATA TYPE TIMESTAMP WITH TIME ZONE
USING to_timestamp(CAST(modificationDate AS BIGINT) / 1000.0) AT TIME ZONE 'UTC',
ALTER COLUMN lockedDate SET DATA TYPE TIMESTAMP WITH TIME ZONE
USING to_timestamp(CAST(lockedDate AS BIGINT) / 1000.0) AT TIME ZONE 'UTC',
ALTER COLUMN emptyDate SET DATA TYPE TIMESTAMP WITH TIME ZONE
USING to_timestamp(CAST(emptyDate AS BIGINT) / 1000.0) AT TIME ZONE 'UTC';

ALTER TABLE ofMucConversationLog
ALTER COLUMN logTime SET DATA TYPE TIMESTAMP WITH TIME ZONE
USING to_timestamp(CAST(logTime AS BIGINT) / 1000.0) AT TIME ZONE 'UTC';

ALTER TABLE ofPubsubNode
ALTER COLUMN creationDate SET DATA TYPE TIMESTAMP WITH TIME ZONE
USING to_timestamp(CAST(creationDate AS BIGINT) / 1000.0) AT TIME ZONE 'UTC',
ALTER COLUMN modificationDate SET DATA TYPE TIMESTAMP WITH TIME ZONE
USING to_timestamp(CAST(modificationDate AS BIGINT) / 1000.0) AT TIME ZONE 'UTC';

ALTER TABLE ofPubsubItem
ALTER COLUMN creationDate SET DATA TYPE TIMESTAMP WITH TIME ZONE
USING to_timestamp(CAST(creationDate AS BIGINT) / 1000.0) AT TIME ZONE 'UTC';

ALTER TABLE ofPubsubSubscription
ALTER COLUMN expire SET DATA TYPE TIMESTAMP WITH TIME ZONE
USING to_timestamp(CAST(expire AS BIGINT) / 1000.0) AT TIME ZONE 'UTC';

UPDATE ofVersion SET version = 38 WHERE name = 'openfire';
Loading
Loading