![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/setup/src/Magento/Setup/Model/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Setup\Model; /** * Encapsulate logic that performs batch insert into table */ class BatchInsert { /** * @var \Magento\Framework\App\ResourceConnection */ private $resourceConnection; /** * @var \Magento\Framework\DB\Adapter\AdapterInterface */ private $dbConnection; /** * @var string */ private $insertIntoTable; /** * @var int */ private $batchSize; /** * @var \SplFixedArray */ private $dataStorage; /** * @var int */ private $currentStorageIndex = 0; /** * @param \Magento\Framework\App\ResourceConnection $resourceConnection * @param string $insertIntoTable * @param int $batchSize */ public function __construct( \Magento\Framework\App\ResourceConnection $resourceConnection, $insertIntoTable, $batchSize ) { $this->resourceConnection = $resourceConnection; $this->insertIntoTable = $insertIntoTable; $this->batchSize = $batchSize; $this->dataStorage = new \SplFixedArray($batchSize); } /** * Save data to $dataStorage and automatically flush it to DB when storage size becomes equal to $batchSize * * @param array $dataToInsert * @return void */ public function insert(array $dataToInsert) { $this->dataStorage[$this->currentStorageIndex] = $dataToInsert; $this->currentStorageIndex++; if ($this->currentStorageIndex >= $this->batchSize) { $this->flush(); } } /** * Insert all data form $dataStorage to DB and clear $dataStorage * * @return void */ public function flush() { if ($this->currentStorageIndex > 0) { if ($this->currentStorageIndex < $this->batchSize) { $this->dataStorage->setSize($this->currentStorageIndex); } if (method_exists($this->dataStorage, 'getIterator')) { // PHP > 8.0 $this->dataStorage->getIterator()->rewind(); $columnsToInsert = array_keys($this->dataStorage->getIterator()->current()); } else { // PHP 7.4. compatibility $this->dataStorage->rewind(); $columnsToInsert = array_keys($this->dataStorage->current()); } $this->getDbConnection() ->insertArray( $this->insertIntoTable, $columnsToInsert, $this->dataStorage->toArray() ); $this->dataStorage = new \SplFixedArray($this->batchSize); $this->currentStorageIndex = 0; } } /** * Retrieve current connection to DB * * Method is required to eliminate multiple calls to ResourceConnection class * * @return \Magento\Framework\DB\Adapter\AdapterInterface */ private function getDbConnection() { if ($this->dbConnection === null) { $this->dbConnection = $this->resourceConnection->getConnection(); } return $this->dbConnection; } }