See Release Notes
Long Term Support Release
Differences Between: [Versions 310 and 401] [Versions 311 and 401] [Versions 39 and 401] [Versions 400 and 401]
1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 2 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 /** 18 * sqlsrv specific recordset. 19 * 20 * @package core_dml 21 * @copyright 2009 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com} 22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v2 or later 23 */ 24 25 defined('MOODLE_INTERNAL') || die(); 26 27 require_once (__DIR__.'/moodle_recordset.php'); 28 29 class sqlsrv_native_moodle_recordset extends moodle_recordset { 30 31 protected $rsrc; 32 protected $current; 33 34 /** @var array recordset buffer */ 35 protected $buffer = null; 36 37 /** @var sqlsrv_native_moodle_database */ 38 protected $db; 39 40 public function __construct($rsrc, sqlsrv_native_moodle_database $db) { 41 $this->rsrc = $rsrc; 42 $this->current = $this->fetch_next(); 43 $this->db = $db; 44 } 45 46 /** 47 * Inform existing open recordsets that transaction 48 * is starting, this works around MARS problem described 49 * in MDL-37734. 50 */ 51 public function transaction_starts() { 52 if ($this->buffer !== null) { 53 $this->unregister(); 54 return; 55 } 56 if (!$this->rsrc) { 57 $this->unregister(); 58 return; 59 } 60 // This might eat memory pretty quickly... 61 raise_memory_limit('2G'); 62 $this->buffer = array(); 63 64 while($next = $this->fetch_next()) { 65 $this->buffer[] = $next; 66 } 67 } 68 69 /** 70 * Unregister recordset from the global list of open recordsets. 71 */ 72 private function unregister() { 73 if ($this->db) { 74 $this->db->recordset_closed($this); 75 $this->db = null; 76 } 77 } 78 79 public function __destruct() { 80 $this->close(); 81 } 82 83 private function fetch_next() { 84 if (!$this->rsrc) { 85 return false; 86 } 87 if (!$row = sqlsrv_fetch_array($this->rsrc, SQLSRV_FETCH_ASSOC)) { 88 sqlsrv_free_stmt($this->rsrc); 89 $this->rsrc = null; 90 $this->unregister(); 91 return false; 92 } 93 94 unset($row['sqlsrvrownumber']); 95 $row = array_change_key_case($row, CASE_LOWER); 96 // Moodle expects everything from DB as strings. 97 foreach ($row as $k=>$v) { 98 if (is_null($v)) { 99 continue; 100 } 101 if (!is_string($v)) { 102 $row[$k] = (string)$v; 103 } 104 } 105 return $row; 106 } 107 108 public function current(): stdClass { 109 return (object)$this->current; 110 } 111 112 #[\ReturnTypeWillChange] 113 public function key() { 114 // return first column value as key 115 if (!$this->current) { 116 return false; 117 } 118 $key = reset($this->current); 119 return $key; 120 } 121 122 public function next(): void { 123 if ($this->buffer === null) { 124 $this->current = $this->fetch_next(); 125 } else { 126 $this->current = array_shift($this->buffer); 127 } 128 } 129 130 public function valid(): bool { 131 return !empty($this->current); 132 } 133 134 public function close() { 135 if ($this->rsrc) { 136 sqlsrv_free_stmt($this->rsrc); 137 $this->rsrc = null; 138 } 139 $this->current = null; 140 $this->buffer = null; 141 $this->unregister(); 142 } 143 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body