Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 33
0.00% covered (danger)
0.00%
0 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
PostgresResultWrapper
0.00% covered (danger)
0.00%
0 / 33
0.00% covered (danger)
0.00%
0 / 8
306
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 doNumRows
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 doFetchObject
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
20
 doFetchRow
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
20
 convertBoolean
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
12
 doSeek
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 doFree
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 doGetFieldNames
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace Wikimedia\Rdbms;
4
5// Phan insists these are resources until we drop PHP 7.4
6/* @phan-file-suppress PhanTypeMismatchArgumentInternal */
7
8class PostgresResultWrapper extends ResultWrapper {
9    /** @var DatabasePostgres */
10    private $db;
11    /** @var resource */
12    private $handle;
13    /** @var resource */
14    private $result;
15
16    /**
17     * @internal
18     * @param DatabasePostgres $db
19     * @param resource $handle
20     * @param resource $result
21     */
22    public function __construct( DatabasePostgres $db, $handle, $result ) {
23        $this->db = $db;
24        $this->handle = $handle;
25        $this->result = $result;
26    }
27
28    protected function doNumRows() {
29        return pg_num_rows( $this->result );
30    }
31
32    protected function doFetchObject() {
33        // pg_fetch_object may raise a warning after a seek to an invalid offset
34        // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged
35        $row = @pg_fetch_object( $this->result );
36        // Map boolean values (T352229)
37        if ( is_object( $row ) ) {
38            $numFields = pg_num_fields( $this->result );
39            for ( $i = 0; $i < $numFields; $i++ ) {
40                if ( pg_field_type( $this->result, $i ) === 'bool' ) {
41                    $name = pg_field_name( $this->result, $i );
42                    $row->$name = $this->convertBoolean( $row->$name );
43                }
44            }
45        }
46        return $row;
47    }
48
49    protected function doFetchRow() {
50        // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged
51        $row = @pg_fetch_array( $this->result );
52        // Map boolean values (T352229)
53        if ( is_array( $row ) ) {
54            $numFields = pg_num_fields( $this->result );
55            for ( $i = 0; $i < $numFields; $i++ ) {
56                if ( pg_field_type( $this->result, $i ) === 'bool' ) {
57                    $name = pg_field_name( $this->result, $i );
58                    $row[$i] = $this->convertBoolean( $row[$i] );
59                    $row[$name] = $this->convertBoolean( $row[$name] );
60                }
61            }
62        }
63        return $row;
64    }
65
66    /**
67     * Convert a boolean value from the database to the string '0' or '1' for
68     * compatibility with MySQL.
69     *
70     * @param mixed $value
71     * @return mixed
72     */
73    private function convertBoolean( $value ) {
74        if ( $value === 't' ) {
75            return '1';
76        } elseif ( $value === 'f' ) {
77            return '0';
78        } else {
79            // Just pass through values that are not 't' or 'f'
80            return $value;
81        }
82    }
83
84    protected function doSeek( $pos ) {
85        pg_result_seek( $this->result, $pos );
86    }
87
88    protected function doFree() {
89        return pg_free_result( $this->result );
90    }
91
92    protected function doGetFieldNames() {
93        $names = [];
94        $n = pg_num_fields( $this->result );
95        for ( $i = 0; $i < $n; $i++ ) {
96            $names[] = pg_field_name( $this->result, $i );
97        }
98        return $names;
99    }
100}