• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

brick / geo / 14062713921

25 Mar 2025 02:49PM UTC coverage: 62.13% (+0.2%) from 61.936%
14062713921

push

github

BenMorel
Implement PgsqlDriver (pgsql extension)

0 of 52 new or added lines in 1 file covered. (0.0%)

59 existing lines in 8 files now uncovered.

1890 of 3042 relevant lines covered (62.13%)

1687.76 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

91.3
/src/Engine/Database/Driver/PdoMysqlDriver.php
1
<?php
2

3
declare(strict_types=1);
4

5
namespace Brick\Geo\Engine\Database\Driver;
6

7
use Brick\Geo\Engine\Database\Query\BinaryValue;
8
use Brick\Geo\Engine\Database\Query\ScalarValue;
9
use Brick\Geo\Engine\Database\Result\Row;
10
use Brick\Geo\Exception\GeometryEngineException;
11
use Override;
12
use PDO;
13
use PDOException;
14

15
/**
16
 * Database driver using a pdo_mysql connection.
17
 */
18
final class PdoMysqlDriver implements DatabaseDriver
19
{
20
    public function __construct(
21
        private readonly PDO $pdo,
22
    ) {
23
    }
×
24

25
    #[Override]
26
    public function executeQuery(string|BinaryValue|ScalarValue ...$query) : Row
27
    {
28
        $queryString = '';
1,184✔
29
        $queryParams = [];
1,184✔
30

31
        foreach ($query as $queryPart) {
1,184✔
32
            if ($queryPart instanceof BinaryValue) {
1,184✔
33
                $queryString .= 'BINARY ?';
1,184✔
34
                $queryParams[] = [$queryPart->value, PDO::PARAM_LOB];
1,184✔
35
            } elseif ($queryPart instanceof ScalarValue) {
1,184✔
36
                $queryString .= '?';
1,184✔
37

38
                if (is_int($queryPart->value)) {
1,184✔
39
                    $queryParams[] = [$queryPart->value, PDO::PARAM_INT];
1,184✔
40
                } elseif (is_bool($queryPart->value)) {
292✔
41
                    $queryParams[] = [$queryPart->value, PDO::PARAM_BOOL];
20✔
42
                } else {
43
                    $queryParams[] = [$queryPart->value, PDO::PARAM_STR];
292✔
44
                }
45
            } else {
46
                $queryString .= $queryPart;
1,184✔
47
            }
48
        }
49

50
        /** @var int $errMode */
51
        $errMode = $this->pdo->getAttribute(PDO::ATTR_ERRMODE);
1,184✔
52
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
1,184✔
53

54
        try {
55
            $statement = $this->pdo->prepare($queryString);
1,184✔
56

57
            $position = 1;
1,045✔
58

59
            foreach ($queryParams as [$value, $type]) {
1,045✔
60
                $statement->bindValue($position++, $value, $type);
1,037✔
61
            }
62

63
            $statement->execute();
1,045✔
64

65
            /** @var list<list<mixed>> $result */
66
            $result = $statement->fetchAll(PDO::FETCH_NUM);
794✔
67
        } catch (PDOException $e) {
410✔
68
            throw GeometryEngineException::wrap($e);
410✔
69
        } finally {
70
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, $errMode);
1,184✔
71
        }
72

73
        if (count($result) !== 1) {
794✔
74
            throw new GeometryEngineException(sprintf('Expected exactly one row, got %d.', count($result)));
×
75
        }
76

77
        return new Row($this, $result[0]);
794✔
78
    }
79

80
    #[Override]
81
    public function convertBinaryResult(mixed $value) : string
82
    {
83
        if (is_string($value)) {
236✔
84
            return $value;
230✔
85
        }
86

87
        throw GeometryEngineException::unexpectedDatabaseReturnType('string', $value);
6✔
88
    }
89

90
    #[Override]
91
    public function convertStringResult(mixed $value) : string
92
    {
93
        if (is_string($value)) {
148✔
94
            return $value;
148✔
95
        }
96

UNCOV
97
        throw GeometryEngineException::unexpectedDatabaseReturnType('string', $value);
×
98
    }
99

100
    #[Override]
101
    public function convertIntResult(mixed $value) : int
102
    {
103
        // TODO check that actually returned as int;
104
        //      maybe checks for all types sent & received for each driver?
105

106
        if (is_int($value)) {
230✔
107
            return $value;
230✔
108
        }
109

UNCOV
110
        throw GeometryEngineException::unexpectedDatabaseReturnType('int', $value);
×
111
    }
112

113
    #[Override]
114
    public function convertFloatResult(mixed $value) : float
115
    {
116
        if (is_numeric($value)) {
110✔
117
            return (float) $value;
92✔
118
        }
119

120
        throw GeometryEngineException::unexpectedDatabaseReturnType('number or numeric string', $value);
18✔
121
    }
122

123
    #[Override]
124
    public function convertBoolResult(mixed $value) : bool
125
    {
126
        return match ($value) {
498✔
127
            0 => false,
174✔
128
            1 => true,
236✔
129
            default => throw GeometryEngineException::unexpectedDatabaseReturnType('0 or 1', $value),
498✔
130
        };
498✔
131
    }
132
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc