Check fpr duplicated contacts upon inserting them
This commit is contained in:
parent
141bcf149d
commit
ef02a1cb7b
2 changed files with 24 additions and 40 deletions
|
@ -137,7 +137,8 @@ class Contact extends BaseObject
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Insert a row into the contact table
|
* Insert a row into the contact table
|
||||||
|
* Important: You can't use DBA::lastInsertId() after this call since it will be set to 0.
|
||||||
*
|
*
|
||||||
* @param array $param parameter array
|
* @param array $param parameter array
|
||||||
* @param bool $on_duplicate_update Do an update on a duplicate entry
|
* @param bool $on_duplicate_update Do an update on a duplicate entry
|
||||||
|
@ -148,7 +149,6 @@ class Contact extends BaseObject
|
||||||
public static function insert($param, $on_duplicate_update = false)
|
public static function insert($param, $on_duplicate_update = false)
|
||||||
{
|
{
|
||||||
$ret = DBA::insert('contact', $param, $on_duplicate_update);
|
$ret = DBA::insert('contact', $param, $on_duplicate_update);
|
||||||
|
|
||||||
$contact = DBA::selectFirst('contact', ['nurl', 'uid', 'id'], ['id' => DBA::lastInsertId()]);
|
$contact = DBA::selectFirst('contact', ['nurl', 'uid', 'id'], ['id' => DBA::lastInsertId()]);
|
||||||
if (!DBA::isResult($contact)) {
|
if (!DBA::isResult($contact)) {
|
||||||
// Shouldn't happen
|
// Shouldn't happen
|
||||||
|
@ -161,41 +161,6 @@ class Contact extends BaseObject
|
||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $fields contains the fields that are updated
|
|
||||||
* @param array $condition condition array with the key values
|
|
||||||
* @param array|boolean $old_fields array with the old field values that are about to be replaced (true = update on duplicate)
|
|
||||||
*
|
|
||||||
* @return boolean was the update successfull?
|
|
||||||
* @throws \Exception
|
|
||||||
*/
|
|
||||||
public static function update($fields, $condition, $old_fields = [])
|
|
||||||
{
|
|
||||||
$ret = DBA::update('contact', $fields, $condition, $old_fields);
|
|
||||||
|
|
||||||
// We quit when the update affected more than one row
|
|
||||||
if (DBA::affectedRows() > 1) {
|
|
||||||
return $ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Don't proceed when the command aboved queried more than one row
|
|
||||||
// This is not a duplicate of the test above since that only checked for affected rows
|
|
||||||
if (DBA::count('contact', $condition) != 1) {
|
|
||||||
return $ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
$contact = DBA::selectFirst('contact', ['nurl', 'uid', 'id'], $condition);
|
|
||||||
if (!DBA::isResult($contact)) {
|
|
||||||
// Shouldn't happen
|
|
||||||
return $ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Search for duplicated contacts and get rid of them
|
|
||||||
self::handleDuplicates($contact['nurl'], $contact['uid'], $contact['id']);
|
|
||||||
|
|
||||||
return $ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param integer $id Contact ID
|
* @param integer $id Contact ID
|
||||||
* @param array $fields Array of selected fields, empty for all
|
* @param array $fields Array of selected fields, empty for all
|
||||||
|
@ -1548,7 +1513,7 @@ class Contact extends BaseObject
|
||||||
if (!DBA::isResult($contact)) {
|
if (!DBA::isResult($contact)) {
|
||||||
Logger::info('Create new contact', $fields);
|
Logger::info('Create new contact', $fields);
|
||||||
|
|
||||||
DBA::insert('contact', $fields);
|
self::insert($fields);
|
||||||
|
|
||||||
// We intentionally aren't using lastInsertId here. There is a chance for duplicates.
|
// We intentionally aren't using lastInsertId here. There is a chance for duplicates.
|
||||||
$contact = DBA::selectFirst('contact', ['id'], $condition, ['order' => ['id']]);
|
$contact = DBA::selectFirst('contact', ['id'], $condition, ['order' => ['id']]);
|
||||||
|
@ -1954,6 +1919,25 @@ class Contact extends BaseObject
|
||||||
DBA::update('contact', $fields, $condition);
|
DBA::update('contact', $fields, $condition);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check and remove duplicate contact entries
|
||||||
|
*
|
||||||
|
* @param integer $contact_id Contact ID
|
||||||
|
* @throws \Exception
|
||||||
|
*/
|
||||||
|
public static function handleDuplicateByID($contact_id)
|
||||||
|
{
|
||||||
|
$contact = DBA::selectFirst('contact', ['nurl', 'uid', 'id'], ['id' => $contact_id]);
|
||||||
|
if (!DBA::isResult($contact)) {
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search for duplicated contacts and get rid of them
|
||||||
|
self::handleDuplicates($contact['nurl'], $contact['uid'], $contact['id']);
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Helper function for "updateFromProbe". Remove duplicated contacts
|
* @brief Helper function for "updateFromProbe". Remove duplicated contacts
|
||||||
*
|
*
|
||||||
|
@ -2325,7 +2309,7 @@ class Contact extends BaseObject
|
||||||
$new_relation = (in_array($protocol, [Protocol::MAIL]) ? self::FRIEND : self::SHARING);
|
$new_relation = (in_array($protocol, [Protocol::MAIL]) ? self::FRIEND : self::SHARING);
|
||||||
|
|
||||||
// create contact record
|
// create contact record
|
||||||
DBA::insert('contact', [
|
self::insert([
|
||||||
'uid' => $uid,
|
'uid' => $uid,
|
||||||
'created' => DateTimeFormat::utcNow(),
|
'created' => DateTimeFormat::utcNow(),
|
||||||
'url' => $ret['url'],
|
'url' => $ret['url'],
|
||||||
|
|
|
@ -200,7 +200,7 @@ class Diaspora
|
||||||
DBA::update('contact', $fields, $condition, $old);
|
DBA::update('contact', $fields, $condition, $old);
|
||||||
} else {
|
} else {
|
||||||
Logger::info('Create relay contact', ['fields' => $fields]);
|
Logger::info('Create relay contact', ['fields' => $fields]);
|
||||||
DBA::insert('contact', $fields);
|
Contact::insert($fields);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue