Initialize the exporter only once in ImportWorker
authorTim Düsterhus <duesterhus@woltlab.com>
Fri, 29 Jan 2021 13:13:36 +0000 (14:13 +0100)
committerTim Düsterhus <duesterhus@woltlab.com>
Fri, 29 Jan 2021 13:18:38 +0000 (14:18 +0100)
Resolves #3556

wcfsetup/install/files/lib/system/worker/ImportWorker.class.php

index 7d9ac676e71e301a89ca482ceaa7d1fab88002c3..9139b0b26919134950455ab53aca1a7d4f917715 100644 (file)
@@ -4,6 +4,7 @@ namespace wcf\system\worker;
 
 use wcf\data\object\type\ObjectTypeCache;
 use wcf\system\exception\SystemException;
+use wcf\system\exporter\IExporter;
 use wcf\system\importer\ImportHandler;
 use wcf\system\WCF;
 use wcf\util\StringUtil;
@@ -46,13 +47,21 @@ class ImportWorker extends AbstractWorker
         if ($this->importData === null) {
             throw new SystemException("import data missing");
         }
+    }
+
+    /**
+     * Initializes the exporter.
+     */
+    protected function bootstrap(): void
+    {
+        if ($this->exporter) {
+            throw new \BadMethodCallException('The exporter is already bootstrapped.');
+        }
 
-        // get exporter
         $this->exporter = ObjectTypeCache::getInstance()
             ->getObjectTypeByName('com.woltlab.wcf.exporter', $this->importData['exporterName'])
             ->getProcessor();
 
-        // set data
         $this->exporter->setData(
             $this->importData['dbHost'],
             $this->importData['dbUser'],
@@ -64,10 +73,8 @@ class ImportWorker extends AbstractWorker
         );
         $this->exporter->init();
 
-        // set user merge mode
         ImportHandler::getInstance()->setUserMergeMode($this->importData['userMergeMode']);
 
-        // set import hash
         ImportHandler::getInstance()->setImportHash(\substr(
             StringUtil::getHash(
                 $this->importData['dbHost'] . $this->importData['dbName'] . $this->importData['dbPrefix']
@@ -77,12 +84,25 @@ class ImportWorker extends AbstractWorker
         ));
     }
 
+    /**
+     * Returns the exporter instance.
+     */
+    protected function getExporter(): IExporter
+    {
+        if (!$this->exporter) {
+            $this->bootstrap();
+            \assert($this->exporter);
+        }
+
+        return $this->exporter;
+    }
+
     /**
      * @inheritDoc
      */
     protected function countObjects()
     {
-        $this->count = $this->exporter->countLoops($this->parameters['objectType']);
+        $this->count = $this->getExporter()->countLoops($this->parameters['objectType']);
     }
 
     /**
@@ -118,7 +138,7 @@ class ImportWorker extends AbstractWorker
         $statement = WCF::getDB()->prepareStatement($sql);
         $statement->execute();
 
-        $this->exporter->exportData($this->parameters['objectType'], $this->loopCount);
+        $this->getExporter()->exportData($this->parameters['objectType'], $this->loopCount);
     }
 
     /**