On Wed, Jan 19, 2011 at 04:39:24PM +0100, Peter Bex wrote:
> diff -r 491a9039ec03 common/libraries/php/database/database.class.php
> --- a/common/libraries/php/database/database.class.php  Wed Jan 19 12:08:42 
> 2011 +0100
> +++ b/common/libraries/php/database/database.class.php  Wed Jan 19 15:02:44 
> 2011 +0100
> @@ -890,7 +890,7 @@
>          return $this->connection->escape($text, $escape_wildcards);
>      }
>  
> -    function query($query, $types = null, $result_class = true, 
> $result_wrap_class = false)
> +    function query($query, $types = true, $result_class = true, 
> $result_wrap_class = false)
>      {
>         $result = $this->connection->query($query, $types, $result_class, 
> $result_wrap_class);
>         if (MDB2::isError($result))
> 
> 
> This fixes a lot, but it also introduces new problems:  Some tables have
> 'text' fields with no limit set. MDB2 maps those to 'clobs'; character large
> objects. These are represented as a "resource", which is like a type of
> stream from which you can read bytes like you would from a file.

The attached patch makes it work.  It's a bit of a workaround but without
support in MDB2 to do it differently I don't see how this can be improved.

If you want to try this patch you'll need to apply a bugfix patch for
MDB2 as well;  https://pear.php.net/bugs/bug.php?id=18203
or you can use changeset ba7dc72fa8b1 from my postgres repository at
http://dev.solide-ict.nl/hg-pub/chamilo2-pgsql

Asides from this patch there are over a hundred different places in the
code where fetchRow() is still directly used.  I think those would need
to be refactored to go through the Chamilo database abstraction layer
instead of directly using MDB2.

Comments?  Opinions?

Cheers,
Peter Bex
Solide ICT - http://www.solide-ict.nl
diff -r ba7dc72fa8b1 common/libraries/php/database/database.class.php
--- a/common/libraries/php/database/database.class.php  Thu Jan 20 13:59:42 
2011 +0100
+++ b/common/libraries/php/database/database.class.php  Thu Jan 20 14:22:31 
2011 +0100
@@ -758,6 +758,15 @@
            $this->mdb2_error_to_exception($record);
         }
 
+       foreach($record as &$field) {
+           if (is_resource($field)) {
+               $data = '';
+               while(!feof($field))
+                   $data .= fread($field, 1024);
+               $field = $data;
+           }
+       }
+
         if ($record)
         {
             return $record;
@@ -890,7 +899,7 @@
         return $this->connection->escape($text, $escape_wildcards);
     }
 
-    function query($query, $types = null, $result_class = true, 
$result_wrap_class = false)
+    function query($query, $types = true, $result_class = true, 
$result_wrap_class = false)
     {
        $result = $this->connection->query($query, $types, $result_class, 
$result_wrap_class);
        if (MDB2::isError($result))
diff -r ba7dc72fa8b1 common/libraries/php/database/object_result_set.class.php
--- a/common/libraries/php/database/object_result_set.class.php Thu Jan 20 
13:59:42 2011 +0100
+++ b/common/libraries/php/database/object_result_set.class.php Thu Jan 20 
14:22:31 2011 +0100
@@ -50,6 +50,14 @@
         if ($record = $this->get_handle()->fetchRow(MDB2_FETCHMODE_ASSOC))

         {
             $this->increment_current();

+           foreach($record as &$field) {
+               if (is_resource($field)) {
+                   $data = '';
+                   while(!feof($field))
+                       $data .= fread($field, 1024);
+                   $field = $data;
+               }
+           }
             return $this->data_manager->record_to_object($record, 
$this->class_name);

         }

         else

_______________________________________________
Dev mailing list
Dev@lists.chamilo.org
http://lists.chamilo.org/listinfo/dev

Reply via email to