From 50d6ea30e0d72a2fbe7142d51b6c112540a8cdea Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Sat, 1 Feb 2020 09:40:11 +0100 Subject: [PATCH] Support for language codes up to 16 chars long (e.g. es-419) in database schema (#6851) --- CHANGELOG | 1 + SQL/mssql.initial.sql | 6 ++-- SQL/mssql/2020020100.sql | 4 +++ SQL/mysql.initial.sql | 6 ++-- SQL/mysql/2020020100.sql | 2 ++ SQL/oracle.initial.sql | 6 ++-- SQL/oracle/2020020100.sql | 2 ++ SQL/postgres.initial.sql | 6 ++-- SQL/postgres/2020020100.sql | 2 ++ SQL/sqlite.initial.sql | 8 +++--- SQL/sqlite/2020020100.sql | 57 +++++++++++++++++++++++++++++++++++++ 11 files changed, 84 insertions(+), 16 deletions(-) create mode 100644 SQL/mssql/2020020100.sql create mode 100644 SQL/mysql/2020020100.sql create mode 100644 SQL/oracle/2020020100.sql create mode 100644 SQL/postgres/2020020100.sql create mode 100644 SQL/sqlite/2020020100.sql diff --git a/CHANGELOG b/CHANGELOG index 3eeb60180..b41be7beb 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Support for language codes up to 16 chars long (e.g. es-419) in database schema (#6851) - Relaxed domain name validation for extended TLDs support (#5588) - Added support for INSERT OR REPLACE queries (#6771) - Extract RFC2231 attachment name from message headers (#6729, #6783) diff --git a/SQL/mssql.initial.sql b/SQL/mssql.initial.sql index e9d6d934d..6f910ead2 100644 --- a/SQL/mssql.initial.sql +++ b/SQL/mssql.initial.sql @@ -102,14 +102,14 @@ CREATE TABLE [dbo].[users] ( [last_login] [datetime] NULL , [failed_login] [datetime] NULL , [failed_login_counter] [int] NULL , - [language] [varchar] (5) COLLATE Latin1_General_CI_AI NULL , + [language] [varchar] (16) COLLATE Latin1_General_CI_AI NULL , [preferences] [text] COLLATE Latin1_General_CI_AI NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO CREATE TABLE [dbo].[dictionary] ( [user_id] [int] , - [language] [varchar] (5) COLLATE Latin1_General_CI_AI NOT NULL , + [language] [varchar] (16) COLLATE Latin1_General_CI_AI NOT NULL , [data] [text] COLLATE Latin1_General_CI_AI NOT NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO @@ -422,6 +422,6 @@ CREATE TRIGGER [contact_delete_member] ON [dbo].[contacts] WHERE [contact_id] IN (SELECT [contact_id] FROM deleted) GO -INSERT INTO [dbo].[system] ([name], [value]) VALUES ('roundcube-version', '2019092900') +INSERT INTO [dbo].[system] ([name], [value]) VALUES ('roundcube-version', '2020020100') GO \ No newline at end of file diff --git a/SQL/mssql/2020020100.sql b/SQL/mssql/2020020100.sql new file mode 100644 index 000000000..c5d059713 --- /dev/null +++ b/SQL/mssql/2020020100.sql @@ -0,0 +1,4 @@ +ALTER TABLE [dbo].[users] ALTER COLUMN [language] [varchar] (16) COLLATE Latin1_General_CI_AI NULL +GO +ALTER TABLE [dbo].[dictionary] ALTER COLUMN [language] [varchar] (16) COLLATE Latin1_General_CI_AI NOT NULL +GO diff --git a/SQL/mysql.initial.sql b/SQL/mysql.initial.sql index fee1b6d0e..8265f70f8 100644 --- a/SQL/mysql.initial.sql +++ b/SQL/mysql.initial.sql @@ -25,7 +25,7 @@ CREATE TABLE `users` ( `last_login` datetime DEFAULT NULL, `failed_login` datetime DEFAULT NULL, `failed_login_counter` int(10) UNSIGNED DEFAULT NULL, - `language` varchar(5), + `language` varchar(16), `preferences` longtext, PRIMARY KEY(`user_id`), UNIQUE `username` (`username`, `mail_host`) @@ -176,7 +176,7 @@ CREATE TABLE `identities` ( CREATE TABLE `dictionary` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, -- redundant, for compat. with Galera Cluster `user_id` int(10) UNSIGNED DEFAULT NULL, -- NULL here is for "shared dictionaries" - `language` varchar(5) NOT NULL, + `language` varchar(16) NOT NULL, `data` longtext NOT NULL, CONSTRAINT `user_id_fk_dictionary` FOREIGN KEY (`user_id`) REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE, @@ -223,4 +223,4 @@ CREATE TABLE `system` ( /*!40014 SET FOREIGN_KEY_CHECKS=1 */; -INSERT INTO `system` (`name`, `value`) VALUES ('roundcube-version', '2019092900'); +INSERT INTO `system` (`name`, `value`) VALUES ('roundcube-version', '2020020100'); diff --git a/SQL/mysql/2020020100.sql b/SQL/mysql/2020020100.sql new file mode 100644 index 000000000..51b2f7777 --- /dev/null +++ b/SQL/mysql/2020020100.sql @@ -0,0 +1,2 @@ +ALTER TABLE `users` MODIFY `language` varchar(16); +ALTER TABLE `dictionary` MODIFY `language` varchar(16) NOT NULL; diff --git a/SQL/oracle.initial.sql b/SQL/oracle.initial.sql index fb821ea03..f89a21bb9 100644 --- a/SQL/oracle.initial.sql +++ b/SQL/oracle.initial.sql @@ -9,7 +9,7 @@ CREATE TABLE "users" ( "last_login" timestamp with time zone DEFAULT NULL, "failed_login" timestamp with time zone DEFAULT NULL, "failed_login_counter" integer DEFAULT NULL, - "language" varchar(5), + "language" varchar(16), "preferences" long DEFAULT NULL, CONSTRAINT "users_username_key" UNIQUE ("username", "mail_host") ); @@ -186,7 +186,7 @@ CREATE INDEX "cache_messages_expires_idx" ON "cache_messages" ("expires"); CREATE TABLE "dictionary" ( "user_id" integer DEFAULT NULL REFERENCES "users" ("user_id") ON DELETE CASCADE, - "language" varchar(5) NOT NULL, + "language" varchar(16) NOT NULL, "data" long DEFAULT NULL, CONSTRAINT "dictionary_user_id_lang_key" UNIQUE ("user_id", "language") ); @@ -238,4 +238,4 @@ CREATE TABLE "system" ( "value" long ); -INSERT INTO "system" ("name", "value") VALUES ('roundcube-version', '2019092900'); +INSERT INTO "system" ("name", "value") VALUES ('roundcube-version', '2020020100'); diff --git a/SQL/oracle/2020020100.sql b/SQL/oracle/2020020100.sql new file mode 100644 index 000000000..2590179e3 --- /dev/null +++ b/SQL/oracle/2020020100.sql @@ -0,0 +1,2 @@ +ALTER TABLE "users" MODIFY "language" varchar(16) NOT NULL; +ALTER TABLE "dictionary" MODIFY "language" varchar(16); diff --git a/SQL/postgres.initial.sql b/SQL/postgres.initial.sql index 8d8957cb9..c1db6dd33 100644 --- a/SQL/postgres.initial.sql +++ b/SQL/postgres.initial.sql @@ -24,7 +24,7 @@ CREATE TABLE users ( last_login timestamp with time zone DEFAULT NULL, failed_login timestamp with time zone DEFAULT NULL, failed_login_counter integer DEFAULT NULL, - "language" varchar(5), + "language" varchar(16), preferences text DEFAULT ''::text NOT NULL, CONSTRAINT users_username_key UNIQUE (username, mail_host) ); @@ -246,7 +246,7 @@ CREATE INDEX cache_messages_expires_idx ON cache_messages (expires); CREATE TABLE dictionary ( user_id integer DEFAULT NULL REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE CASCADE, - "language" varchar(5) NOT NULL, + "language" varchar(16) NOT NULL, data text NOT NULL, CONSTRAINT dictionary_user_id_language_key UNIQUE (user_id, "language") ); @@ -314,4 +314,4 @@ CREATE TABLE "system" ( value text ); -INSERT INTO "system" (name, value) VALUES ('roundcube-version', '2019092900'); +INSERT INTO "system" (name, value) VALUES ('roundcube-version', '2020020100'); diff --git a/SQL/postgres/2020020100.sql b/SQL/postgres/2020020100.sql new file mode 100644 index 000000000..f9c0e9174 --- /dev/null +++ b/SQL/postgres/2020020100.sql @@ -0,0 +1,2 @@ +ALTER TABLE "dictionary" ALTER COLUMN "language" TYPE varchar(16); +ALTER TABLE "users" ALTER COLUMN "language" TYPE varchar(16); diff --git a/SQL/sqlite.initial.sql b/SQL/sqlite.initial.sql index f62a89412..e82254cb5 100644 --- a/SQL/sqlite.initial.sql +++ b/SQL/sqlite.initial.sql @@ -74,7 +74,7 @@ CREATE TABLE users ( last_login datetime DEFAULT NULL, failed_login datetime DEFAULT NULL, failed_login_counter integer DEFAULT NULL, - language varchar(5), + language varchar(16), preferences text NOT NULL default '' ); @@ -99,11 +99,11 @@ CREATE INDEX ix_session_changed ON session (changed); CREATE TABLE dictionary ( user_id integer DEFAULT NULL, - "language" varchar(5) NOT NULL, + language varchar(16) NOT NULL, data text NOT NULL ); -CREATE UNIQUE INDEX ix_dictionary_user_language ON dictionary (user_id, "language"); +CREATE UNIQUE INDEX ix_dictionary_user_language ON dictionary (user_id, language); -- -- Table structure for table searches @@ -215,4 +215,4 @@ CREATE TABLE system ( value text NOT NULL ); -INSERT INTO system (name, value) VALUES ('roundcube-version', '2019092900'); +INSERT INTO system (name, value) VALUES ('roundcube-version', '2020020100'); diff --git a/SQL/sqlite/2020020100.sql b/SQL/sqlite/2020020100.sql new file mode 100644 index 000000000..2df00434b --- /dev/null +++ b/SQL/sqlite/2020020100.sql @@ -0,0 +1,57 @@ +CREATE TABLE tmp_users ( + user_id integer NOT NULL PRIMARY KEY, + username varchar(128) NOT NULL default '', + mail_host varchar(128) NOT NULL default '', + created datetime NOT NULL default '0000-00-00 00:00:00', + last_login datetime DEFAULT NULL, + failed_login datetime DEFAULT NULL, + failed_login_counter integer DEFAULT NULL, + language varchar(16), + preferences text NOT NULL default '' +); + +INSERT INTO tmp_users (user_id, username, mail_host, created, last_login, failed_login, failed_login_counter, language, preferences) + SELECT user_id, username, mail_host, created, last_login, failed_login, failed_login_counter, language, preferences FROM users; + +DROP TABLE users; + +CREATE TABLE users ( + user_id integer NOT NULL PRIMARY KEY, + username varchar(128) NOT NULL default '', + mail_host varchar(128) NOT NULL default '', + created datetime NOT NULL default '0000-00-00 00:00:00', + last_login datetime DEFAULT NULL, + failed_login datetime DEFAULT NULL, + failed_login_counter integer DEFAULT NULL, + language varchar(16), + preferences text NOT NULL default '' +); + +INSERT INTO users (user_id, username, mail_host, created, last_login, failed_login, failed_login_counter, language, preferences) + SELECT user_id, username, mail_host, created, last_login, failed_login, failed_login_counter, language, preferences FROM tmp_users; + +CREATE UNIQUE INDEX ix_users_username ON users(username, mail_host); + +DROP TABLE tmp_users; + +DROP TABLE users; + +CREATE TABLE tmp_dictionary ( + user_id integer DEFAULT NULL, + language varchar(16) NOT NULL, + data text NOT NULL +); + +INSERT INTO tmp_dictionary (user_id, language, data) SELECT user_id, language, data FROM dictionary; + +CREATE TABLE dictionary ( + user_id integer DEFAULT NULL, + language varchar(16) NOT NULL, + data text NOT NULL +); + +INSERT INTO dictionary (user_id, language, data) SELECT user_id, language, data FROM tmp_dictionary; + +CREATE UNIQUE INDEX ix_dictionary_user_language ON dictionary (user_id, language); + +DROP TABLE tmp_dictionary;