Skip to content

Commit 0591ba2

Browse files
committed
Add OCI8 _deleteBatch()
1 parent 03fb06c commit 0591ba2

File tree

2 files changed

+78
-1
lines changed

2 files changed

+78
-1
lines changed

system/Database/OCI8/Builder.php

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,4 +434,81 @@ protected function _upsertBatch(string $table, array $keys, array $values): stri
434434

435435
return str_replace('{:_table_:}', $data, $sql);
436436
}
437+
438+
/**
439+
* Generates a platform-specific batch update string from the supplied data
440+
*/
441+
protected function _deleteBatch(string $table, array $keys, array $values): string
442+
{
443+
$sql = $this->QBOptions['sql'] ?? '';
444+
445+
// if this is the first iteration of batch then we need to build skeleton sql
446+
if ($sql === '') {
447+
$constraints = $this->QBOptions['constraints'] ?? [];
448+
449+
if ($constraints === []) {
450+
if ($this->db->DBDebug) {
451+
throw new DatabaseException('You must specify a constraint to match on for batch deletes.'); // @codeCoverageIgnore
452+
}
453+
454+
return ''; // @codeCoverageIgnore
455+
}
456+
457+
$alias = $this->QBOptions['alias'] ?? '_u';
458+
459+
$sql = 'DELETE ' . $table . "\n";
460+
461+
$sql .= "WHERE EXISTS (SELECT * FROM (\n{:_table_:}";
462+
463+
$sql .= ') ' . $alias . "\n";
464+
465+
$sql .= 'WHERE ' . implode(
466+
' AND ',
467+
array_map(
468+
static fn ($key) => ($key instanceof RawSql ?
469+
$key :
470+
$table . '.' . $key . ' = ' . $alias . '.' . $key),
471+
$constraints
472+
)
473+
);
474+
475+
// convert binds in where
476+
foreach ($this->QBWhere as $key => $where) {
477+
foreach ($this->binds as $field => $bind) {
478+
$this->QBWhere[$key]['condition'] = str_replace(':' . $field . ':', $bind[0], $where['condition']);
479+
}
480+
}
481+
482+
// remove database prefix from alias in where
483+
$sql .= ' ' . str_replace(
484+
'WHERE ',
485+
'AND ',
486+
str_replace(
487+
$this->db->DBPrefix . trim($alias, $this->db->escapeChar),
488+
trim($alias, $this->db->escapeChar),
489+
$this->compileWhereHaving('QBWhere')
490+
)
491+
) . ')';
492+
493+
$this->QBOptions['sql'] = $sql;
494+
}
495+
496+
if (isset($this->QBOptions['fromQuery'])) {
497+
$data = $this->QBOptions['fromQuery'];
498+
} else {
499+
$data = implode(
500+
" FROM DUAL UNION ALL\n",
501+
array_map(
502+
static fn ($value) => 'SELECT ' . implode(', ', array_map(
503+
static fn ($key, $index) => $index . ' ' . $key,
504+
$keys,
505+
$value
506+
)),
507+
$values
508+
)
509+
) . " FROM DUAL\n";
510+
}
511+
512+
return str_replace('{:_table_:}', $data, $sql);
513+
}
437514
}

system/Database/Postgre/Builder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ protected function _deleteBatch(string $table, array $keys, array $values): stri
456456
// remove database prefix from alias in where
457457
$sql .= ' ' . str_replace(
458458
'WHERE ',
459-
' AND ',
459+
'AND ',
460460
str_replace(
461461
$this->db->DBPrefix . trim($alias, $this->db->escapeChar),
462462
trim($alias, $this->db->escapeChar),

0 commit comments

Comments
 (0)