From 41db2b70504089cd6cadc54d110dec8903101db4 Mon Sep 17 00:00:00 2001 From: Andrew McMillan Date: Sun, 27 Jan 2008 09:51:47 +1300 Subject: [PATCH] Ensure these patches will work in more obscure situations. --- dba/davical.sql | 24 ++++++++++++++---------- dba/patches/1.2.1.sql | 17 +++++++++++++---- dba/patches/1.2.2.sql | 18 +++++++++--------- 3 files changed, 36 insertions(+), 23 deletions(-) diff --git a/dba/davical.sql b/dba/davical.sql index 1f39ce01..57dd2783 100644 --- a/dba/davical.sql +++ b/dba/davical.sql @@ -35,7 +35,7 @@ CREATE TABLE caldav_data ( PRIMARY KEY ( user_no, dav_name ) ); - +CREATE INDEX caldav_data_collection_id_fkey ON caldav_data(collection_id); -- Not particularly needed, perhaps, except as a way to collect -- a bunch of valid iCalendar time zone specifications... :-) @@ -81,6 +81,7 @@ CREATE TABLE calendar_item ( PRIMARY KEY ( user_no, dav_name ) ); +CREATE INDEX calendar_item_collection_id_fkey ON calendar_item(collection_id); -- Each user can be related to each other user. This mechanism can also @@ -178,19 +179,21 @@ CREATE TABLE principal_type ( principal_type_desc TEXT ); + -- web needs SELECT,INSERT,UPDATE,DELETE CREATE TABLE principal ( principal_id SERIAL PRIMARY KEY, - type_id INT8 NOT NULL REFERENCES principal_type(principal_type_id), - user_no INT8 NULL REFERENCES usr(user_no), + type_id INT8 NOT NULL REFERENCES principal_type(principal_type_id) ON UPDATE CASCADE ON DELETE RESTRICT DEFERRABLE, + user_no INT8 NULL REFERENCES usr(user_no) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE, displayname TEXT, active BOOLEAN ); + -- Allowing identification of group members. CREATE TABLE group_member ( - group_id INT8 REFERENCES principal(principal_id), - member_id INT8 REFERENCES principal(principal_id) + group_id INT8 REFERENCES principal(principal_id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE, + member_id INT8 REFERENCES principal(principal_id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE ); CREATE UNIQUE INDEX group_member_pk ON group_member(group_id,member_id); CREATE INDEX group_member_sk ON group_member(member_id); @@ -203,18 +206,19 @@ CREATE TABLE dav_resource_type ( resource_type_desc TEXT ); + CREATE TABLE dav_resource ( dav_id INT8 PRIMARY KEY DEFAULT nextval('dav_id_seq'), dav_name TEXT, - resource_type_id INT8 REFERENCES dav_resource_type(resource_type_id), - owner_id INT8 REFERENCES principal(principal_id) + resource_type_id INT8 REFERENCES dav_resource_type(resource_type_id) ON UPDATE CASCADE ON DELETE RESTRICT DEFERRABLE, + owner_id INT8 REFERENCES principal(principal_id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE ); CREATE TABLE privilege ( - granted_to_id INT8 REFERENCES principal(principal_id), - resource_id INT8 REFERENCES dav_resource(dav_id), - granted_by_id INT8 REFERENCES principal(principal_id), + granted_to_id INT8 REFERENCES principal(principal_id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE, + resource_id INT8 REFERENCES dav_resource(dav_id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE, + granted_by_id INT8 REFERENCES principal(principal_id) ON UPDATE CASCADE ON DELETE RESTRICT DEFERRABLE, can_read BOOLEAN, can_write BOOLEAN, can_write_properties BOOLEAN, diff --git a/dba/patches/1.2.1.sql b/dba/patches/1.2.1.sql index 11b696b7..197a6457 100644 --- a/dba/patches/1.2.1.sql +++ b/dba/patches/1.2.1.sql @@ -60,20 +60,29 @@ ALTER TABLE collection ADD UNIQUE (user_no,dav_name); ALTER TABLE collection ADD CONSTRAINT collection_pkey PRIMARY KEY (collection_id); ALTER TABLE calendar_item ADD COLUMN collection_id INT8; +INSERT INTO collection ( user_no, parent_container, dav_name, dav_etag, dav_displayname, is_calendar, created, modified) + SELECT user_no, '/'||username||'/', '/'||username||'/home/', md5(user_no::text||'/'||username||'/home/'), + fullname, TRUE, current_timestamp, current_timestamp + FROM usr + WHERE NOT EXISTS (SELECT 1 FROM collection WHERE dav_name ~ ('^/'||username||'/')); + +UPDATE caldav_data SET dav_name = (select collection.dav_name FROM collection WHERE collection.user_no = caldav_data.user_no limit 1) + || regexp_replace( caldav_data.dav_name, '^.*/([^/]+)$', E'ex-\\1') + WHERE dav_name ~ '^/[^/]+/[^/]+$'; UPDATE calendar_item SET collection_id = collection.collection_id FROM collection WHERE collection.dav_name = regexp_replace( calendar_item.dav_name, '/[^/]+$', '/'); ALTER TABLE calendar_item ALTER COLUMN collection_id SET NOT NULL; ALTER TABLE calendar_item ADD CONSTRAINT - calendar_item_collection_id_fkey FOREIGN KEY (collection_id) REFERENCES collection(collection_id); -CREATE INDEX calendar_item_collection_id_fkey ON calendar_item(collection_id,user_no); + calendar_item_collection_id_fkey FOREIGN KEY (collection_id) REFERENCES collection(collection_id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE; +CREATE INDEX calendar_item_collection_id_fkey ON calendar_item(collection_id); ALTER TABLE caldav_data ADD COLUMN collection_id INT8; UPDATE caldav_data SET collection_id = collection.collection_id FROM collection WHERE collection.dav_name = regexp_replace( caldav_data.dav_name, '/[^/]+$', '/'); ALTER TABLE caldav_data ALTER COLUMN collection_id SET NOT NULL; ALTER TABLE caldav_data ADD CONSTRAINT - caldav-data_collection_id_fkey FOREIGN KEY (collection_id) REFERENCES collection(collection_id); -CREATE INDEX caldav_data_collection_id_fkey ON caldav_data(collection_id,user_no); + caldav_data_collection_id_fkey FOREIGN KEY (collection_id) REFERENCES collection(collection_id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE; +CREATE INDEX caldav_data_collection_id_fkey ON caldav_data(collection_id); SELECT new_db_revision(1,2,1, 'Janvier' ); diff --git a/dba/patches/1.2.2.sql b/dba/patches/1.2.2.sql index 2c9e9ea7..472d9d69 100644 --- a/dba/patches/1.2.2.sql +++ b/dba/patches/1.2.2.sql @@ -15,16 +15,16 @@ CREATE TABLE principal_type ( -- web needs SELECT,INSERT,UPDATE,DELETE CREATE TABLE principal ( principal_id SERIAL PRIMARY KEY, - type_id INT8 NOT NULL REFERENCES principal_type(principal_type_id), - user_no INT8 NULL REFERENCES usr(user_no), + type_id INT8 NOT NULL REFERENCES principal_type(principal_type_id) ON UPDATE CASCADE ON DELETE RESTRICT DEFERRABLE, + user_no INT8 NULL REFERENCES usr(user_no) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE, displayname TEXT, active BOOLEAN ); -- Allowing identification of group members. CREATE TABLE group_member ( - group_id INT8 REFERENCES principal(principal_id), - member_id INT8 REFERENCES principal(principal_id) + group_id INT8 REFERENCES principal(principal_id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE, + member_id INT8 REFERENCES principal(principal_id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE ); CREATE UNIQUE INDEX group_member_pk ON group_member(group_id,member_id); CREATE INDEX group_member_sk ON group_member(member_id); @@ -40,15 +40,15 @@ CREATE TABLE dav_resource_type ( CREATE TABLE dav_resource ( dav_id INT8 PRIMARY KEY DEFAULT nextval('dav_id_seq'), dav_name TEXT, - resource_type_id INT8 REFERENCES dav_resource_type(resource_type_id), - owner_id INT8 REFERENCES principal(principal_id) + resource_type_id INT8 REFERENCES dav_resource_type(resource_type_id) ON UPDATE CASCADE ON DELETE RESTRICT DEFERRABLE, + owner_id INT8 REFERENCES principal(principal_id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE ); CREATE TABLE privilege ( - granted_to_id INT8 REFERENCES principal(principal_id), - resource_id INT8 REFERENCES dav_resource(dav_id), - granted_by_id INT8 REFERENCES principal(principal_id), + granted_to_id INT8 REFERENCES principal(principal_id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE, + resource_id INT8 REFERENCES dav_resource(dav_id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE, + granted_by_id INT8 REFERENCES principal(principal_id) ON UPDATE CASCADE ON DELETE RESTRICT DEFERRABLE, can_read BOOLEAN, can_write BOOLEAN, can_write_properties BOOLEAN,