/**
  * @param \DatabaseExporterImporter\Entity\Table $table
  * @return \DatabaseExporterImporter\Entity\Column|null
  */
 public function getAutoIncrementColumn(Table $table)
 {
     foreach ($table->getColumns() as $column) {
         if (true === $column->isAutoIncrement()) {
             return $column;
         }
     }
 }
 public function test()
 {
     $table = new Table('table_name');
     $column1 = new Column('id');
     $column1->setAutoIncrement(true);
     $column2 = new Column('name');
     $table->addColumn($column1)->addColumn($column2);
     $subject = new AutoIncrementTableColumnFinder();
     static::assertSame($column1->getName(), $subject->getAutoIncrementColumn($table)->getName());
     static::assertNull($subject->getAutoIncrementColumn(new Table('test_table')));
 }
 /**
  * @param \DatabaseExporterImporter\Entity\Table $table
  * @return array
  */
 public function getDataRows(Table $table)
 {
     $dataRows = [];
     foreach ($table->getDataRows() as $dataRow) {
         $row = [];
         foreach ($dataRow->getDataColumns() as $dataColumn) {
             $row[$dataColumn->getName()] = $dataColumn->getValue();
         }
         $dataRows[] = $row;
     }
     return $dataRows;
 }
 /**
  * @param \DatabaseExporterImporter\Entity\Table        $table
  * @param \DatabaseExporterImporter\Entity\DataColumn[] $values
  * @return int
  * @throws \RuntimeException
  */
 protected function insertRecord(Table $table, array $values)
 {
     $sqlValues = [];
     foreach ($values as $value) {
         $sqlValues[$value->getName()] = $value->getValue();
     }
     $statement = $this->connection->prepare('INSERT INTO ' . $table->getName() . ' (' . implode(', ', array_keys($sqlValues)) . ') ' . 'VALUES(' . substr(str_repeat('?, ', count($sqlValues)), 0, -2) . ')');
     if (false === $statement->execute(array_values($sqlValues))) {
         $errors = $statement->errorInfo();
         throw new \RuntimeException($errors[2]);
     }
     return $this->connection->lastInsertId();
 }
 /**
  * @param \DatabaseExporterImporter\Entity\Table $table
  * @return array
  */
 public function getTableColumns(Table $table)
 {
     $columns = [];
     foreach ($table->getColumns() as $column) {
         $columnExport = ['name' => $column->getName()];
         if (true === $column->isAutoIncrement()) {
             $columnExport['auto_increment'] = true;
         }
         $foreignKey = $column->getForeignKey();
         if (null !== $foreignKey) {
             $columnExport['foreign_key'] = ['table_name' => $foreignKey->getTableName(), 'column_name' => $foreignKey->getColumnName()];
         }
         $columns[] = $columnExport;
     }
     return $columns;
 }
 public function test()
 {
     $tableName = mt_rand();
     $subject = new Table($tableName);
     static::assertSame($tableName, $subject->getName());
     static::assertCount(0, $subject->getColumns());
     $columnName = mt_rand();
     $column = new Column($columnName);
     $subject->addColumn($column);
     static::assertCount(1, $subject->getColumns());
     $firstColumn = reset($subject->getColumns());
     static::assertSame($columnName, $firstColumn->getName());
     $dataRow = new DataRow();
     static::assertCount(0, $subject->getDataRows());
     $subject->addDataRow($dataRow);
     static::assertCount(1, $subject->getDataRows());
 }
 /**
  * @throws \InvalidArgumentException
  * @return \DatabaseExporterImporter\Entity\Table[]
  */
 private function createTables()
 {
     $tables = [];
     foreach ($this->parsedData as $tableName => $tableData) {
         $table = new Table($tableName);
         if (false === is_array($tableData)) {
             throw new \InvalidArgumentException('The data structure is incorrect.');
         }
         if (false === array_key_exists('columns', $tableData)) {
             throw new \InvalidArgumentException("The data structure is incorrect: 'columns' key is absent.");
         }
         foreach ($this->columnsCreator->getColumns($tableData['columns']) as $column) {
             $table->addColumn($column);
         }
         foreach ($this->dataRowsCreator->getDataRows($tableData['data_rows']) as $dataRow) {
             $table->addDataRow($dataRow);
         }
         $tables[] = $table;
     }
     return $tables;
 }
 /**
  * @return array
  */
 public function getForeignKeyValues()
 {
     $values = [];
     foreach ($this->table->getColumns() as $column) {
         if (null !== $column->getForeignKey()) {
             $values[$column->getName()] = [];
             foreach ($this->tables as $existingTable) {
                 if ($column->getForeignKey()->getTableName() === $existingTable->getName()) {
                     foreach ($existingTable->getDataRows() as $dataRow) {
                         foreach ($dataRow->getDataColumns() as $dataColumn) {
                             if ($dataColumn->getName() === $column->getForeignKey()->getColumnName()) {
                                 $values[$column->getName()][] = $dataColumn->getValue();
                             }
                         }
                     }
                 }
             }
         }
     }
     return $values;
 }
 /**
  * @param \DatabaseExporterImporter\Entity\Table $table
  * @throws \RuntimeException
  * @return array
  */
 protected function getTableData(Table $table)
 {
     $sql = 'SELECT * FROM ' . $table->getName() . ' WHERE ';
     $sqlAndParts = ['1 = 1'];
     $queryParams = [];
     if (null !== $this->primaryTableName) {
         if ($table->getName() === $this->primaryTableName) {
             $sqlAndParts[] = $this->primaryKeyColumn . ' = :value';
             $queryParams[':value'] = $this->primaryKey;
         } else {
             foreach ($this->foreignValueProvider->setTable($table)->setTables($this->tables)->getForeignKeyValues() as $columnName => $columnValues) {
                 $conditionValuesStubs = [];
                 foreach ((array) $columnValues as $counter => $columnValue) {
                     $conditionValuesStubs[] = ':' . $columnName . $counter;
                     $queryParams[':' . $columnName . $counter] = $columnValue;
                 }
                 $sqlAndParts[] = $columnName . ' IN(' . implode(', ', $conditionValuesStubs) . ')';
             }
         }
     }
     return $this->getQueryResult($sql . implode(' AND ', $sqlAndParts), $queryParams);
 }