3 namespace Wikimedia\Rdbms
;
7 class MysqliResultWrapper
extends ResultWrapper
{
8 /** @var DatabaseMySQL */
11 /** @var mysqli_result|null */
16 * @param DatabaseMySQL $db
17 * @param mysqli_result $result
19 public function __construct( DatabaseMySQL
$db, mysqli_result
$result ) {
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(
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 ) {
55 protected function doFetchRow() {
56 $array = $this->result
->fetch_array();
57 $this->checkFetchError();
58 if ( $array === null ) {
64 protected function doSeek( $pos ) {
65 $this->result
->data_seek( $pos );
68 protected function doFree() {
72 protected function doGetFieldNames() {
74 foreach ( $this->result
->fetch_fields() as $fieldInfo ) {
75 $names[] = $fieldInfo->name
;
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 );