summaryrefslogtreecommitdiff
path: root/www/wiki/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php')
-rw-r--r--www/wiki/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php76
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;
+ }
+}