From: Michael <heluecht@pirati.ca>
Date: Sun, 14 Jul 2019 10:22:19 +0000 (+0000)
Subject: Use an insert to avoid duplicates and for analyzing
X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=9ba3ee13a80ad9db6cad6a0c52dcafb6177ae72d;p=friendica.git

Use an insert to avoid duplicates and for analyzing
---

diff --git a/src/Model/Contact.php b/src/Model/Contact.php
index e892c99f2a..9f6fa6264b 100644
--- a/src/Model/Contact.php
+++ b/src/Model/Contact.php
@@ -1418,13 +1418,22 @@ class Contact extends BaseObject
 
 			$condition = ['nurl' => Strings::normaliseLink($data["url"]), 'uid' => $uid, 'deleted' => false];
 
-			// This does an insert but should most likely prevent duplicates
-			DBA::update('contact', $fields, $condition, true);
-
+			// Before inserting we do check if the entry does exist now.
 			$contact = DBA::selectFirst('contact', ['id'], $condition, ['order' => ['id']]);
 			if (!DBA::isResult($contact)) {
-				// Shouldn't happen
-				return 0;
+				Logger::info('Create new contact', $fields);
+
+				DBA::insert('contact', $fields);
+
+				// We intentionally aren't using lastInsertId here. There is a chance for duplicates.
+				$contact = DBA::selectFirst('contact', ['id'], $condition, ['order' => ['id']]);
+				if (!DBA::isResult($contact)) {
+					Logger::info('Contact creation failed', $fields);
+					// Shouldn't happen
+					return 0;
+				}
+			} else {
+				Logger::info('Contact had been created before', ['id' => $contact["id"], 'url' => $url, 'contact' => $fields]);
 			}
 
 			$contact_id = $contact["id"];
diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php
index 5f37684ad6..8e2e487796 100644
--- a/src/Protocol/Diaspora.php
+++ b/src/Protocol/Diaspora.php
@@ -191,15 +191,17 @@ class Diaspora
 		$fields = array_merge($fields, $network_fields);
 
 		$condition = ['uid' => 0, 'nurl' => Strings::normaliseLink($server_url)];
-		$relay = DBA::selectFirst('contact', ['id'], $condition);
-		if (DBA::isResult($relay)) {
+		$old = DBA::selectFirst('contact', [], $condition);
+		if (DBA::isResult($old)) {
 			unset($fields['created']);
-			$condition = ['id' => $relay['id']];
-		}
-
-		Logger::info('Set relay contact', ['fields' => $fields, 'condition' => $condition]);
+			$condition = ['id' => $old['id']];
 
-		DBA::update('contact', $fields, $condition, true);
+			Logger::info('Update relay contact', ['fields' => $fields, 'condition' => $condition]);
+			DBA::update('contact', $fields, $condition, $old);
+		} else {
+			Logger::info('Create relay contact', ['fields' => $fields]);
+			DBA::insert('contact', $fields);
+		}
 	}
 
 	/**