|
|
@@ -25,9 +25,11 @@ namespace OC\Repair\NC15; |
|
|
|
|
|
|
|
use OCP\IConfig; |
|
|
|
use OCP\IDBConnection; |
|
|
|
use OCP\ILogger; |
|
|
|
use OCP\Migration\IOutput; |
|
|
|
use OCP\Migration\IRepairStep; |
|
|
|
use Sabre\VObject\Reader; |
|
|
|
use Sabre\VObject\ParseException; |
|
|
|
|
|
|
|
class SetVcardDatabaseUID implements IRepairStep { |
|
|
|
const MAX_ROWS = 1000; |
|
|
@@ -38,11 +40,15 @@ class SetVcardDatabaseUID implements IRepairStep { |
|
|
|
/** @var IConfig */ |
|
|
|
private $config; |
|
|
|
|
|
|
|
/** @var ILogger */ |
|
|
|
private $logger; |
|
|
|
|
|
|
|
private $updateQuery; |
|
|
|
|
|
|
|
public function __construct(IDBConnection $connection, IConfig $config) { |
|
|
|
public function __construct(IDBConnection $connection, IConfig $config, ILogger $logger) { |
|
|
|
$this->connection = $connection; |
|
|
|
$this->config = $config; |
|
|
|
$this->logger = $logger; |
|
|
|
} |
|
|
|
|
|
|
|
public function getName() { |
|
|
@@ -75,13 +81,20 @@ class SetVcardDatabaseUID implements IRepairStep { |
|
|
|
* Extract UID from vcard |
|
|
|
* |
|
|
|
* @param string $cardData the vcard raw data |
|
|
|
* @param IOutput $output the output logger |
|
|
|
* @return string the uid or empty if none |
|
|
|
*/ |
|
|
|
private function getUID(string $cardData): string { |
|
|
|
$vCard = Reader::read($cardData); |
|
|
|
if ($vCard->UID) { |
|
|
|
$uid = $vCard->UID->getValue(); |
|
|
|
return $uid; |
|
|
|
private function getUID(string $cardData, IOutput $output): string { |
|
|
|
try { |
|
|
|
$vCard = Reader::read($cardData); |
|
|
|
if ($vCard->UID) { |
|
|
|
$uid = $vCard->UID->getValue(); |
|
|
|
|
|
|
|
return $uid; |
|
|
|
} |
|
|
|
} catch (ParseException $e) { |
|
|
|
$output->warning('One vCard is broken. We logged the exception and will continue the repair.'); |
|
|
|
$this->logger->logException($e); |
|
|
|
} |
|
|
|
|
|
|
|
return ''; |
|
|
@@ -106,7 +119,7 @@ class SetVcardDatabaseUID implements IRepairStep { |
|
|
|
$this->updateQuery->execute(); |
|
|
|
} |
|
|
|
|
|
|
|
private function repair(): int { |
|
|
|
private function repair(IOutput $output): int { |
|
|
|
$this->connection->beginTransaction(); |
|
|
|
$entries = $this->getInvalidEntries(); |
|
|
|
$count = 0; |
|
|
@@ -116,7 +129,7 @@ class SetVcardDatabaseUID implements IRepairStep { |
|
|
|
if (is_resource($cardData)) { |
|
|
|
$cardData = stream_get_contents($cardData); |
|
|
|
} |
|
|
|
$uid = $this->getUID($cardData); |
|
|
|
$uid = $this->getUID($cardData, $output); |
|
|
|
$this->update($entry['id'], $uid); |
|
|
|
} |
|
|
|
$this->connection->commit(); |
|
|
@@ -133,7 +146,7 @@ class SetVcardDatabaseUID implements IRepairStep { |
|
|
|
|
|
|
|
public function run(IOutput $output) { |
|
|
|
if ($this->shouldRun()) { |
|
|
|
$count = $this->repair(); |
|
|
|
$count = $this->repair($output); |
|
|
|
|
|
|
|
$output->info('Fixed ' . $count . ' vcards'); |
|
|
|
} |