]> git.mjollnir.org Git - moodle.git/commitdiff
dmllib/pdo MDL-19641 - Fixup PDO (SQLlite) support
authorpoltawski <poltawski>
Sat, 27 Jun 2009 14:46:44 +0000 (14:46 +0000)
committerpoltawski <poltawski>
Sat, 27 Jun 2009 14:46:44 +0000 (14:46 +0000)
By changing the behaviour of the recordset to match
the native recordset we fix the major compatbility problems

Before: Can't get a working install to run tests
After: 353 passes, 10 fails and 0 exceptions.
(and moodle can install on my iphone)

lib/dml/pdo_moodle_recordset.php

index 7ae8650410bbbf20943cff8a794308fe1d8da083..c109821265f0158ac4e2b4e6fcfeff1c1db35feb 100644 (file)
@@ -21,7 +21,7 @@
  *
  * @package    moodlecore
  * @subpackage DML
- * @copyright  2008 Andrei Bautu
+ * @copyright  2008 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
@@ -33,40 +33,51 @@ require_once($CFG->libdir.'/dml/moodle_recordset.php');
 class pdo_moodle_recordset extends moodle_recordset {
 
     private $sth;
-    protected $fields;
-    protected $rowCount = -1;
+    protected $current;
 
     public function __construct($sth) {
         $this->sth = $sth;
         $this->sth->setFetchMode(PDO::FETCH_ASSOC);
+        $this->current = $this->fetch_next();
+    }
+
+    public function __destruct() {
+        $this->close();
+    }
+
+    private function fetch_next() {
+        if ($row = $this->sth->fetch()) {
+            $row = array_change_key_case($row, CASE_LOWER);
+        }
+        return $row;
     }
 
     public function current() {
-        return (object)$this->fields;
+        return (object)$this->current;
     }
 
     public function key() {
     /// return first column value as key
-        return reset($this->fields);
+        if (!$this->current) {
+            return false;
+        }
+        $key = reset($this->current);
+        return $key;
     }
 
     public function next() {
-        $this->fields = $this->sth->fetch();
-        if ($this->fields) {
-            ++$this->rowCount;
-        }
-        return $this->fields !== false;
+        $this->current = $this->fetch_next();
     }
 
     public function valid() {
-        if($this->rowCount < 0) {
-            $this->rewind();
-        }
-        return $this->fields !== FALSE;
+        return !empty($this->current);
     }
 
     public function close() {
-        $this->sth->closeCursor();
-        $this->sth = null;
+        if ($this->sth) {
+            $this->sth->closeCursor();
+            $this->sth = null;
+        }
+        $this->current = null;
     }
 }