Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
PostgresqlDriver
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
2 / 2
2
100.00% covered (success)
100.00%
1 / 1
 save
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
1 / 1
1
 quoteTableName
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3// ╔════════════════════════════════════════════════════════════╗
4// ║ MIT Licence (#Expat) - https://opensource.org/licenses/MIT ║
5// ║ Copyright 2026 Frederic Poeydomenge <dyno@phexium.com>     ║
6// ╚════════════════════════════════════════════════════════════╝
7
8declare(strict_types=1);
9
10namespace Phexium\Plugin\SqlDriver\Adapter;
11
12use Override;
13use Phexium\Plugin\SqlDriver\Internal\AbstractSqlDriver;
14use Phexium\Plugin\SqlDriver\Port\SqlDriverInterface;
15
16final class PostgresqlDriver extends AbstractSqlDriver implements SqlDriverInterface
17{
18    #[Override]
19    public function save(string $table, array $row): void
20    {
21        $columns = array_keys($row);
22        $placeholders = array_map(fn (int|string $col): string => sprintf(':%s', $col), $columns);
23        $updateSet = array_map(fn (string $col): string => sprintf('%s = EXCLUDED.%s', $col, $col), $columns);
24
25        $sql = sprintf(
26            'INSERT INTO %s (%s) VALUES (%s) ON CONFLICT (id) DO UPDATE SET %s',
27            $this->quoteTableName($table),
28            implode(', ', $columns),
29            implode(', ', $placeholders),
30            implode(', ', $updateSet)
31        );
32
33        $stmt = $this->pdo->prepare($sql);
34        $stmt->execute($row);
35    }
36
37    #[Override]
38    protected function quoteTableName(string $tableName): string
39    {
40        return sprintf('"%s"', $tableName);
41    }
42}