From 89f0b85905eee4830b51922d40d223dbe95bc553 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Mon, 6 Mar 2017 16:19:12 -0500 Subject: [PATCH] Split slow catch-all query into three fast queries Thanks @annando for the tip. --- include/Contact.php | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/include/Contact.php b/include/Contact.php index ae06ecf11b..845ee168cc 100644 --- a/include/Contact.php +++ b/include/Contact.php @@ -534,14 +534,32 @@ function get_contact($url, $uid = 0, $no_update = false) { $data = array(); $contact_id = 0; - // Catch-all query, may return multiple rows + // We first try the addr (nick@server.tld) $contacts = q("SELECT `id`, `avatar-date` FROM `contact` - WHERE ('%s' IN (`url`, `addr`, `alias`) OR '%s' IN (`nurl`, `alias`)) + WHERE `addr` = '%s' AND `uid` = %d", dbesc($url), - dbesc(normalise_link($url)), intval($uid)); + // Then the nurl (http://server.tld/nick) + if (! dbm::is_result($contacts)) { + $contacts = q("SELECT `id`, `avatar-date` FROM `contact` + WHERE `nurl` = '%s' + AND `uid` = %d", + dbesc(normalise_link($url)), + intval($uid)); + } + + // Then the alias (which could be anything) + if (! dbm::is_result($contacts)) { + $contacts = q("SELECT `id`, `avatar-date` FROM `contact` + WHERE `alias` IN ('%s', '%s') + AND `uid` = %d", + dbesc($url), + dbesc(normalise_link($url)), + intval($uid)); + } + if (dbm::is_result($contacts)) { $contact_id = $contacts[0]["id"]; @@ -552,6 +570,7 @@ function get_contact($url, $uid = 0, $no_update = false) { return $contact_id; } } elseif ($uid != 0) { + // Non-existing user-specific contact, exiting return 0; }