Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/BaseSeed.php
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,16 @@ public function insert(string $tableName, array $data): void
$table->insert($data)->save();
}

/**
* {@inheritDoc}
*/
public function insertOrSkip(string $tableName, array $data): void
{
// convert to table object
$table = new Table($tableName, [], $this->getAdapter());
$table->insertOrSkip($data)->save();
}

/**
* {@inheritDoc}
*/
Expand Down
36 changes: 28 additions & 8 deletions src/Db/Adapter/AbstractAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
use Migrations\Db\Action\RenameColumn;
use Migrations\Db\Action\RenameTable;
use Migrations\Db\AlterInstructions;
use Migrations\Db\InsertMode;
use Migrations\Db\Literal;
use Migrations\Db\Table;
use Migrations\Db\Table\CheckConstraint;
Expand Down Expand Up @@ -600,9 +601,9 @@ public function fetchAll(string $sql): array
/**
* @inheritDoc
*/
public function insert(TableMetadata $table, array $row): void
public function insert(TableMetadata $table, array $row, ?InsertMode $mode = null): void
{
$sql = $this->generateInsertSql($table, $row);
$sql = $this->generateInsertSql($table, $row, $mode);

if ($this->isDryRunEnabled()) {
$this->io->out($sql);
Expand All @@ -626,12 +627,14 @@ public function insert(TableMetadata $table, array $row): void
*
* @param \Migrations\Db\Table\TableMetadata $table The table to insert into
* @param array $row The row to insert
* @param \Migrations\Db\InsertMode|null $mode Insert mode
* @return string
*/
protected function generateInsertSql(TableMetadata $table, array $row): string
protected function generateInsertSql(TableMetadata $table, array $row, ?InsertMode $mode = null): string
{
$sql = sprintf(
'INSERT INTO %s ',
'%s INTO %s ',
$this->getInsertPrefix($mode),
$this->quoteTableName($table->getName()),
);
$columns = array_keys($row);
Expand Down Expand Up @@ -662,6 +665,21 @@ protected function generateInsertSql(TableMetadata $table, array $row): string
}
}

/**
* Get the INSERT prefix based on insert mode and database type.
*
* @param \Migrations\Db\InsertMode|null $mode Insert mode
* @return string
*/
protected function getInsertPrefix(?InsertMode $mode = null): string
{
if ($mode === InsertMode::IGNORE) {
return 'INSERT IGNORE';
}

return 'INSERT';
}

/**
* Quotes a database value.
*
Expand Down Expand Up @@ -709,9 +727,9 @@ protected function quoteString(string $value): string
/**
* @inheritDoc
*/
public function bulkinsert(TableMetadata $table, array $rows): void
public function bulkinsert(TableMetadata $table, array $rows, ?InsertMode $mode = null): void
{
$sql = $this->generateBulkInsertSql($table, $rows);
$sql = $this->generateBulkInsertSql($table, $rows, $mode);

if ($this->isDryRunEnabled()) {
$this->io->out($sql);
Expand Down Expand Up @@ -745,12 +763,14 @@ public function bulkinsert(TableMetadata $table, array $rows): void
*
* @param \Migrations\Db\Table\TableMetadata $table The table to insert into
* @param array $rows The rows to insert
* @param \Migrations\Db\InsertMode|null $mode Insert mode
* @return string
*/
protected function generateBulkInsertSql(TableMetadata $table, array $rows): string
protected function generateBulkInsertSql(TableMetadata $table, array $rows, ?InsertMode $mode = null): string
{
$sql = sprintf(
'INSERT INTO %s ',
'%s INTO %s ',
$this->getInsertPrefix($mode),
$this->quoteTableName($table->getName()),
);
$current = current($rows);
Expand Down
7 changes: 5 additions & 2 deletions src/Db/Adapter/AdapterInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use Cake\Database\Query\SelectQuery;
use Cake\Database\Query\UpdateQuery;
use Cake\Database\Schema\TableSchemaInterface;
use Migrations\Db\InsertMode;
use Migrations\Db\Table\CheckConstraint;
use Migrations\Db\Table\Column;
use Migrations\Db\Table\TableMetadata;
Expand Down Expand Up @@ -313,18 +314,20 @@ public function fetchAll(string $sql): array;
*
* @param \Migrations\Db\Table\TableMetadata $table Table where to insert data
* @param array $row Row
* @param \Migrations\Db\InsertMode|null $mode Insert mode
* @return void
*/
public function insert(TableMetadata $table, array $row): void;
public function insert(TableMetadata $table, array $row, ?InsertMode $mode = null): void;

/**
* Inserts data into a table in a bulk.
*
* @param \Migrations\Db\Table\TableMetadata $table Table where to insert data
* @param array $rows Rows
* @param \Migrations\Db\InsertMode|null $mode Insert mode
* @return void
*/
public function bulkinsert(TableMetadata $table, array $rows): void;
public function bulkinsert(TableMetadata $table, array $rows, ?InsertMode $mode = null): void;

/**
* Quotes a table name for use in a query.
Expand Down
9 changes: 5 additions & 4 deletions src/Db/Adapter/AdapterWrapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use Cake\Database\Query\InsertQuery;
use Cake\Database\Query\SelectQuery;
use Cake\Database\Query\UpdateQuery;
use Migrations\Db\InsertMode;
use Migrations\Db\Table\CheckConstraint;
use Migrations\Db\Table\Column;
use Migrations\Db\Table\TableMetadata;
Expand Down Expand Up @@ -136,17 +137,17 @@ public function query(string $sql, array $params = []): mixed
/**
* @inheritDoc
*/
public function insert(TableMetadata $table, array $row): void
public function insert(TableMetadata $table, array $row, ?InsertMode $mode = null): void
{
$this->getAdapter()->insert($table, $row);
$this->getAdapter()->insert($table, $row, $mode);
}

/**
* @inheritDoc
*/
public function bulkinsert(TableMetadata $table, array $rows): void
public function bulkinsert(TableMetadata $table, array $rows, ?InsertMode $mode = null): void
{
$this->getAdapter()->bulkinsert($table, $rows);
$this->getAdapter()->bulkinsert($table, $rows, $mode);
}

/**
Expand Down
4 changes: 2 additions & 2 deletions src/Db/Adapter/MysqlAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -276,8 +276,8 @@ public function createTable(TableMetadata $table, array $columns = [], array $in
* Apply MySQL specific translations between the values using migrations constants/types
* and the cakephp/database constants. Over time, these can be aligned.
*
* @param array $data The raw column data.
* @return array Modified column data.
* @param array<string, mixed> $data The raw column data.
* @return array<string, mixed> Modified column data.
*/
protected function mapColumnData(array $data): array
{
Expand Down
36 changes: 28 additions & 8 deletions src/Db/Adapter/PostgresAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
use Cake\I18n\DateTime;
use InvalidArgumentException;
use Migrations\Db\AlterInstructions;
use Migrations\Db\InsertMode;
use Migrations\Db\Literal;
use Migrations\Db\Table\CheckConstraint;
use Migrations\Db\Table\Column;
Expand Down Expand Up @@ -205,8 +206,8 @@ public function createTable(TableMetadata $table, array $columns = [], array $in
* Apply postgres specific translations between the values using migrations constants/types
* and the cakephp/database constants. Over time, these can be aligned.
*
* @param array $data The raw column data.
* @return array Modified column data.
* @param array<string, mixed> $data The raw column data.
* @return array<string, mixed> Modified column data.
*/
protected function mapColumnData(array $data): array
{
Expand Down Expand Up @@ -1152,7 +1153,7 @@ public function setSearchPath(): void
/**
* @inheritDoc
*/
public function insert(TableMetadata $table, array $row): void
public function insert(TableMetadata $table, array $row, ?InsertMode $mode = null): void
{
$sql = sprintf(
'INSERT INTO %s ',
Expand All @@ -1172,8 +1173,10 @@ public function insert(TableMetadata $table, array $row): void
$override = self::OVERRIDE_SYSTEM_VALUE . ' ';
}

$conflictClause = $this->getConflictClause($mode);

if ($this->isDryRunEnabled()) {
$sql .= ' ' . $override . 'VALUES (' . implode(', ', array_map($this->quoteValue(...), $row)) . ');';
$sql .= ' ' . $override . 'VALUES (' . implode(', ', array_map($this->quoteValue(...), $row)) . ')' . $conflictClause . ';';
$this->io->out($sql);
} else {
$values = [];
Expand All @@ -1188,15 +1191,15 @@ public function insert(TableMetadata $table, array $row): void
$vals[] = $value;
}
}
$sql .= ' ' . $override . 'VALUES (' . implode(',', $values) . ')';
$sql .= ' ' . $override . 'VALUES (' . implode(',', $values) . ')' . $conflictClause;
$this->getConnection()->execute($sql, $vals);
}
}

/**
* @inheritDoc
*/
public function bulkinsert(TableMetadata $table, array $rows): void
public function bulkinsert(TableMetadata $table, array $rows, ?InsertMode $mode = null): void
{
$sql = sprintf(
'INSERT INTO %s ',
Expand All @@ -1213,11 +1216,13 @@ public function bulkinsert(TableMetadata $table, array $rows): void

$sql .= '(' . implode(', ', array_map($this->quoteColumnName(...), $keys)) . ') ' . $override . 'VALUES ';

$conflictClause = $this->getConflictClause($mode);

if ($this->isDryRunEnabled()) {
$values = array_map(function ($row) {
return '(' . implode(', ', array_map($this->quoteValue(...), $row)) . ')';
}, $rows);
$sql .= implode(', ', $values) . ';';
$sql .= implode(', ', $values) . $conflictClause . ';';
$this->io->out($sql);
} else {
$vals = [];
Expand Down Expand Up @@ -1245,11 +1250,26 @@ public function bulkinsert(TableMetadata $table, array $rows): void
$query = '(' . implode(', ', $values) . ')';
$queries[] = $query;
}
$sql .= implode(',', $queries);
$sql .= implode(',', $queries) . $conflictClause;
$this->getConnection()->execute($sql, $vals);
}
}

/**
* Get the ON CONFLICT clause based on insert mode.
*
* @param \Migrations\Db\InsertMode|null $mode Insert mode
* @return string
*/
protected function getConflictClause(?InsertMode $mode = null): string
{
if ($mode === InsertMode::IGNORE) {
return ' ON CONFLICT DO NOTHING';
}

return '';
}

/**
* Get the adapter type name
*
Expand Down
13 changes: 13 additions & 0 deletions src/Db/Adapter/SqliteAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
use InvalidArgumentException;
use Migrations\Db\AlterInstructions;
use Migrations\Db\Expression;
use Migrations\Db\InsertMode;
use Migrations\Db\Literal;
use Migrations\Db\Table\CheckConstraint;
use Migrations\Db\Table\Column;
Expand Down Expand Up @@ -1686,4 +1687,16 @@ protected function getForeignKeySqlDefinition(ForeignKey $foreignKey): string

return $def;
}

/**
* @inheritDoc
*/
protected function getInsertPrefix(?InsertMode $mode = null): string
{
if ($mode === InsertMode::IGNORE) {
return 'INSERT OR IGNORE';
}

return 'INSERT';
}
}
21 changes: 17 additions & 4 deletions src/Db/Adapter/SqlserverAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
use Cake\I18n\DateTime;
use InvalidArgumentException;
use Migrations\Db\AlterInstructions;
use Migrations\Db\InsertMode;
use Migrations\Db\Literal;
use Migrations\Db\Table\CheckConstraint;
use Migrations\Db\Table\Column;
Expand Down Expand Up @@ -999,9 +1000,9 @@ public function migrated(MigrationInterface $migration, string $direction, strin
/**
* @inheritDoc
*/
public function insert(TableMetadata $table, array $row): void
public function insert(TableMetadata $table, array $row, ?InsertMode $mode = null): void
{
$sql = $this->generateInsertSql($table, $row);
$sql = $this->generateInsertSql($table, $row, $mode);

$sql = $this->updateSQLForIdentityInsert($table->getName(), $sql);

Expand All @@ -1025,9 +1026,9 @@ public function insert(TableMetadata $table, array $row): void
/**
* @inheritDoc
*/
public function bulkinsert(TableMetadata $table, array $rows): void
public function bulkinsert(TableMetadata $table, array $rows, ?InsertMode $mode = null): void
{
$sql = $this->generateBulkInsertSql($table, $rows);
$sql = $this->generateBulkInsertSql($table, $rows, $mode);

$sql = $this->updateSQLForIdentityInsert($table->getName(), $sql);

Expand Down Expand Up @@ -1105,4 +1106,16 @@ protected function getDropCheckConstraintInstructions(string $tableName, string
{
throw new BadMethodCallException('Check constraints are not yet implemented for SQL Server adapter');
}

/**
* @inheritDoc
*/
protected function getInsertPrefix(?InsertMode $mode = null): string
{
if ($mode === InsertMode::IGNORE) {
throw new BadMethodCallException('INSERT IGNORE is not supported for SQL Server');
}

return parent::getInsertPrefix($mode);
}
}
9 changes: 5 additions & 4 deletions src/Db/Adapter/TimedOutputAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

use BadMethodCallException;
use Cake\Console\ConsoleIo;
use Migrations\Db\InsertMode;
use Migrations\Db\Table\Column;
use Migrations\Db\Table\ForeignKey;
use Migrations\Db\Table\Index;
Expand Down Expand Up @@ -83,22 +84,22 @@ function ($value) {
/**
* @inheritDoc
*/
public function insert(TableMetadata $table, array $row): void
public function insert(TableMetadata $table, array $row, ?InsertMode $mode = null): void
{
$end = $this->startCommandTimer();
$this->writeCommand('insert', [$table->getName()]);
parent::insert($table, $row);
parent::insert($table, $row, $mode);
$end();
}

/**
* @inheritDoc
*/
public function bulkinsert(TableMetadata $table, array $rows): void
public function bulkinsert(TableMetadata $table, array $rows, ?InsertMode $mode = null): void
{
$end = $this->startCommandTimer();
$this->writeCommand('bulkinsert', [$table->getName()]);
parent::bulkinsert($table, $rows);
parent::bulkinsert($table, $rows, $mode);
$end();
}

Expand Down
Loading
Loading