[imp] Problems with attachments in current imp

Martin Tessun martin.tessun at die-tessuns.de
Sat Jun 8 12:08:11 UTC 2013


Quoting Michael M Slusarz <slusarz at horde.org>:

> Quoting Martin Tessun <martin.tessun at die-tessuns.de>:
>
>> Hi all,
>>
>> as I believe it just works usually and this is only my problem, I  
>> just wanted to ask if someone has an idea, what can cause the  
>> following:
>>
>> 1. Create a new mail, add attachment (e.g. PDF file) send this mail  
>> ==> attachment is too small and corrupted
>> 2. Forward a mail with an attachment (e.g. PDF file) ==> attachment  
>> gets smaller than from the original mail and is corrupted.
>
> My guess is that you are using SQL VFS backend and haven't increased  
> the maximum size of BLOB data.  There is a bunch of posts on this in  
> the mailing list archive.

Hm, the blob size is 50 MB:

MariaDB [(none)]> show global variables like 'max_allowed_packet';
+--------------------+----------+
| Variable_name      | Value    |
+--------------------+----------+
| max_allowed_packet | 52428800 |
+--------------------+----------+
1 row in set (0.00 sec)

Nevertheless every mail is at a maximum 66 kB.
So I checked  horde_vfs:

MariaDB [horde]> show table status like 'horde_vfs';
+-----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Name      | Engine | Version | Row_format | Rows | Avg_row_length |  
Data_length | Max_data_length | Index_length | Data_free |  
Auto_increment | Create_time         | Update_time | Check_time |  
Collation       | Checksum | Create_options | Comment |
+-----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| horde_vfs | InnoDB |      10 | Compact    |    6 |          16384 |   
      98304 |               0 |        32768 | 612368384 |              
15 | 2013-06-02 00:02:15 | NULL        | NULL       | utf8_general_ci  
|     NULL |                |         |
+-----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
1 row in set (0.06 sec)


So this is InnoDB.

Checking the size of the blobs:

MariaDB [horde]> SELECT OCTET_LENGTH(vfs_data) from horde_vfs;
+------------------------+
| OCTET_LENGTH(vfs_data) |
+------------------------+
|                   NULL |
|                   NULL |
|                   NULL |
|                  65535 |
|                   NULL |
|                   NULL |
|                  10130 |
+------------------------+
7 rows in set (0.09 sec)

Shows the 65535 as a maximum. Now I tried to insert some date to it  
and it showed again only 65535 bytes for the BLOB.
MariaDB [horde]> SELECT OCTET_LENGTH(vfs_data) from horde_vfs;
+------------------------+
| OCTET_LENGTH(vfs_data) |
+------------------------+
|                   NULL |
|                   NULL |
|                   NULL |
|                  65535 |
|                   NULL |
|                   NULL |
|                  10130 |
|                  65535 |
+------------------------+
8 rows in set (0.00 sec)

MariaDB [horde]> delete from horde_vfs where vfs_owner='tester';
Query OK, 1 row affected (0.05 sec)

Here my script (The file is about 200 kB)
<?php
$link = mysql_connect('localhost', 'user', 'password');
if (!$link) {
     die('Verbindung schlug fehl: ' . mysql_error());
}
echo "Erfolgreich verbunden\n";
$sql = "USE horde";
$res = mysql_query($sql, $link);
if (!$res) {
     die($sql . ' schlug fehl: ' . mysql_error() . "\n");
}

$filename = "test.pdf";
$filecontent = file_get_contents($filename);
$filecontent_escaped = mysql_real_escape_string($filecontent);

$sql = "INSERT INTO horde_vfs (vfs_type, vfs_path, vfs_name,  
vfs_modified, vfs_owner, vfs_data) " .
        "VALUES(1, '.', '$filename', 20130610, 'tester',  
'$filecontent_escaped')";
$res = mysql_query($sql, $link);
if (!$res) {
     die($sql . ' schlug fehl: ' . mysql_error() . "\n");
}
mysql_close($link);
?>

Then I found this one:

||| The default field type in mysql is 'BLOB'. And this fieldtype is  
restricted to a maximum size of 64KB.

Some more information:
MySQL defines 4 types of BLOB.

type             max size
------------  -------------
TINYBLOB                255
BLOB                 65_535
MEDIUMBLOB       16_777_215
LONGBLOB      4_294_967_295

So I changed horde_vfs to largeblob (storing up to 4GB)
MariaDB [horde]> alter table horde_vfs change vfs_data vfs_data LONGBLOB;

Did run the test again:
MariaDB [horde]> SELECT OCTET_LENGTH(vfs_data) from horde_vfs;
+------------------------+
| OCTET_LENGTH(vfs_data) |
+------------------------+
|                   NULL |
|                   NULL |
|                   NULL |
|                  65535 |
|                   NULL |
|                   NULL |
|                  10130 |
|                 260627 |
+------------------------+
8 rows in set (0.00 sec)

And it worked. So why not just change the vfs_data to longblob by default?

Thanks Michael for stubbing my nose to the right place.

Cheers,
Martin


More information about the imp mailing list