Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
25.00% |
1 / 4 |
CRAP | |
82.46% |
47 / 57 |
| Iamapen\CommentableDataSet\DbUnit\Operation\MySqlBulkInsert | |
0.00% |
0 / 1 |
|
25.00% |
1 / 4 |
20.95 | |
82.46% |
47 / 57 |
| buildOperationQuery | |
0.00% |
0 / 1 |
4.03 | |
87.50% |
14 / 16 |
|||
| buildOperationArguments | |
100.00% |
1 / 1 |
2 | |
100.00% |
4 / 4 |
|||
| disablePrimaryKeys | |
0.00% |
0 / 1 |
2.15 | |
66.67% |
2 / 3 |
|||
| execute | |
0.00% |
0 / 1 |
12.06 | |
79.41% |
27 / 34 |
|||
| <?php | |
| namespace Iamapen\CommentableDataSet\DbUnit\Operation; | |
| use PHPUnit\DbUnit\Database\Connection; | |
| use PHPUnit\DbUnit\DataSet\IDataSet; | |
| use PHPUnit\DbUnit\DataSet\ITable; | |
| use PHPUnit\DbUnit\DataSet\ITableMetadata; | |
| /** | |
| * Bulk Insert (only MySQL) | |
| * | |
| * いずれ、バルクのチャンクサイズを指定できるようにしたい | |
| * @version 0.0.1 | |
| */ | |
| class MySqlBulkInsert implements \PHPUnit\DbUnit\Operation\Operation | |
| { | |
| protected $operationName = 'MYSQL_BULK_INSERT'; | |
| protected function buildOperationQuery(ITableMetadata $databaseTableMetaData, ITable $table, Connection $connection, $rowCount) | |
| { | |
| $columnCount = \count($table->getTableMetaData()->getColumns()); | |
| if ($columnCount > 0) { | |
| $placeHolders = \implode(', ', \array_fill(0, $columnCount, '?')); | |
| $columns = ''; | |
| foreach ($table->getTableMetaData()->getColumns() as $column) { | |
| $columns .= $connection->quoteSchemaObject($column) . ', '; | |
| } | |
| $columns = \substr($columns, 0, -2); | |
| $query = " | |
| INSERT INTO {$connection->quoteSchemaObject($table->getTableMetaData()->getTableName())} | |
| ({$columns}) | |
| VALUES | |
| ({$placeHolders}) | |
| "; | |
| $bulk = ''; | |
| for ($i=1; $i<$rowCount; $i++) { | |
| $bulk .= ",({$placeHolders})\n "; | |
| } | |
| $query .= $bulk; | |
| return $query; | |
| } else { | |
| return false; | |
| } | |
| } | |
| protected function buildOperationArguments(ITableMetadata $databaseTableMetaData, ITable $table, $row) | |
| { | |
| $args = []; | |
| foreach ($table->getTableMetaData()->getColumns() as $columnName) { | |
| $args[] = $table->getValue($row, $columnName); | |
| } | |
| return $args; | |
| } | |
| protected function disablePrimaryKeys(ITableMetadata $databaseTableMetaData, ITable $table, Connection $connection) | |
| { | |
| if (\count($databaseTableMetaData->getPrimaryKeys())) { | |
| return true; | |
| } | |
| return false; | |
| } | |
| /** | |
| * @param Connection $connection | |
| * @param IDataSet $dataSet | |
| */ | |
| public function execute(Connection $connection, IDataSet $dataSet) | |
| { | |
| $databaseDataSet = $connection->createDataSet(); | |
| $dsIterator = $dataSet->getIterator(); | |
| foreach ($dsIterator as $table) { | |
| $rowCount = $table->getRowCount(); | |
| if ($rowCount == 0) { | |
| continue; | |
| } | |
| /* @var $table ITable */ | |
| $databaseTableMetaData = $databaseDataSet->getTableMetaData($table->getTableMetaData()->getTableName()); | |
| $disablePrimaryKeys = $this->disablePrimaryKeys($databaseTableMetaData, $table, $connection); | |
| if ($disablePrimaryKeys) { | |
| $connection->disablePrimaryKeys($databaseTableMetaData->getTableName()); | |
| } | |
| $bulkI = 0; | |
| while ($bulkI < $rowCount) { | |
| $chunkLen = 0; | |
| $args = []; | |
| for ($i=0; $i<100; $i++) { | |
| $rowNum = $bulkI + $i; | |
| if ($rowNum >= $rowCount) { | |
| break; | |
| } | |
| $args = array_merge($args, $this->buildOperationArguments($databaseTableMetaData, $table, $rowNum)); | |
| $chunkLen++; | |
| } | |
| $query = $this->buildOperationQuery($databaseTableMetaData, $table, $connection, $chunkLen); | |
| if ($query === false) { | |
| if ($table->getRowCount() > 0) { | |
| throw new \PHPUnit\DbUnit\Operation\Exception($this->operationName, '', [], $table, 'Rows requested for insert, but no columns provided!'); | |
| } | |
| continue; | |
| } | |
| try { | |
| $statement = $connection->getConnection()->prepare($query); | |
| $statement->execute($args); | |
| } catch (\Exception $e) { | |
| throw new \PHPUnit\DbUnit\Operation\Exception( | |
| $this->operationName, $query, $args, $table, $e->getMessage() | |
| ); | |
| } | |
| $bulkI += $i; | |
| } | |
| if ($disablePrimaryKeys) { | |
| $connection->enablePrimaryKeys($databaseTableMetaData->getTableName()); | |
| } | |
| } | |
| } | |
| } |