Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/mail.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDaniel Kesselberg <mail@danielkesselberg.de>2018-09-14 13:45:54 +0300
committerDaniel Kesselberg <mail@danielkesselberg.de>2018-09-14 13:45:54 +0300
commit9bfc913b09b93f871fea6e307a2c20e4e5f49508 (patch)
tree733bfaea677dd082f2d25a1504ae9755358af63f /lib
parentc2d02590f1116b3f023c28b29713a34d46c6fca2 (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.php77
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();
}
}