From ea9a6760564c7694e11e060b78cb0e3db613305e Mon Sep 17 00:00:00 2001 From: Wolfgang Ziegler // fago Date: Fri, 25 Jan 2019 12:40:28 +0100 Subject: [PATCH] Ensure changes marked as deleted are propagated as such. --- src/Replication.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/Replication.php b/src/Replication.php index 8166b1a..91f10f9 100644 --- a/src/Replication.php +++ b/src/Replication.php @@ -41,6 +41,13 @@ class Replication { protected $targetLog; + /** + * Array of deleted revs, keyed with the rev id. + * + * @var string[] + */ + protected $deletedRevs = []; + /** * @param CouchDBClient $source * @param CouchDBClient $target @@ -71,6 +78,7 @@ public function __construct(CouchDBClient $source, CouchDBClient $target, Replic public function start($printStatus = true, $getFinalReport = true) { + $this->deletedRevs = []; $this->startTime = new \DateTime(); // DB info (via GET /{db}) for source and target. $this->verifyPeers(); @@ -310,6 +318,11 @@ public function getMapping($changes) foreach ($row['changes'] as $revision) { $mapping[$row['id']][] = $revision['rev']; } + // Remember deleted revs for later. + if (!empty($row['deleted'])) { + $this->deletedRevs[$revision['rev']] = $revision['rev']; + } + } return $mapping; } @@ -532,6 +545,13 @@ public function replicateChanges(array &$revDiff) throw HTTPException::fromResponse('*/*', $response); } list($docStack, $multipartResponse) = $response; + // Mark docs as deleted according the changes. + foreach ($docStack as &$doc) { + $doc = json_decode($doc, true); + if (!empty($this->deletedRevs[$doc['_rev']])) { + $doc['deleted'] = TRUE; + } + } } catch (\Exception $e) { throw new \Exception($e->getMessage(), $e->getCode()); }