Merge "Use gendered pronouns in emailuserfooter"
[mediawiki.git] / includes / libs / rdbms / database / resultwrapper / MysqliResultWrapper.php
blob7924e5a7a51d0ff75d7cc2b3126b3c68824a2236
1 <?php
3 namespace Wikimedia\Rdbms;
5 use mysqli_result;
7 class MysqliResultWrapper extends ResultWrapper {
8 /** @var DatabaseMySQL */
9 private $db;
11 /** @var mysqli_result|null */
12 private $result;
14 /**
15 * @internal
16 * @param DatabaseMySQL $db
17 * @param mysqli_result $result
19 public function __construct( DatabaseMySQL $db, mysqli_result $result ) {
20 $this->db = $db;
21 $this->result = $result;
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;
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() )
46 protected function doFetchObject() {
47 $object = $this->result->fetch_object();
48 $this->checkFetchError();
49 if ( $object === null ) {
50 return false;
52 return $object;
55 protected function doFetchRow() {
56 $array = $this->result->fetch_array();
57 $this->checkFetchError();
58 if ( $array === null ) {
59 return false;
61 return $array;
64 protected function doSeek( $pos ) {
65 $this->result->data_seek( $pos );
68 protected function doFree() {
69 $this->result = null;
72 protected function doGetFieldNames() {
73 $names = [];
74 foreach ( $this->result->fetch_fields() as $fieldInfo ) {
75 $names[] = $fieldInfo->name;
77 return $names;
80 /**
81 * Get information about a field in the result set
83 * @param string $fieldName
84 * @return bool|MySQLField
85 * @internal For DatabaseMySQL::fieldInfo() only
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 );
106 return false;