diff --git a/classes/User_group.php b/classes/User_group.php index 3842826865..1d15b78841 100644 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -38,6 +38,7 @@ class User_group extends Managed_DataObject return array( 'fields' => array( 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'), + 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'), 'nickname' => array('type' => 'varchar', 'length' => 64, 'description' => 'nickname for addressing'), 'fullname' => array('type' => 'varchar', 'length' => 255, 'description' => 'display name'), @@ -62,8 +63,12 @@ class User_group extends Managed_DataObject 'unique keys' => array( 'user_group_uri_key' => array('uri'), ), + 'foreign keys' => array( + 'user_group_id_fkey' => array('profile', array('profile_id' => 'id')), + ), 'indexes' => array( 'user_group_nickname_idx' => array('nickname'), + 'user_group_profile_id_idx' => array('profile_id'), //make this unique in future ), ); } diff --git a/scripts/upgrade.php b/scripts/upgrade.php index 1a87b148b3..a6c7ec40ff 100644 --- a/scripts/upgrade.php +++ b/scripts/upgrade.php @@ -45,6 +45,7 @@ function main() initInbox(); fixupGroupURI(); + initGroupProfileId(); initLocalGroup(); initNoticeReshare(); @@ -241,6 +242,45 @@ function initInbox() printfnq("DONE.\n"); } +function initGroupProfileId() +{ + printfnq("Ensuring all User_group entries have a Profile and profile_id..."); + + $group = new User_group(); + $group->whereAdd('NOT EXISTS (SELECT id FROM profile WHERE id = user_group.profile_id)'); + $group->find(); + + while ($group->fetch()) { + try { + // We must create a new, incrementally assigned profile_id + $profile = new Profile(); + $profile->nickname = $group->nickname; + $profile->fullname = $group->fullname; + $profile->profileurl = $group->mainpage; + $profile->homepage = $group->homepage; + $profile->bio = $group->description; + $profile->location = $group->location; + $profile->created = $group->created; + $profile->modified = $group->modified; + + $profile->query('BEGIN'); + $id = $profile->insert(); + if (empty($id)) { + $profile->query('ROLLBACK'); + throw new Exception('Profile insertion failed, profileurl: '.$profile->profileurl); + } + $group->query("UPDATE user_group SET profile_id={$id} WHERE id={$group->id}"); + $profile->query('COMMIT'); + + $profile->free(); + } catch (Exception $e) { + printfv("Error initializing Profile for group {$group->nickname}:" . $e->getMessage()); + } + } + + printfnq("DONE.\n"); +} + function initLocalGroup() { printfnq("Ensuring all local user groups have a local_group...");