--- a/pgsql/update_tables_0.5.x-0.6.pgsql Wed Oct 26 23:32:58 2011 +0000
+++ b/pgsql/update_tables_0.5.x-0.6.pgsql Fri Oct 28 15:51:31 2011 +0000
@@ -1,24 +1,45 @@
SET client_encoding = 'UTF8';
SET client_min_messages = warning;
+-- ---
+-- Create the new service_set table and insert all possible combinations
+-- --
+CREATE SEQUENCE service_set_id;
+
+CREATE TABLE service_set (
+ ssid bigint NOT NULL DEFAULT nextval('service_set_id'),
+ smtp boolean NOT NULL DEFAULT TRUE,
+ pop3 boolean NOT NULL DEFAULT TRUE,
+ imap boolean NOT NULL DEFAULT TRUE,
+ managesieve boolean NOT NULL DEFAULT TRUE,
+ CONSTRAINT pkey_service_set PRIMARY KEY (ssid),
+ CONSTRAINT ukey_service_set UNIQUE (smtp, pop3, imap, managesieve)
+);
+
+COPY service_set (smtp, pop3, imap, managesieve) FROM stdin;
+TRUE TRUE TRUE TRUE
+FALSE TRUE TRUE TRUE
+TRUE FALSE TRUE TRUE
+FALSE FALSE TRUE TRUE
+TRUE TRUE FALSE TRUE
+FALSE TRUE FALSE TRUE
+TRUE FALSE FALSE TRUE
+FALSE FALSE FALSE TRUE
+TRUE TRUE TRUE FALSE
+FALSE TRUE TRUE FALSE
+TRUE FALSE TRUE FALSE
+FALSE FALSE TRUE FALSE
+TRUE TRUE FALSE FALSE
+FALSE TRUE FALSE FALSE
+TRUE FALSE FALSE FALSE
+FALSE FALSE FALSE FALSE
+\.
-- ---
--- Make room for sha512-crypt.hex hashed passwords
--- ---
-DROP VIEW dovecot_password;
-
-ALTER TABLE users ALTER COLUMN passwd TYPE varchar(270);
-
-CREATE VIEW dovecot_password AS
- SELECT local_part || '@' || domain_name.domainname AS "user",
- passwd AS "password", smtp, pop3, imap, managesieve
- FROM users
- LEFT JOIN domain_name USING (gid);
-
--- ---
--- Make room for different mailbox formats.
+-- Make room for different mailbox formats and longer password hashes.
-- ---
DROP VIEW dovecot_user;
+DROP VIEW dovecot_password;
DROP VIEW postfix_maildir;
DROP VIEW vmm_domain_info;
@@ -45,6 +66,7 @@
ALTER TABLE maillocation ADD CONSTRAINT fkey_maillocation_fid_mailboxformat
FOREIGN KEY (fid) REFERENCES mailboxformat (fid);
+ALTER TABLE users ALTER COLUMN passwd TYPE varchar(270);
-- ---
-- Add quota stuff
@@ -59,7 +81,7 @@
-- Insert default (non) quota limit
INSERT INTO quotalimit(bytes, messages) VALUES (0, 0);
--- Adjust tables …
+-- Adjust tables (quota)
ALTER TABLE domain_data ADD COLUMN qid bigint NOT NULL DEFAULT 1;
ALTER TABLE domain_data ADD CONSTRAINT fkey_domain_data_qid_quotalimit
FOREIGN KEY (qid) REFERENCES quotalimit (qid);
@@ -93,6 +115,28 @@
CREATE TRIGGER mergeuserquota_11 BEFORE INSERT ON userquota_11
FOR EACH ROW EXECUTE PROCEDURE merge_userquota_11();
+-- Adjust tables (services)
+ALTER TABLE domain_data ADD COLUMN ssid bigint NOT NULL DEFAULT 1;
+ALTER TABLE domain_data ADD CONSTRAINT fkey_domain_data_ssid_service_set
+ FOREIGN KEY (ssid) REFERENCES service_set (ssid);
+
+ALTER TABLE users ADD COLUMN ssid bigint NOT NULL DEFAULT 1;
+-- save current service sets
+UPDATE users u
+ SET ssid = ss.ssid
+ FROM service_set ss
+ WHERE ss.smtp = u.smtp
+ AND ss.pop3 = u.pop3
+ AND ss.imap = u.imap
+ AND ss.managesieve = u.managesieve;
+
+ALTER TABLE users DROP COLUMN smtp;
+ALTER TABLE users DROP COLUMN pop3;
+ALTER TABLE users DROP COLUMN imap;
+ALTER TABLE users DROP COLUMN managesieve;
+ALTER TABLE users ADD CONSTRAINT fkey_users_ssid_service_set
+ FOREIGN KEY (ssid) REFERENCES service_set (ssid);
+
-- ---
-- Restore views
-- ---
@@ -106,6 +150,13 @@
LEFT JOIN maillocation USING (mid)
LEFT JOIN mailboxformat USING (fid);
+CREATE OR REPLACE VIEW dovecot_password AS
+ SELECT local_part || '@' || domainname AS "user",
+ passwd AS "password", smtp, pop3, imap, managesieve
+ FROM users
+ LEFT JOIN domain_name USING (gid)
+ LEFT JOIN service_set USING (ssid);
+
CREATE VIEW postfix_maildir AS
SELECT local_part || '@' || domain_name.domainname AS address,
domain_data.domaindir||'/'||uid||'/'||maillocation.directory||'/'