diff --git a/src/Model/Contact.php b/src/Model/Contact.php index f96c556d24..ae715840eb 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -1166,6 +1166,12 @@ class Contact self::updateFromProbeArray($contact_id, $data); + // Don't return a number for a deleted account + if (!empty($data['account-type']) && $data['account-type'] == User::ACCOUNT_TYPE_DELETED) { + Logger::info('Contact is a tombstone', ['url' => $url, 'uid' => $uid]); + return 0; + } + return $contact_id; } @@ -1770,20 +1776,26 @@ class Contact * * @param integer $id contact id * @param integer $uid user id - * @param string $url The profile URL of the contact + * @param string $old_url The previous profile URL of the contact + * @param string $new_url The profile URL of the contact * @param array $fields The fields that are updated * * @throws \Exception */ - private static function updateContact($id, $uid, $url, array $fields) + private static function updateContact(int $id, int $uid, string $old_url, string $new_url, array $fields) { + if (Strings::normaliseLink($new_url) != Strings::normaliseLink($old_url)) { + Logger::notice('New URL differs from old URL', ['old' => $old_url, 'new' => $new_url]); + // @todo It is to decide what to do when the URL is changed + } + if (!DBA::update('contact', $fields, ['id' => $id])) { Logger::info('Couldn\'t update contact.', ['id' => $id, 'fields' => $fields]); return; } // Search for duplicated contacts and get rid of them - if (self::removeDuplicates(Strings::normaliseLink($url), $uid)) { + if (self::removeDuplicates(Strings::normaliseLink($new_url), $uid)) { return; } @@ -1807,7 +1819,7 @@ class Contact } // Update contact data for all users - $condition = ['self' => false, 'nurl' => Strings::normaliseLink($url)]; + $condition = ['self' => false, 'nurl' => Strings::normaliseLink($old_url)]; $condition['network'] = [Protocol::DFRN, Protocol::DIASPORA, Protocol::ACTIVITYPUB]; DBA::update('contact', $fields, $condition); @@ -1870,7 +1882,7 @@ class Contact Worker::add(PRIORITY_HIGH, 'MergeContact', $first, $duplicate['id'], $uid); } DBA::close($duplicates); - Logger::info('Duplicates handled', ['uid' => $uid, 'nurl' => $nurl]); + Logger::info('Duplicates handled', ['uid' => $uid, 'nurl' => $nurl, 'callstack' => System::callstack(20)]); return true; } @@ -1941,14 +1953,14 @@ class Contact // We check after the probing to be able to correct falsely detected contact types. if (($contact['contact-type'] == self::TYPE_RELAY) && (!Strings::compareLink($ret['url'], $contact['url']) || in_array($ret['network'], [Protocol::FEED, Protocol::PHANTOM]))) { - self::updateContact($id, $uid, $contact['url'], ['failed' => false, 'last-update' => $updated, 'success_update' => $updated]); + self::updateContact($id, $uid, $contact['url'], $contact['url'], ['failed' => false, 'last-update' => $updated, 'success_update' => $updated]); Logger::info('Not updating relais', ['id' => $id, 'url' => $contact['url']]); return true; } // If Probe::uri fails the network code will be different ("feed" or "unkn") if (in_array($ret['network'], [Protocol::FEED, Protocol::PHANTOM]) && ($ret['network'] != $contact['network'])) { - self::updateContact($id, $uid, $ret['url'], ['failed' => true, 'last-update' => $updated, 'failure_update' => $updated]); + self::updateContact($id, $uid, $contact['url'], $ret['url'], ['failed' => true, 'last-update' => $updated, 'failure_update' => $updated]); return false; } @@ -1998,7 +2010,7 @@ class Contact } if (!$update) { - self::updateContact($id, $uid, $ret['url'], ['failed' => false, 'last-update' => $updated, 'success_update' => $updated]); + self::updateContact($id, $uid, $contact['url'], $ret['url'], ['failed' => false, 'last-update' => $updated, 'success_update' => $updated]); if (Contact\Relation::isDiscoverable($ret['url'])) { Worker::add(PRIORITY_LOW, 'ContactDiscovery', $ret['url']); @@ -2039,7 +2051,7 @@ class Contact unset($ret['photo']); - self::updateContact($id, $uid, $ret['url'], $ret); + self::updateContact($id, $uid, $contact['url'], $ret['url'], $ret); if (Contact\Relation::isDiscoverable($ret['url'])) { Worker::add(PRIORITY_LOW, 'ContactDiscovery', $ret['url']); diff --git a/src/Model/Tag.php b/src/Model/Tag.php index 8f132e82f3..451ed687b3 100644 --- a/src/Model/Tag.php +++ b/src/Model/Tag.php @@ -125,7 +125,9 @@ class Tag // The contact wasn't found in the system (most likely some dead account) // We ensure that we only store a single entry by overwriting the previous name Logger::info('Contact not found, updating tag', ['url' => $url, 'name' => $name]); - DBA::update('tag', ['name' => substr($name, 0, 96)], ['url' => $url]); + if (!DBA::exists('tag', ['name' => substr($name, 0, 96), 'url' => $url])) { + DBA::update('tag', ['name' => substr($name, 0, 96)], ['url' => $url]); + } } } diff --git a/src/Worker/ExpirePosts.php b/src/Worker/ExpirePosts.php index 8d50c5d9d5..14fb560b13 100644 --- a/src/Worker/ExpirePosts.php +++ b/src/Worker/ExpirePosts.php @@ -22,7 +22,6 @@ namespace Friendica\Worker; use Friendica\Core\Logger; -use Friendica\Core\Worker; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Item; @@ -46,54 +45,54 @@ class ExpirePosts } if (!empty($expire_days)) { - do { - Logger::notice('Start deleting expired threads', ['expiry_days' => $expire_days]); - $ret = DBA::e("DELETE FROM `item-uri` WHERE `id` IN - (SELECT `uri-id` FROM `post-thread` WHERE `received` < UTC_TIMESTAMP() - INTERVAL ? DAY - AND NOT `uri-id` IN (SELECT `uri-id` FROM `post-thread-user` - WHERE (`mention` OR `starred` OR `wall` OR `pinned`) AND `uri-id` = `post-thread`.`uri-id`) - AND NOT `uri-id` IN (SELECT `uri-id` FROM `post-category` - WHERE `uri-id` = `post-thread`.`uri-id`) - AND NOT `uri-id` IN (SELECT `uri-id` FROM `post-media` - WHERE `uri-id` = `post-thread`.`uri-id`) - AND NOT `uri-id` IN (SELECT `parent-uri-id` FROM `post-user` INNER JOIN `contact` ON `contact`.`id` = `contact-id` AND `notify_new_posts` - WHERE `parent-uri-id` = `post-thread`.`uri-id`) - AND NOT `uri-id` IN (SELECT `parent-uri-id` FROM `post-user` - WHERE (`origin` OR `event-id` != 0 OR `post-type` = ?) AND `parent-uri-id` = `post-thread`.`uri-id`) - AND NOT `uri-id` IN (SELECT `uri-id` FROM `post-content` - WHERE `resource-id` != 0 AND `uri-id` = `post-thread`.`uri-id`)) - ORDER BY `id` LIMIT ?", $expire_days, Item::PT_PERSONAL_NOTE, $limit); + Logger::notice('Start collecting expired threads', ['expiry_days' => $expire_days]); + $uris = DBA::select('item-uri', ['id'], ["`id` IN + (SELECT `uri-id` FROM `post-thread` WHERE `received` < UTC_TIMESTAMP() - INTERVAL ? DAY + AND NOT `uri-id` IN (SELECT `uri-id` FROM `post-thread-user` + WHERE (`mention` OR `starred` OR `wall` OR `pinned`) AND `uri-id` = `post-thread`.`uri-id`) + AND NOT `uri-id` IN (SELECT `uri-id` FROM `post-category` + WHERE `uri-id` = `post-thread`.`uri-id`) + AND NOT `uri-id` IN (SELECT `uri-id` FROM `post-media` + WHERE `uri-id` = `post-thread`.`uri-id`) + AND NOT `uri-id` IN (SELECT `parent-uri-id` FROM `post-user` INNER JOIN `contact` ON `contact`.`id` = `contact-id` AND `notify_new_posts` + WHERE `parent-uri-id` = `post-thread`.`uri-id`) + AND NOT `uri-id` IN (SELECT `parent-uri-id` FROM `post-user` + WHERE (`origin` OR `event-id` != 0 OR `post-type` = ?) AND `parent-uri-id` = `post-thread`.`uri-id`) + AND NOT `uri-id` IN (SELECT `uri-id` FROM `post-content` + WHERE `resource-id` != 0 AND `uri-id` = `post-thread`.`uri-id`))", + $expire_days, Item::PT_PERSONAL_NOTE]); - $rows = DBA::affectedRows(); - Logger::notice('Deleted expired threads', ['result' => $ret, 'rows' => $rows]); + Logger::notice('Start deleting expired threads'); + $affected_count = 0; + while ($rows = DBA::toArray($uris, false, 100)) { + $ids = array_column($rows, 'id'); + DBA::delete('item-uri', ['id' => $ids]); + $affected_count += DBA::affectedRows(); + } + DBA::close($uris); - if (!Worker::isInMaintenanceWindow()) { - Logger::notice('We are outside of the maintenance window, quitting'); - return; - } - } while ($rows >= $limit); + Logger::notice('Deleted expired threads', ['rows' => $affected_count]); } if (!empty($expire_days_unclaimed)) { - do { - Logger::notice('Start deleting unclaimed public items', ['expiry_days' => $expire_days_unclaimed]); - $ret = DBA::e("DELETE FROM `item-uri` WHERE `id` IN - (SELECT `uri-id` FROM `post-user` WHERE `gravity` = ? AND `uid` = ? AND `received` < UTC_TIMESTAMP() - INTERVAL ? DAY - AND NOT `uri-id` IN (SELECT `parent-uri-id` FROM `post-user` AS `i` WHERE `i`.`uid` != ? - AND `i`.`parent-uri-id` = `post-user`.`uri-id`) - AND NOT `uri-id` IN (SELECT `parent-uri-id` FROM `post-user` AS `i` WHERE `i`.`uid` = ? - AND `i`.`parent-uri-id` = `post-user`.`uri-id` AND `i`.`received` > UTC_TIMESTAMP() - INTERVAL ? DAY)) - ORDER BY `id` LIMIT ?", - GRAVITY_PARENT, 0, $expire_days_unclaimed, 0, 0, $expire_days_unclaimed, $limit); + Logger::notice('Start collecting unclaimed public items', ['expiry_days' => $expire_days_unclaimed]); + $uris = DBA::select('item-uri', ['id'], ["`id` IN + (SELECT `uri-id` FROM `post-user` WHERE `gravity` = ? AND `uid` = ? AND `received` < UTC_TIMESTAMP() - INTERVAL ? DAY + AND NOT `uri-id` IN (SELECT `parent-uri-id` FROM `post-user` AS `i` WHERE `i`.`uid` != ? + AND `i`.`parent-uri-id` = `post-user`.`uri-id`) + AND NOT `uri-id` IN (SELECT `parent-uri-id` FROM `post-user` AS `i` WHERE `i`.`uid` = ? + AND `i`.`parent-uri-id` = `post-user`.`uri-id` AND `i`.`received` > UTC_TIMESTAMP() - INTERVAL ? DAY))", + GRAVITY_PARENT, 0, $expire_days_unclaimed, 0, 0, $expire_days_unclaimed]); - $rows = DBA::affectedRows(); - Logger::notice('Deleted unclaimed public items', ['result' => $ret, 'rows' => $rows]); - - if (!Worker::isInMaintenanceWindow()) { - Logger::notice('We are outside of the maintenance window, quitting'); - return; - } - } while ($rows >= $limit); + Logger::notice('Start deleting unclaimed public items'); + $affected_count = 0; + while ($rows = DBA::toArray($uris, false, 100)) { + $ids = array_column($rows, 'id'); + DBA::delete('item-uri', ['id' => $ids]); + $affected_count += DBA::affectedRows(); + } + DBA::close($uris); + Logger::notice('Deleted unclaimed public items', ['rows' => $affected_count]); } } } diff --git a/src/Worker/MergeContact.php b/src/Worker/MergeContact.php index ee66abed37..6c30b9b917 100644 --- a/src/Worker/MergeContact.php +++ b/src/Worker/MergeContact.php @@ -71,7 +71,6 @@ class MergeContact if (DBStructure::existsTable('thread')) { DBA::update('thread', ['author-id' => $new_cid], ['author-id' => $old_cid]); DBA::update('thread', ['owner-id' => $new_cid], ['owner-id' => $old_cid]); - DBA::update('thread', ['causer-id' => $new_cid], ['causer-id' => $old_cid]); } } else { /// @todo Check if some other data needs to be adjusted as well, possibly the "rel" status?