Commit caf934d90e4ad48eb17b8da15009608486f0e634

Authored by Brad Shuttleworth
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
docs/VERSION.txt
1   -3.1.6.2
  1 +3.1.6.3
... ...
lib/upgrades/UpgradeFunctions.inc.php
... ... @@ -39,7 +39,8 @@ class UpgradeFunctions {
39 39 "3.0.3.2" => array("createFolderDetailsPermission"),
40 40 "3.0.3.3" => array("generateWorkflowTriggers"),
41 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 46 var $descriptions = array(
... ... @@ -57,7 +58,8 @@ class UpgradeFunctions {
57 58 'createFolderDetailsPermission' => 'Create the Core: Folder Details permission',
58 59 'generateWorkflowTriggers' => 'Migrate old in-transition guards to triggers',
59 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 64 var $phases = array(
63 65 "setPermissionFolder" => 1,
... ... @@ -818,6 +820,60 @@ class UpgradeFunctions {
818 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;
... ...