X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=scripts%2Fupgrade.php;h=c221a495af1cc04489643ce24bb3ce8a10bc1cd8;hb=d4bdfc2aa27a592427632050807a0d583b595d96;hp=3536eddb6322b69de57142401f35e3d789ebdd1b;hpb=9ed1beb3a00f8919e3c15b9f34bcc7e655ec813c;p=quix0rs-gnu-social.git diff --git a/scripts/upgrade.php b/scripts/upgrade.php index 3536eddb63..c221a495af 100644 --- a/scripts/upgrade.php +++ b/scripts/upgrade.php @@ -33,16 +33,33 @@ require_once INSTALLDIR.'/scripts/commandline.inc'; function main() { - updateSchemaCore(); - updateSchemaPlugins(); + if (Event::handle('StartUpgrade')) { + fixupConversationURIs(); - // These replace old "fixup_*" scripts + updateSchemaCore(); + updateSchemaPlugins(); - fixupNoticeRendered(); - fixupNoticeConversation(); - initConversation(); - fixupGroupURI(); - initInbox(); + // These replace old "fixup_*" scripts + + fixupNoticeRendered(); + fixupNoticeConversation(); + initConversation(); + fixupGroupURI(); + fixupFileGeometry(); + deleteLocalFileThumbnailsWithoutFilename(); + deleteMissingLocalFileThumbnails(); + + initGroupProfileId(); + initLocalGroup(); + initNoticeReshare(); + + initSubscriptionURI(); + initGroupMemberURI(); + + initProfileLists(); + + Event::handle('EndUpgrade'); + } } function tableDefs() @@ -111,7 +128,7 @@ function fixupNoticeConversation() if (empty($notice->reply_to)) { $notice->conversation = $notice->id; } else { - $reply = Notice::staticGet('id', $notice->reply_to); + $reply = Notice::getKV('id', $notice->reply_to); if (empty($reply)) { $notice->conversation = $notice->id; @@ -146,7 +163,7 @@ function fixupGroupURI() if ($group->find()) { while ($group->fetch()) { - $orig = User_group::staticGet('id', $group->id); + $orig = User_group::getKV('id', $group->id); $group->uri = $group->getUri(); $group->update($orig); } @@ -184,43 +201,297 @@ function initConversation() printfnq("DONE.\n"); } -function initInbox() +function fixupConversationURIs() +{ + printfnq("Ensuring all conversations have a URI..."); + + $conv = new Conversation(); + $conv->whereAdd('uri IS NULL'); + + if ($conv->find()) { + $rounds = 0; + while ($conv->fetch()) { + $uri = common_local_url('conversation', array('id' => $conv->id)); + $sql = sprintf('UPDATE conversation SET uri="%1$s" WHERE id="%2$d";', + $conv->escape($uri), $conv->id); + $conv->query($sql); + if (($conv->N-++$rounds) % 500 == 0) { + printfnq(sprintf(' %d items left...', $conv->N-$rounds)); + } + } + } + + 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 users have an inbox..."); + printfnq("Ensuring all local user groups have a local_group..."); - $user = new User(); - $user->whereAdd('not exists (select user_id from inbox where user_id = user.id)'); - $user->orderBy('id'); + $group = new User_group(); + $group->whereAdd('NOT EXISTS (select group_id from local_group where group_id = user_group.id)'); + $group->find(); - if ($user->find()) { + while ($group->fetch()) { + try { + // Hack to check for local groups + if ($group->getUri() == common_local_url('groupbyid', array('id' => $group->id))) { + $lg = new Local_group(); + + $lg->group_id = $group->id; + $lg->nickname = $group->nickname; + $lg->created = $group->created; // XXX: common_sql_now() ? + $lg->modified = $group->modified; + + $lg->insert(); + } + } catch (Exception $e) { + printfv("Error initializing local group for {$group->nickname}:" . $e->getMessage()); + } + } + + printfnq("DONE.\n"); +} - while ($user->fetch()) { +function initNoticeReshare() +{ + printfnq("Ensuring all reshares have the correct verb and object-type..."); + + $notice = new Notice(); + $notice->whereAdd('repeat_of is not null'); + $notice->whereAdd('(verb != "'.ActivityVerb::SHARE.'" OR object_type != "'.ActivityObject::ACTIVITY.'")'); + if ($notice->find()) { + while ($notice->fetch()) { try { - $notice = new Notice(); + $orig = Notice::getKV('id', $notice->id); + $notice->verb = ActivityVerb::SHARE; + $notice->object_type = ActivityObject::ACTIVITY; + $notice->update($orig); + } catch (Exception $e) { + printfv("Error updating verb and object_type for {$notice->id}:" . $e->getMessage()); + } + } + } - $notice->selectAdd(); - $notice->selectAdd('id'); - $notice->joinAdd(array('profile_id', 'subscription:subscribed')); - $notice->whereAdd('subscription.subscriber = ' . $user->id); - $notice->whereAdd('notice.created >= subscription.created'); + printfnq("DONE.\n"); +} - $ids = array(); +function initSubscriptionURI() +{ + printfnq("Ensuring all subscriptions have a URI..."); - if ($notice->find()) { - while ($notice->fetch()) { - $ids[] = $notice->id; - } - } + $sub = new Subscription(); + $sub->whereAdd('uri IS NULL'); - $notice = null; + if ($sub->find()) { + while ($sub->fetch()) { + try { + $sub->decache(); + $sub->query(sprintf('update subscription '. + 'set uri = "%s" '. + 'where subscriber = %d '. + 'and subscribed = %d', + Subscription::newURI($sub->subscriber, $sub->subscribed, $sub->created), + $sub->subscriber, + $sub->subscribed)); + } catch (Exception $e) { + common_log(LOG_ERR, "Error updated subscription URI: " . $e->getMessage()); + } + } + } - $inbox = new Inbox(); - $inbox->user_id = $user->id; - $inbox->pack($ids); - $inbox->insert(); + printfnq("DONE.\n"); +} + +function initGroupMemberURI() +{ + printfnq("Ensuring all group memberships have a URI..."); + + $mem = new Group_member(); + $mem->whereAdd('uri IS NULL'); + + if ($mem->find()) { + while ($mem->fetch()) { + try { + $mem->decache(); + $mem->query(sprintf('update group_member set uri = "%s" '. + 'where profile_id = %d ' . + 'and group_id = %d ', + Group_member::newURI($mem->profile_id, $mem->group_id, $mem->created), + $mem->profile_id, + $mem->group_id)); } catch (Exception $e) { - printv("Error initializing inbox: " . $e->getMessage()); + common_log(LOG_ERR, "Error updated membership URI: " . $e->getMessage()); + } + } + } + + printfnq("DONE.\n"); +} + +function initProfileLists() +{ + printfnq("Ensuring all profile tags have a corresponding list..."); + + $ptag = new Profile_tag(); + $ptag->selectAdd(); + $ptag->selectAdd('tagger, tag, count(*) as tagged_count'); + $ptag->whereAdd('NOT EXISTS (SELECT tagger, tagged from profile_list '. + 'where profile_tag.tagger = profile_list.tagger '. + 'and profile_tag.tag = profile_list.tag)'); + $ptag->groupBy('tagger, tag'); + $ptag->orderBy('tagger, tag'); + + if ($ptag->find()) { + while ($ptag->fetch()) { + $plist = new Profile_list(); + + $plist->tagger = $ptag->tagger; + $plist->tag = $ptag->tag; + $plist->private = 0; + $plist->created = common_sql_now(); + $plist->modified = $plist->created; + $plist->mainpage = common_local_url('showprofiletag', + array('tagger' => $plist->getTagger()->nickname, + 'tag' => $plist->tag));; + + $plist->tagged_count = $ptag->tagged_count; + $plist->subscriber_count = 0; + + $plist->insert(); + + $orig = clone($plist); + // After insert since it uses auto-generated ID + $plist->uri = common_local_url('profiletagbyid', + array('id' => $plist->id, 'tagger_id' => $plist->tagger)); + + $plist->update($orig); + } + } + + printfnq("DONE.\n"); +} + +/* + * Added as we now store interpretd width and height in File table. + */ +function fixupFileGeometry() +{ + printfnq("Ensuring width and height is set for supported local File objects..."); + + $file = new File(); + $file->whereAdd('filename IS NOT NULL'); // local files + $file->whereAdd('width IS NULL OR width = 0'); + + if ($file->find()) { + while ($file->fetch()) { + // Set file geometrical properties if available + try { + $image = ImageFile::fromFileObject($file); + } catch (ServerException $e) { + // We couldn't make out an image from the file. + continue; + } + $orig = clone($file); + $file->width = $image->width; + $file->height = $image->height; + $file->update($orig); + + // FIXME: Do this more automagically inside ImageFile or so. + if ($image->getPath() != $file->getPath()) { + $image->unlink(); + } + unset($image); + } + } + + printfnq("DONE.\n"); +} + +/* + * File_thumbnail objects for local Files store their own filenames in the database. + */ +function deleteLocalFileThumbnailsWithoutFilename() +{ + printfnq("Removing all local File_thumbnail entries without filename property..."); + + $file = new File(); + $file->whereAdd('filename IS NOT NULL'); // local files + + if ($file->find()) { + // Looping through local File entries + while ($file->fetch()) { + $thumbs = new File_thumbnail(); + $thumbs->file_id = $file->id; + $thumbs->whereAdd('filename IS NULL'); + // Checking if there were any File_thumbnail entries without filename + if (!$thumbs->find()) { + continue; + } + // deleting incomplete entry to allow regeneration + while ($thumbs->fetch()) { + $thumbs->delete(); + } + } + } + + printfnq("DONE.\n"); +} + +/* + * Delete File_thumbnail entries where the referenced file does not exist. + */ +function deleteMissingLocalFileThumbnails() +{ + printfnq("Removing all local File_thumbnail entries without existing files..."); + + $thumbs = new File_thumbnail(); + $thumbs->whereAdd('filename IS NOT NULL'); // only fill in names where they're missing + // Checking if there were any File_thumbnail entries without filename + if ($thumbs->find()) { + while ($thumbs->fetch()) { + if (!file_exists(File_thumbnail::path($thumbs->filename))) { + $thumbs->delete(); } } }