1 parent
1b12899ff6
commit
a3ac2a68fe
33 files changed
+5422
-28
No files matched your search
+12
-1
@@ -43,7 +43,18 @@ V054 adds three appearance columns to `display_preferences` and calendar reminde
|
||||
|
||||
Fresh installations already contain the columns in `schema.sql`. Existing V053 tenants execute `V054__theme_schedule_account_color_and_reminders.sql`.
|
||||
|
||||
The next migration number is **V055**.
|
||||
## V055 — CalDAV / CardDAV
|
||||
|
||||
V055 prepares the calendar and contacts tables for the optional CalDAV/CardDAV server (`[dav]`):
|
||||
|
||||
- `calendar_events.dav_name` / `contacts.dav_name` (nullable) — resource name chosen by the DAV client (e.g. `4f9e….ics`); rows created in the webmail keep `NULL` and are served as `<id>.ics` / `<id>.vcf`;
|
||||
- `calendar_events.dav_data` / `contacts.dav_data` (nullable) — the iCalendar object / vCard exactly as uploaded, so time zones, recurrence exceptions, alarms and vendor properties survive; webmail edits are patched into it;
|
||||
- `idx_contacts_email` becomes a regular (non-unique) index, because an address book may contain several cards with the same address (and cards without any address);
|
||||
- new indexes `idx_calendar_events_dav_name` and `idx_contacts_dav_name`.
|
||||
|
||||
Fresh installations already contain the columns in `schema.sql`. Existing V054 tenants execute `V055__caldav_carddav.sql`.
|
||||
|
||||
The next migration number is **V056**.
|
||||
|
||||
## Migration rules
|
||||
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
ALTER TABLE {{p}}calendar_events
|
||||
ADD COLUMN dav_name VARCHAR(255),
|
||||
ADD COLUMN dav_data LONGTEXT;
|
||||
|
||||
ALTER TABLE {{p}}contacts
|
||||
ADD COLUMN dav_name VARCHAR(255),
|
||||
ADD COLUMN dav_data LONGTEXT;
|
||||
|
||||
DROP INDEX {{p}}idx_contacts_email ON {{p}}contacts;
|
||||
|
||||
CREATE INDEX {{p}}idx_contacts_email ON {{p}}contacts (email);
|
||||
|
||||
CREATE INDEX {{p}}idx_calendar_events_dav_name ON {{p}}calendar_events (dav_name);
|
||||
|
||||
CREATE INDEX {{p}}idx_contacts_dav_name ON {{p}}contacts (dav_name);
|
||||
@@ -1,7 +1,7 @@
|
||||
-- RustBox 0.2.0 MySQL schema.
|
||||
-- One physical database contains global sessions plus isolated per-account tables.
|
||||
-- Application tables are materialized by replacing {{p}} with a collision-checked prefix.
|
||||
-- Squashed compatibility baseline: V052; current schema: V054.
|
||||
-- Squashed compatibility baseline: V052; current schema: V055.
|
||||
|
||||
-- RUSTBOX:GLOBAL-BEGIN
|
||||
CREATE TABLE IF NOT EXISTS rustbox_accounts (
|
||||
@@ -59,6 +59,8 @@ CREATE TABLE {{p}}calendar_events (
|
||||
color TEXT,
|
||||
reminder_minutes BIGINT,
|
||||
reminder_extra_minutes BIGINT,
|
||||
dav_name VARCHAR(255),
|
||||
dav_data LONGTEXT,
|
||||
created_at VARCHAR(64) NOT NULL DEFAULT (CAST(CURRENT_TIMESTAMP AS CHAR)),
|
||||
updated_at VARCHAR(64) NOT NULL DEFAULT (CAST(CURRENT_TIMESTAMP AS CHAR))
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
@@ -122,7 +124,9 @@ CREATE TABLE {{p}}contacts (
|
||||
birthday TEXT NOT NULL DEFAULT (''),
|
||||
emails_json LONGTEXT NOT NULL DEFAULT ('[]'),
|
||||
phones_json LONGTEXT NOT NULL DEFAULT ('[]'),
|
||||
addresses_json LONGTEXT NOT NULL DEFAULT ('[]')
|
||||
addresses_json LONGTEXT NOT NULL DEFAULT ('[]'),
|
||||
dav_name VARCHAR(255),
|
||||
dav_data LONGTEXT
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE {{p}}display_preferences (
|
||||
@@ -461,9 +465,11 @@ ALTER TABLE {{p}}messages ADD CONSTRAINT {{p}}fk_messages_0 FOREIGN KEY (folder)
|
||||
|
||||
CREATE INDEX {{p}}idx_calendar_events_source_uid ON {{p}}calendar_events (source_uid);
|
||||
CREATE INDEX {{p}}idx_calendar_events_time ON {{p}}calendar_events (start_time, end_time);
|
||||
CREATE INDEX {{p}}idx_calendar_events_dav_name ON {{p}}calendar_events (dav_name);
|
||||
CREATE INDEX {{p}}idx_cgm_contact_id ON {{p}}contact_group_members (contact_id);
|
||||
CREATE INDEX {{p}}idx_contacts_contact_count ON {{p}}contacts (contact_count DESC);
|
||||
CREATE UNIQUE INDEX {{p}}idx_contacts_email ON {{p}}contacts (email);
|
||||
CREATE INDEX {{p}}idx_contacts_email ON {{p}}contacts (email);
|
||||
CREATE INDEX {{p}}idx_contacts_dav_name ON {{p}}contacts (dav_name);
|
||||
CREATE INDEX {{p}}idx_contacts_last_contacted ON {{p}}contacts (last_contacted DESC);
|
||||
CREATE INDEX {{p}}idx_contacts_name ON {{p}}contacts (name);
|
||||
CREATE INDEX {{p}}idx_known_addresses_name ON {{p}}known_addresses (name);
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
ALTER TABLE {{p}}calendar_events
|
||||
ADD COLUMN dav_name TEXT,
|
||||
ADD COLUMN dav_data TEXT;
|
||||
|
||||
ALTER TABLE {{p}}contacts
|
||||
ADD COLUMN dav_name TEXT,
|
||||
ADD COLUMN dav_data TEXT;
|
||||
|
||||
DROP INDEX IF EXISTS {{p}}idx_contacts_email;
|
||||
|
||||
CREATE INDEX {{p}}idx_contacts_email ON {{p}}contacts (email);
|
||||
|
||||
CREATE INDEX {{p}}idx_calendar_events_dav_name ON {{p}}calendar_events (dav_name);
|
||||
|
||||
CREATE INDEX {{p}}idx_contacts_dav_name ON {{p}}contacts (dav_name);
|
||||
@@ -1,7 +1,7 @@
|
||||
-- RustBox 0.2.0 PostgreSQL schema.
|
||||
-- One physical database contains global sessions plus isolated per-account tables.
|
||||
-- Application tables are materialized by replacing {{p}} with a collision-checked prefix.
|
||||
-- Squashed compatibility baseline: V052; current schema: V054.
|
||||
-- Squashed compatibility baseline: V052; current schema: V055.
|
||||
|
||||
-- RUSTBOX:GLOBAL-BEGIN
|
||||
CREATE TABLE IF NOT EXISTS rustbox_accounts (
|
||||
@@ -59,6 +59,8 @@ CREATE TABLE {{p}}calendar_events (
|
||||
color TEXT,
|
||||
reminder_minutes BIGINT,
|
||||
reminder_extra_minutes BIGINT,
|
||||
dav_name TEXT,
|
||||
dav_data TEXT,
|
||||
created_at TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP::text),
|
||||
updated_at TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP::text)
|
||||
);
|
||||
@@ -122,7 +124,9 @@ CREATE TABLE {{p}}contacts (
|
||||
birthday TEXT NOT NULL DEFAULT '',
|
||||
emails_json TEXT NOT NULL DEFAULT '[]',
|
||||
phones_json TEXT NOT NULL DEFAULT '[]',
|
||||
addresses_json TEXT NOT NULL DEFAULT '[]'
|
||||
addresses_json TEXT NOT NULL DEFAULT '[]',
|
||||
dav_name TEXT,
|
||||
dav_data TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE {{p}}display_preferences (
|
||||
@@ -462,9 +466,11 @@ ALTER TABLE {{p}}messages ADD CONSTRAINT {{p}}fk_messages_0 FOREIGN KEY (folder)
|
||||
|
||||
CREATE INDEX {{p}}idx_calendar_events_source_uid ON {{p}}calendar_events (source_uid);
|
||||
CREATE INDEX {{p}}idx_calendar_events_time ON {{p}}calendar_events (start_time, end_time);
|
||||
CREATE INDEX {{p}}idx_calendar_events_dav_name ON {{p}}calendar_events (dav_name);
|
||||
CREATE INDEX {{p}}idx_cgm_contact_id ON {{p}}contact_group_members (contact_id);
|
||||
CREATE INDEX {{p}}idx_contacts_contact_count ON {{p}}contacts (contact_count DESC);
|
||||
CREATE UNIQUE INDEX {{p}}idx_contacts_email ON {{p}}contacts (email);
|
||||
CREATE INDEX {{p}}idx_contacts_email ON {{p}}contacts (email);
|
||||
CREATE INDEX {{p}}idx_contacts_dav_name ON {{p}}contacts (dav_name);
|
||||
CREATE INDEX {{p}}idx_contacts_last_contacted ON {{p}}contacts (last_contacted DESC);
|
||||
CREATE INDEX {{p}}idx_contacts_name ON {{p}}contacts (name);
|
||||
CREATE INDEX {{p}}idx_known_addresses_name ON {{p}}known_addresses (name);
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
ALTER TABLE {{p}}calendar_events
|
||||
ADD COLUMN dav_name TEXT;
|
||||
|
||||
ALTER TABLE {{p}}calendar_events
|
||||
ADD COLUMN dav_data TEXT;
|
||||
|
||||
ALTER TABLE {{p}}contacts
|
||||
ADD COLUMN dav_name TEXT;
|
||||
|
||||
ALTER TABLE {{p}}contacts
|
||||
ADD COLUMN dav_data TEXT;
|
||||
|
||||
DROP INDEX IF EXISTS {{p}}idx_contacts_email;
|
||||
|
||||
CREATE INDEX {{p}}idx_contacts_email ON {{p}}contacts(email);
|
||||
|
||||
CREATE INDEX {{p}}idx_calendar_events_dav_name ON {{p}}calendar_events(dav_name);
|
||||
|
||||
CREATE INDEX {{p}}idx_contacts_dav_name ON {{p}}contacts(dav_name);
|
||||
@@ -1,7 +1,7 @@
|
||||
-- RustBox 0.2.0 SQLite schema.
|
||||
-- One physical database contains global sessions plus isolated per-account tables.
|
||||
-- Application tables are materialized from the tenant section by replacing {{p}}.
|
||||
-- Squashed compatibility baseline: V052; current schema: V054.
|
||||
-- Squashed compatibility baseline: V052; current schema: V055.
|
||||
|
||||
-- RUSTBOX:GLOBAL-BEGIN
|
||||
CREATE TABLE IF NOT EXISTS rustbox_accounts (
|
||||
@@ -59,6 +59,8 @@ CREATE TABLE {{p}}calendar_events (
|
||||
color TEXT,
|
||||
reminder_minutes INTEGER,
|
||||
reminder_extra_minutes INTEGER,
|
||||
dav_name TEXT,
|
||||
dav_data TEXT,
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
||||
);
|
||||
@@ -117,7 +119,7 @@ CREATE TABLE {{p}}contacts (
|
||||
source TEXT NOT NULL DEFAULT 'manual',
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
phone TEXT NOT NULL DEFAULT '', job_title TEXT NOT NULL DEFAULT '', address TEXT NOT NULL DEFAULT '', website TEXT NOT NULL DEFAULT '', birthday TEXT NOT NULL DEFAULT '', emails_json TEXT NOT NULL DEFAULT '[]', phones_json TEXT NOT NULL DEFAULT '[]', addresses_json TEXT NOT NULL DEFAULT '[]');
|
||||
phone TEXT NOT NULL DEFAULT '', job_title TEXT NOT NULL DEFAULT '', address TEXT NOT NULL DEFAULT '', website TEXT NOT NULL DEFAULT '', birthday TEXT NOT NULL DEFAULT '', emails_json TEXT NOT NULL DEFAULT '[]', phones_json TEXT NOT NULL DEFAULT '[]', addresses_json TEXT NOT NULL DEFAULT '[]', dav_name TEXT, dav_data TEXT);
|
||||
|
||||
CREATE TABLE {{p}}display_preferences (
|
||||
id INTEGER PRIMARY KEY DEFAULT 1 CHECK (id = 1),
|
||||
@@ -359,12 +361,14 @@ CREATE TABLE {{p}}user_meta (
|
||||
CREATE INDEX {{p}}idx_calendar_events_source_uid ON {{p}}calendar_events(source_uid);
|
||||
|
||||
CREATE INDEX {{p}}idx_calendar_events_time ON {{p}}calendar_events(start_time, end_time);
|
||||
CREATE INDEX {{p}}idx_calendar_events_dav_name ON {{p}}calendar_events(dav_name);
|
||||
|
||||
CREATE INDEX {{p}}idx_cgm_contact_id ON {{p}}contact_group_members(contact_id);
|
||||
|
||||
CREATE INDEX {{p}}idx_contacts_contact_count ON {{p}}contacts(contact_count DESC);
|
||||
|
||||
CREATE UNIQUE INDEX {{p}}idx_contacts_email ON {{p}}contacts(email);
|
||||
CREATE INDEX {{p}}idx_contacts_email ON {{p}}contacts(email);
|
||||
CREATE INDEX {{p}}idx_contacts_dav_name ON {{p}}contacts(dav_name);
|
||||
|
||||
CREATE INDEX {{p}}idx_contacts_last_contacted ON {{p}}contacts(last_contacted DESC);
|
||||
|
||||
|
||||
Reference in new issue
Block a user