MediaWiki master
PostgresResultWrapper.php
Go to the documentation of this file.
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
10 private $db;
12 private $handle;
14 private $result;
15
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
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}
Postgres database abstraction layer.
__construct(DatabasePostgres $db, $handle, $result)
doFetchObject()
Get the next row as a stdClass object, or false if iteration has proceeded past the end.
doGetFieldNames()
Get the field names in the result set.
doFetchRow()
Get the next row as an array containing the data duplicated, once with string keys and once with nume...
doNumRows()
Get the number of rows in the result set.
doSeek( $pos)
Modify the current cursor position to the row with the specified offset.
Result wrapper for grabbing data queried from an IDatabase object.