Commit caf934d90e4ad48eb17b8da15009608486f0e634
1 parent
33ae9d48
Second part of fix for KTS-1146: groups-users links can get stale.
git-svn-id: https://kt-dms.svn.sourceforge.net/svnroot/kt-dms/trunk@5933 c91229c3-7414-0410-bfa2-8a42b809f60b
Showing
3 changed files
with
66 additions
and
3 deletions
docs/VERSION.txt
lib/upgrades/UpgradeFunctions.inc.php
| @@ -39,7 +39,8 @@ class UpgradeFunctions { | @@ -39,7 +39,8 @@ class UpgradeFunctions { | ||
| 39 | "3.0.3.2" => array("createFolderDetailsPermission"), | 39 | "3.0.3.2" => array("createFolderDetailsPermission"), |
| 40 | "3.0.3.3" => array("generateWorkflowTriggers"), | 40 | "3.0.3.3" => array("generateWorkflowTriggers"), |
| 41 | "3.0.3.7" => array("rebuildAllPermissions"), | 41 | "3.0.3.7" => array("rebuildAllPermissions"), |
| 42 | - "3.1.5" => array("upgradeSavedSearches"), | 42 | + "3.1.5" => array("upgradeSavedSearches"), |
| 43 | + "3.1.6.3" => array("cleanupGroupMembership"), | ||
| 43 | ); | 44 | ); |
| 44 | 45 | ||
| 45 | var $descriptions = array( | 46 | var $descriptions = array( |
| @@ -57,7 +58,8 @@ class UpgradeFunctions { | @@ -57,7 +58,8 @@ class UpgradeFunctions { | ||
| 57 | 'createFolderDetailsPermission' => 'Create the Core: Folder Details permission', | 58 | 'createFolderDetailsPermission' => 'Create the Core: Folder Details permission', |
| 58 | 'generateWorkflowTriggers' => 'Migrate old in-transition guards to triggers', | 59 | 'generateWorkflowTriggers' => 'Migrate old in-transition guards to triggers', |
| 59 | 'rebuildAllPermissions' => 'Rebuild all permissions to ensure correct functioning of permission-definitions.', | 60 | 'rebuildAllPermissions' => 'Rebuild all permissions to ensure correct functioning of permission-definitions.', |
| 60 | - 'upgradeSavedSearches' => 'Upgrade saved searches to use namespaces instead of integer ids', | 61 | + 'upgradeSavedSearches' => 'Upgrade saved searches to use namespaces instead of integer ids', |
| 62 | + 'cleanupGroupMembership' => 'Cleanup any old references to missing groups, etc.', | ||
| 61 | ); | 63 | ); |
| 62 | var $phases = array( | 64 | var $phases = array( |
| 63 | "setPermissionFolder" => 1, | 65 | "setPermissionFolder" => 1, |
| @@ -818,6 +820,60 @@ class UpgradeFunctions { | @@ -818,6 +820,60 @@ class UpgradeFunctions { | ||
| 818 | $oS->update(); | 820 | $oS->update(); |
| 819 | } | 821 | } |
| 820 | } | 822 | } |
| 823 | + | ||
| 824 | + function cleanupGroupMembership() { | ||
| 825 | + // 4 cases. | ||
| 826 | + $child_query = 'select L.id as link_id FROM groups_groups_link as L left outer join groups_lookup as G on (L.member_group_id = G.id) WHERE G.id IS NULL'; | ||
| 827 | + $parent_query = 'select L.id as link_id FROM groups_groups_link as L left outer join groups_lookup as G on (L.parent_group_id = G.id) WHERE G.id IS NULL'; | ||
| 828 | + $group_query = 'select L.id as link_id FROM users_groups_link as L left outer join groups_lookup as G on (L.group_id = G.id) WHERE G.id IS NULL'; | ||
| 829 | + $user_query = 'select L.id as link_id FROM users_groups_link as L left outer join users as U on (L.user_id = U.id) WHERE U.id IS NULL'; | ||
| 830 | + | ||
| 831 | + $bad_group_links = array(); | ||
| 832 | + $res = DBUtil::getResultArrayKey(array($child_query, null), 'link_id'); | ||
| 833 | + if (PEAR::isError($res)) { | ||
| 834 | + return $res; | ||
| 835 | + } else { | ||
| 836 | + $bad_group_links = $res; | ||
| 837 | + } | ||
| 838 | + | ||
| 839 | + $res = DBUtil::getResultArrayKey(array($parent_query, null), 'link_id'); | ||
| 840 | + if (PEAR::isError($res)) { | ||
| 841 | + return $res; | ||
| 842 | + } else { | ||
| 843 | + $bad_group_links = kt_array_merge($bad_group_links, $res); | ||
| 844 | + } | ||
| 845 | + | ||
| 846 | + foreach ($bad_group_links as $link_id) { | ||
| 847 | + $res = DBUtil::runQuery(array("DELETE FROM groups_groups_link WHERE id = ?", $link_id)); | ||
| 848 | + if (PEAR::isError($res)) { | ||
| 849 | + return $res; | ||
| 850 | + } | ||
| 851 | + } | ||
| 852 | + | ||
| 853 | + $res = DBUtil::getResultArrayKey(array($group_query, null), 'link_id'); | ||
| 854 | + if (PEAR::isError($res)) { | ||
| 855 | + return $res; | ||
| 856 | + } else { | ||
| 857 | + $bad_user_links = $res; | ||
| 858 | + } | ||
| 859 | + | ||
| 860 | + $res = DBUtil::getResultArrayKey(array($user_query, null), 'link_id'); | ||
| 861 | + if (PEAR::isError($res)) { | ||
| 862 | + return $res; | ||
| 863 | + } else { | ||
| 864 | + $bad_user_links = kt_array_merge($bad_user_links, $res); | ||
| 865 | + } | ||
| 866 | + | ||
| 867 | + foreach ($bad_user_links as $link_id) { | ||
| 868 | + $res = DBUtil::runQuery(array("DELETE FROM users_groups_link WHERE id = ?", $link_id)); | ||
| 869 | + if (PEAR::isError($res)) { | ||
| 870 | + return $res; | ||
| 871 | + } | ||
| 872 | + } | ||
| 873 | + | ||
| 874 | + return true; | ||
| 875 | + | ||
| 876 | + } | ||
| 821 | } | 877 | } |
| 822 | 878 | ||
| 823 | ?> | 879 | ?> |
sql/mysql/upgrade/3.1.6.3/groups-integrity.sql
0 → 100644
| 1 | +ALTER TABLE `groups_groups_link` | ||
| 2 | + ADD CONSTRAINT `groups_groups_link_ibfk_1` FOREIGN KEY (`parent_group_id`) REFERENCES `groups_lookup` (`id`) ON DELETE CASCADE, | ||
| 3 | + ADD CONSTRAINT `groups_groups_link_ibfk_2` FOREIGN KEY (`member_group_id`) REFERENCES `groups_lookup` (`id`) ON DELETE CASCADE; | ||
| 4 | + | ||
| 5 | +ALTER TABLE `users_groups_link` | ||
| 6 | + ADD CONSTRAINT `users_groups_link_ibfk_1` FOREIGN KEY (`group_id`) REFERENCES `groups_lookup` (`id`) ON DELETE CASCADE, | ||
| 7 | + ADD CONSTRAINT `users_groups_link_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; |