]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-17020 dml: native pgsql driver - support for bytea updating
authorskodak <skodak>
Mon, 27 Oct 2008 15:42:52 +0000 (15:42 +0000)
committerskodak <skodak>
Mon, 27 Oct 2008 15:42:52 +0000 (15:42 +0000)
lib/dml/pgsql_native_moodle_database.php
lib/dml/simpletest/testdml.php

index 130231b2092a5ca17bc3ab9cb5088c640920898a..c76e17ce4874df0b4929efbd489f3274c52fdd94 100644 (file)
@@ -861,20 +861,58 @@ class pgsql_native_moodle_database extends moodle_database {
             return false;
         }
 
+        $id = (int)$dataobject->id;
+
         $columns = $this->get_columns($table);
         $cleaned = array();
+        $blobs   = array();
 
         foreach ($dataobject as $field=>$value) {
             if (!isset($columns[$field])) {
                 continue;
             }
-            if (is_bool($value)) {
-                $value = (int)$value; // prevent "false" problems
+            $column = $columns[$field];
+            if ($column->meta_type == 'B') {
+                if (is_null($value)) {
+                    $cleaned[$field] = null;
+                } else {
+                    $blobs[$field] = $value;
+                    $cleaned[$field] = '@#BLOB#@';
+                }
+                continue;
+
+            } else if (is_bool($value)) {
+                $value = (int)$value; // prevent false '' problems
+
+            } else if ($value === '') {
+                if ($column->meta_type == 'I' or $column->meta_type == 'F' or $column->meta_type == 'N') {
+                    $value = 0; // prevent '' problems in numeric fields
+                }
             }
+
             $cleaned[$field] = $value;
         }
 
-        return $this->update_record_raw($table, $cleaned, $bulk);
+        if (!$this->update_record_raw($table, $cleaned, $bulk)) {
+            return false;
+        }
+
+        if (empty($blobs)) {
+            return true;
+        }
+
+        foreach ($blobs as $key=>$value) {
+            $this->writes++;
+            $value = pg_escape_bytea($this->pgsql, $value);
+            $sql = "UPDATE {$this->prefix}$table SET $key = '$value'::bytea WHERE id = $id";
+            $result = pg_query($this->pgsql, $sql);
+            if ($result === false) {
+                return false;
+            }
+            pg_free_result($result);
+        }
+
+        return true;
     }
 
     /**
index f2034e483b7d0a1b3125f9f5260bcd55d1976e5d..01a19420bdaed87ceaf061ca497b3015609846a0 100755 (executable)
@@ -1168,17 +1168,20 @@ class dml_test extends UnitTestCase {
         $clob = file_get_contents($CFG->libdir.'/dml/simpletest/clob.txt');
         $blob = file_get_contents($CFG->libdir.'/dml/simpletest/randombinary');
 
+        $newclob = substr($clob, 0, 500);
+        $newblob = substr($blob, 0, 250);
+
         $id = $DB->insert_record('testtable', array('description' => $clob, 'image' => $blob));
         $record = $DB->get_record('testtable', array('id' => $id));
-        $record->description = substr($clob, 0, 500);
-        $record->image = substr($blob, 0, 250);
+        $record->description = $newclob;
+        $record->image = $newblob;
         $this->assertTrue($DB->update_record('testtable', $record));
 
         $record = $DB->get_record('testtable', array('id' => $id));
-        $this->assertEqual(substr($clob, 0, 500), $record->description);
-        $this->assertEqual(substr($blob, 0, 250), $record->image);
-        $this->assertEqual(substr($clob, 0, 500), $DB->get_field('testtable', 'description', array('id' => $id)));
-        $this->assertEqual(substr($blob, 0, 250), $DB->get_field('testtable', 'image', array('id' => $id)));
+        $this->assertEqual($newclob, $record->description);
+        $this->assertEqual($newblob, $record->image);
+        $this->assertEqual($newclob, $DB->get_field('testtable', 'description', array('id' => $id)));
+        $this->assertEqual($newblob, $DB->get_field('testtable', 'image', array('id' => $id)));
 
     }