From 18ea7f70a2c511ed6625f1bb0b3112a527e0f360 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Mon, 11 Jun 2018 12:26:53 +0300 Subject: [PATCH] [test] upd snapshotter, use storage meta --- Command/MakeCollectionsSnapshotsCommand.php | 21 +++--------- Snapshotter.php | 37 +++++++++++---------- Test/YadmExtension.php | 31 ++++++++--------- 3 files changed, 40 insertions(+), 49 deletions(-) diff --git a/Command/MakeCollectionsSnapshotsCommand.php b/Command/MakeCollectionsSnapshotsCommand.php index 56e2b41..94c04b7 100644 --- a/Command/MakeCollectionsSnapshotsCommand.php +++ b/Command/MakeCollectionsSnapshotsCommand.php @@ -49,26 +49,13 @@ protected function execute(InputInterface $input, OutputInterface $output) { $logger = new ConsoleLogger($output); - $logger->debug('Make snapshots of mongodb collections'); + $logger->info('Make collection\s snapshots'); $snapshotter = new Snapshotter($this->client); - $processedCollections = []; - foreach ($this->yadm->getStorages() as $name => $storage) { - /** @var Storage $storage */ - - $collection = $storage->getCollection(); - - $collection->getCollectionName(); - - if (isset($processedCollections[$collection->getCollectionName()])) { - continue; - } - - $snapshotter->make($collection, $logger); - - $processedCollections[$collection->getCollectionName()] = true; + foreach ($this->yadm->getUniqueStorages() as $storage) { + $snapshotter->make($storage, $logger); } - $logger->debug('Done'); + $logger->info('Done'); } } diff --git a/Snapshotter.php b/Snapshotter.php index 1412a36..77630f1 100644 --- a/Snapshotter.php +++ b/Snapshotter.php @@ -1,8 +1,8 @@ client = $client; } - /** - * @param Collection $collection - * @param LoggerInterface|null $logger - */ - public function make(Collection $collection, LoggerInterface $logger = null) + public function make(Storage $storage, LoggerInterface $logger = null) { $logger = $logger ?: new NullLogger(); + $collection = $storage->getCollection(); + $collectionName = $collection->getCollectionName(); $dbName = $collection->getDatabaseName(); $snapshotDbName = $dbName.'_snapshot'; + $this->client->selectCollection($snapshotDbName, $collectionName)->drop(); + $logger->debug(sprintf( 'Copy documents from %s.%s to %s.%s', $dbName, @@ -42,24 +42,28 @@ public function make(Collection $collection, LoggerInterface $logger = null) )); $snapshotCollection = $this->client->selectCollection($snapshotDbName, $collectionName); - $snapshotCollection->drop(); - foreach ($collection->find() as $document) { - $snapshotCollection->insertOne($document); + if ($documents = $collection->find()->toArray()) { + $snapshotCollection->insertMany($documents); } } - /** - * @param Collection $collection - * @param LoggerInterface|null $logger - */ - public function restore(Collection $collection, LoggerInterface $logger = null) + public function restore(Storage $storage, LoggerInterface $logger = null) { $logger = $logger ?: new NullLogger(); + $collection = $storage->getCollection(); + $collectionName = $collection->getCollectionName(); $dbName = $collection->getDatabaseName(); $snapshotDbName = $dbName.'_snapshot'; + $collection->drop(); + + $this->client->selectDatabase($dbName)->createCollection($collectionName, $storage->getMeta()->getCreateCollectionOptions()); + foreach ($storage->getMeta()->getIndexes() as $index) { + $collection->createIndex($index->getKey(), $index->getOptions()); + } + $logger->debug(sprintf( 'Copy documents from %s.%s to %s.%s', $dbName, @@ -69,9 +73,8 @@ public function restore(Collection $collection, LoggerInterface $logger = null) )); $snapshotCollection = $this->client->selectCollection($snapshotDbName, $collectionName); - $collection->drop(); - foreach ($snapshotCollection->find() as $document) { - $collection->insertOne($document); + if ($documents = $snapshotCollection->find()->toArray()) { + $collection->insertMany($documents); } } } \ No newline at end of file diff --git a/Test/YadmExtension.php b/Test/YadmExtension.php index 02093cd..dbf36c8 100644 --- a/Test/YadmExtension.php +++ b/Test/YadmExtension.php @@ -3,31 +3,32 @@ use Makasim\Yadm\Bundle\Snapshotter; use Makasim\Yadm\Registry; +use Makasim\Yadm\Storage; use MongoDB\Client; use Symfony\Component\HttpKernel\Kernel; trait YadmExtension { - protected function restoreSnapshots() + protected function truncateStorages() { - $snapshotter = new Snapshotter($this->getMongodbClient()); - - $processedCollections = []; - foreach ($this->getYadmRegistry()->getStorages() as $name => $storage) { - $collection = $storage->getCollection(); - - $collection->getCollectionName(); - - if (isset($processedCollections[$collection->getCollectionName()])) { - continue; - } - - $snapshotter->restore($collection); + foreach ($this->getYadmRegistry()->getUniqueStorages() as $storage) { + $storage->getCollection()->drop(); + } + } - $processedCollections[$collection->getCollectionName()] = true; + protected function restoreStorages() + { + foreach ($this->getYadmRegistry()->getUniqueStorages() as $storage) { + $this->restoreStorage($storage); } } + protected function restoreStorage(Storage $storage) + { + $snapshotter = new Snapshotter($this->getMongodbClient()); + $snapshotter->restore($storage); + } + protected function getYadmRegistry(): Registry { return $this->getKernel()->getContainer()->get('yadm');