Index: openacs-4/packages/file-storage/sql/postgresql/file-storage-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/sql/postgresql/file-storage-create.sql,v diff -u -r1.3 -r1.4 --- openacs-4/packages/file-storage/sql/postgresql/file-storage-create.sql 28 Aug 2001 23:07:55 -0000 1.3 +++ openacs-4/packages/file-storage/sql/postgresql/file-storage-create.sql 30 Aug 2001 12:40:38 -0000 1.4 @@ -10,8 +10,6 @@ -- We need to create a root folder in the content repository for -- each instance of file storage -- - - create table fs_root_folders ( -- ID for this package instance package_id integer @@ -20,43 +18,8 @@ constraint fs_root_folder_package_id_pk primary key, -- the ID of the root folder - -- JS: I removed the on delete cascade constraint on folder_id!!!!!!!!!!!!!!!!!!!!! - -- JS: - -- JS: 1) folder_id points to the root folder id in CR, which cannot (and should not) be deleted - -- JS: unless the package instance is deleted (which is done from APM). Thus there is - -- JS: no conceivable scenario when the "on delete cascade" will be triggered to delete - -- JS: the entry in fs_root_folders through the deletion of the root - -- JS: folder id. This constraint is superfluous. - -- JS: - -- JS: 2) There is a nasty bug in the implementation of File Storage (FS), where if a package - -- JS: instance is deleted, the "on delete cascade" on package_id will cause the deletion of - -- JS: the row containing package_id and folder_id when the instance is deleted. Since the - -- JS: CR items inserted by this FS instance is accessible only through the root folder_id, - -- JS: the CR items are orphaned! - -- JS: - -- JS: To clean up CR, we need to impose a trigger on deletion of the row containing the root - -- JS: folder_id (i.e., when the package instance is deleted). With "on delete cascade" - -- JS: constaint imposed on folder_id, any trigger on the deletion of a package instance - -- JS: to clean up CR creates a circular reference. To see this, note cleaning up CR - -- JS: requires an inverted tree of the items belonging to the package be created, so - -- JS: that we can clean up from the leaves of the tree up to the root node. - -- JS: We then call content_item.delete() or content_folder.delete() to remove the file or - -- JS: folder, as the case may be. However, content_item.delete() (cotent_folder.delete - -- JS: calls content_item.delete) calls on acs_object.delete, relying on the "on delete - -- JS: cascade" constraint imposed on item_id of cr_items to do the actual deletion. Now - -- JS: with "on delete cascade" also imposed on folder_id of fs_root_folders, the "on delete - -- JS: cascade" on item_id of cr_items will trigger deletion of the entry in fs_root_folders - -- JS: AS IT IS BEING DELETED BY APM. In oracle, this will trigger the "mutating tables" error. - -- JS: - -- JS: So we simplify our life and drop the "on delete cascade". We still requie the foreign - -- JS: key constraint. The subtle problem this will cause is that when we clean up CR, we - -- JS: cannot prune the tree up to the root folder, since it will cause a foreign key - -- JS: constraint violation. We could also drop the foreign key constraint, but we will expose our - -- JS: database to carelessness errors. The solution is to make two triggers: a "before delete" - -- JS: trigger on fs_root_folders that cleans up the CR entries of the package except the - -- JS: root folder, and an "after delete" trigger that cleans up the root folder entry - -- JS: (since the folder id will have been deleted, so no foreign key reference will be - -- JS: violated by the deletion of the root folder) + -- JS: I removed the on delete cascade constraint on folder_id + -- JS: It is superfluous, and causes a lot of RI headaches folder_id integer constraint fs_root_folder_folder_id_fk references cr_folders