Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 39
0.00% covered (danger)
0.00%
0 / 9
CRAP
0.00% covered (danger)
0.00%
0 / 1
MysqliResultWrapper
0.00% covered (danger)
0.00%
0 / 39
0.00% covered (danger)
0.00%
0 / 9
272
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 2
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
 checkFetchError
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
12
 doFetchObject
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
 doFetchRow
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
 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 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 getInternalFieldInfo
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3namespace Wikimedia\Rdbms;
4
5use mysqli_result;
6
7class MysqliResultWrapper extends ResultWrapper {
8    /** @var DatabaseMySQL */
9    private $db;
10
11    /** @var mysqli_result|null */
12    private $result;
13
14    /**
15     * @internal
16     * @param DatabaseMySQL $db
17     * @param mysqli_result $result
18     */
19    public function __construct( DatabaseMySQL $db, mysqli_result $result ) {
20        $this->db = $db;
21        $this->result = $result;
22    }
23
24    protected function doNumRows() {
25        // We are not checking for any errors here, since
26        // there are no errors mysql_num_rows can cause.
27        // See https://dev.mysql.com/doc/refman/5.7/en/mysql-fetch-row.html.
28        // See https://phabricator.wikimedia.org/T44430
29        return $this->result->num_rows;
30    }
31
32    private function checkFetchError() {
33        $errno = $this->db->lastErrno();
34        // Unfortunately, mysql_fetch_array does not reset the last errno.
35        // Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
36        // these are the only errors mysql_fetch_array can cause.
37        // See https://dev.mysql.com/doc/refman/5.7/en/mysql-fetch-row.html.
38        if ( $errno == 2000 || $errno == 2013 ) {
39            throw new DBUnexpectedError(
40                $this->db,
41                'Error in fetchRow(): ' . htmlspecialchars( $this->db->lastError() )
42            );
43        }
44    }
45
46    protected function doFetchObject() {
47        $object = $this->result->fetch_object();
48        $this->checkFetchError();
49        if ( $object === null ) {
50            return false;
51        }
52        return $object;
53    }
54
55    protected function doFetchRow() {
56        $array = $this->result->fetch_array();
57        $this->checkFetchError();
58        if ( $array === null ) {
59            return false;
60        }
61        return $array;
62    }
63
64    protected function doSeek( $pos ) {
65        $this->result->data_seek( $pos );
66    }
67
68    protected function doFree() {
69        $this->result = null;
70    }
71
72    protected function doGetFieldNames() {
73        $names = [];
74        foreach ( $this->result->fetch_fields() as $fieldInfo ) {
75            $names[] = $fieldInfo->name;
76        }
77        return $names;
78    }
79
80    /**
81     * Get information about a field in the result set
82     *
83     * @param string $fieldName
84     * @return bool|MySQLField
85     * @internal For DatabaseMySQL::fieldInfo() only
86     *
87     */
88    public function getInternalFieldInfo( $fieldName ) {
89        for ( $i = 0; $i < $this->result->field_count; $i++ ) {
90            $meta = $this->result->fetch_field_direct( $i );
91            if ( $fieldName == $meta->name ) {
92                // Add missing properties to result (using flags property)
93                // which will be part of function mysql-fetch-field for backward compatibility
94                $meta->not_null = $meta->flags & MYSQLI_NOT_NULL_FLAG;
95                $meta->primary_key = $meta->flags & MYSQLI_PRI_KEY_FLAG;
96                $meta->unique_key = $meta->flags & MYSQLI_UNIQUE_KEY_FLAG;
97                $meta->multiple_key = $meta->flags & MYSQLI_MULTIPLE_KEY_FLAG;
98                $meta->binary = $meta->flags & MYSQLI_BINARY_FLAG;
99                $meta->numeric = $meta->flags & MYSQLI_NUM_FLAG;
100                $meta->blob = $meta->flags & MYSQLI_BLOB_FLAG;
101                $meta->unsigned = $meta->flags & MYSQLI_UNSIGNED_FLAG;
102                $meta->zerofill = $meta->flags & MYSQLI_ZEROFILL_FLAG;
103                return new MySQLField( $meta );
104            }
105        }
106        return false;
107    }
108}