diff options
Diffstat (limited to 'www/wiki/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php')
-rw-r--r-- | www/wiki/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/www/wiki/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php b/www/wiki/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php new file mode 100644 index 00000000..ba79be14 --- /dev/null +++ b/www/wiki/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php @@ -0,0 +1,76 @@ +<?php + +namespace Wikimedia\Rdbms; + +use stdClass; + +class MssqlResultWrapper extends ResultWrapper { + /** @var int|null */ + private $seekTo = null; + + /** + * @return stdClass|bool + */ + public function fetchObject() { + $res = $this->result; + + if ( $this->seekTo !== null ) { + $result = sqlsrv_fetch_object( $res, stdClass::class, [], + SQLSRV_SCROLL_ABSOLUTE, $this->seekTo ); + $this->seekTo = null; + } else { + $result = sqlsrv_fetch_object( $res ); + } + + // Return boolean false when there are no more rows instead of null + if ( $result === null ) { + return false; + } + + return $result; + } + + /** + * @return array|bool + */ + public function fetchRow() { + $res = $this->result; + + if ( $this->seekTo !== null ) { + $result = sqlsrv_fetch_array( $res, SQLSRV_FETCH_BOTH, + SQLSRV_SCROLL_ABSOLUTE, $this->seekTo ); + $this->seekTo = null; + } else { + $result = sqlsrv_fetch_array( $res ); + } + + // Return boolean false when there are no more rows instead of null + if ( $result === null ) { + return false; + } + + return $result; + } + + /** + * @param int $row + * @return bool + */ + public function seek( $row ) { + $res = $this->result; + + // check bounds + $numRows = $this->db->numRows( $res ); + $row = intval( $row ); + + if ( $numRows === 0 ) { + return false; + } elseif ( $row < 0 || $row > $numRows - 1 ) { + return false; + } + + // Unlike MySQL, the seek actually happens on the next access + $this->seekTo = $row; + return true; + } +} |