diff options
author | Daniel Kesselberg <mail@danielkesselberg.de> | 2018-09-14 13:45:54 +0300 |
---|---|---|
committer | Daniel Kesselberg <mail@danielkesselberg.de> | 2018-09-14 13:45:54 +0300 |
commit | 9bfc913b09b93f871fea6e307a2c20e4e5f49508 (patch) | |
tree | 733bfaea677dd082f2d25a1504ae9755358af63f /lib | |
parent | c2d02590f1116b3f023c28b29713a34d46c6fca2 (diff) |
Copy collected addresses in batches to reduce memory usage
Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Migration/Version0110Date20180825201241.php | 77 |
1 files changed, 53 insertions, 24 deletions
diff --git a/lib/Migration/Version0110Date20180825201241.php b/lib/Migration/Version0110Date20180825201241.php index 1cbb89a25..ea390c876 100644 --- a/lib/Migration/Version0110Date20180825201241.php +++ b/lib/Migration/Version0110Date20180825201241.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace OCA\Mail\Migration; +use OCA\Mail\Db\CollectedAddress; +use OCA\Mail\Db\CollectedAddressMapper; use OCP\DB\ISchemaWrapper; use OCP\IDBConnection; use OCP\Migration\SimpleMigrationStep; @@ -52,9 +54,39 @@ class Version0110Date20180825201241 extends SimpleMigrationStep { /** @var ISchemaWrapper $schema */ $schema = $schemaClosure(); - if ($schema->hasTable('mail_collected_addresses')) { - $this->copyCollectedAddresses(); + if (!$schema->hasTable('mail_collected_addresses')) { + return; + } + + /** @var IDBConnection $connection */ + $connection = $this->connection; + + // add method to overwrite tableName + $collectedAdressesMapper = new class($connection) extends CollectedAddressMapper { + public function setTableName(string $tableName) { + $this->tableName = $tableName; + } + }; + + // change table name + $collectedAdressesMapper->setTableName('mail_collected_addresses'); + + $nrOfAddresses = $collectedAdressesMapper->getTotal(); + $output->startProgress($nrOfAddresses); + + $chunk = $collectedAdressesMapper->getChunk(); + while (\count($chunk) > 0) { + $maxId = null; + foreach ($chunk as $address) { + /* @var $address CollectedAddress */ + $maxId = $address->getId(); + $this->insertAddress($address); + } + + $output->advance(\count($chunk)); + $chunk = $collectedAdressesMapper->getChunk($maxId + 1); } + $output->finishProgress(); } /** @@ -83,28 +115,25 @@ class Version0110Date20180825201241 extends SimpleMigrationStep { } /** - * Copy collected addresses to new table + * Insert collected addresses to new table + * + * @param CollectedAddress $address */ - private function copyCollectedAddresses(): void { - $query = $this->connection->getQueryBuilder(); - $query->select('*') - ->from('mail_collected_addresses'); - - $insert = $this->connection->getQueryBuilder(); - $insert->insert('mail_coll_addresses') - ->values(['id' => '?', 'user_id' => '?', 'email' => '?', 'display_name' => '?']); - - $result = $query->execute(); - - while ($row = $result->fetch()) { - $insert->setParameters([ - $row['id'], - $row['user_id'], - $row['email'], - $row['display_name'] - ])->execute(); - } - - $result->closeCursor(); + private function insertAddress(CollectedAddress $address) { + $this->connection->getQueryBuilder() + ->insert('mail_coll_addresses') + ->values([ + 'id' => '?', + 'user_id' => '?', + 'email' => '?', + 'display_name' => '?' + ]) + ->setParameters([ + $address->getId(), + $address->getUserId(), + $address->getEmail(), + $address->getDisplayName() + ]) + ->execute(); } } |