diff -r e09139525580 -r 4b8c3f51d7da pgsql/update_tables_0.5.x-0.6.pgsql --- a/pgsql/update_tables_0.5.x-0.6.pgsql Fri Apr 13 23:24:12 2012 +0200 +++ b/pgsql/update_tables_0.5.x-0.6.pgsql Sat Apr 14 15:11:27 2012 +0000 @@ -91,7 +91,7 @@ ALTER TABLE domain_data ADD CONSTRAINT fkey_domain_data_qid_quotalimit FOREIGN KEY (qid) REFERENCES quotalimit (qid); -ALTER TABLE users ADD COLUMN qid bigint NULL DEFAULT NULL; +ALTER TABLE users ADD COLUMN qid bigint NOT NULL DEFAULT 1; ALTER TABLE users ADD CONSTRAINT fkey_users_qid_quotalimit FOREIGN KEY (qid) REFERENCES quotalimit (qid); @@ -125,7 +125,7 @@ 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 NULL DEFAULT NULL; +ALTER TABLE users ADD COLUMN ssid bigint NOT NULL DEFAULT 1; -- save current service sets UPDATE users u SET ssid = ss.ssid @@ -145,24 +145,6 @@ -- --- -- Catchall -- --- --- Quota/Service/Transport inheritance --- --- -ALTER TABLE users ALTER COLUMN tid DROP NULL; -ALTER TABLE users ALTER COLUMN tid SET DEFAULT NULL; --- The qid and ssid columns have already been defined accordingly above. --- The rest of the logic will take place in the functions. - --- While qid and ssid are new and it's perfectly okay for existing users to --- get NULL values (i.e. inherit from the domain's default), tid existed in --- vmm 0.5.x. A sensible way forward seems thus to NULL all user records' tid --- fields where the tid duplicates the value stored in the domain's record. -UPDATE users - SET tid = NULL - WHERE tid = (SELECT tid - FROM domain_data - WHERE domain_data.gid = users.gid); - --- --- CREATE TABLE catchall ( gid bigint NOT NULL, @@ -295,20 +277,12 @@ BEGIN FOR record IN SELECT userid, passwd, smtp, pop3, imap, managesieve - FROM users, service_set, domain_data - WHERE users.gid = (SELECT gid - FROM domain_name - WHERE domainname = the_domain) + FROM users, service_set + WHERE gid = (SELECT gid + FROM domain_name + WHERE domainname = the_domain) AND local_part = localpart AND service_set.ssid = users.ssid - AND users.gid = domain_data.gid - AND CASE WHEN - users.ssid IS NOT NULL - THEN - service_set.ssid = users.ssid - ELSE - service_set.ssid = domain_data.ssid - END LOOP RETURN NEXT record; END LOOP; @@ -339,13 +313,7 @@ AND maillocation.mid = users.mid AND mailboxformat.fid = maillocation.fid AND domain_data.gid = did - AND CASE WHEN - users.qid IS NOT NULL - THEN - quotalimit.qid = users.qid - ELSE - quotalimit.qid = domain_data.qid - END + AND quotalimit.qid = users.qid LOOP RETURN NEXT record; END LOOP; @@ -467,20 +435,16 @@ DECLARE record recipient_transport; recipient varchar(320) := localpart || '@' || the_domain; - did bigint := (SELECT gid FROM domain_name WHERE domainname = the_domain); - transport_id bigint := (SELECT tid FROM users - WHERE gid = did AND local_part = localpart); BEGIN - IF transport_id IS NULL THEN - SELECT tid INTO STRICT transport_id - FROM domain_data - WHERE gid = did; - END IF; - FOR record IN SELECT recipient, transport FROM transport - WHERE tid = transport_id + WHERE tid = (SELECT tid + FROM users + WHERE gid = (SELECT gid + FROM domain_name + WHERE domainname = the_domain) + AND local_part = localpart) LOOP RETURN NEXT record; END LOOP;