Re: Inserting with a BLOB column fails [SOLVED]

From: Andreas Pardeike (andrea..ardeike.net)
Date: Tue May 23 2006 - 08:30:43 EDT

  • Next message: Mike Kienenberger: "Re: database trigger"

    Andrus,

    I've found the problem and solved it. Which leads me to the question:
    Why doesn't the MySQLAdapter quote column names?

    The not quoting of column names actually bites me here because I have a
    column named 'group' - once I renamed it, everything works as expected.

    There are many tools out there that handle spaces, umlaut and other
    weird
    things in column names fine - I guess it would just be better if cayenne
    would do so too.

    JMHO,
    Andreas Pardeike

    On 22 maj 2006, at 11.23, Andreas Pardeike wrote:

    > I just double checked. My cayenne.xml contains:
    >
    > <node name="mysql"
    > datasource="mysql.driver.xml"
    > adapter="org.objectstyle.cayenne.dba.mysql.MySQLAdapter"
    > factory="org.objectstyle.cayenne.conf.DriverDataSourceFactory">
    > <map-ref name="mysql"/>
    > </node>
    >
    > Versions:
    >
    > Cayenne Release Notes 1.2 B3 (beta)
    > mysql Ver 14.7 Distrib 4.1.14, for redhat-linux-gnu (i386) using
    > readline 4.3
    >
    > I did some more work, but couldn't get any further,
    > Andreas
    >
    > On 19 maj 2006, at 18.46, Andrus Adamchik wrote:
    >
    >> A corresponding Cayenne unit test works on all version of MySQL
    >> between 4.0 and 5.0 (tested column type as 'longblob', but I don't
    >> think it matters). So what version do you have?
    >>
    >> Another thing to check - are you actually using MySQLAdapter (or
    >> 1.2 auto adapter)? Is it possible there is an adapter mixup.
    >>
    >> Andrus
    >>
    >> On May 19, 2006, at 11:58 AM, Andreas Pardeike wrote:
    >>
    >>> Hi,
    >>>
    >>> When I try to insert a new row into my image database using this
    >>> code:
    >>>
    >>> File imgFile = new File(TEMPFILE2);
    >>> InputStream imgStream = new FileInputStream(imgFile);
    >>> long imgStreamLength = imgFile.length();
    >>> byte[] imgData = new byte[(int)imgStreamLength];
    >>> int offset = 0;
    >>> int numRead = 0;
    >>> while(offset < imgData.length && (numRead=imgStream.read
    >>> (imgData, offset, imgData.length-offset)) >= 0)
    >>> offset += numRead;
    >>> imgStream.close();
    >>>
    >>> Images img = (Images)context.createAndRegisterNewObject
    >>> (Images.class);
    >>> img.setName("jei");
    >>> img.setGroup("medarbetare");
    >>> img.setType("image/jpeg");
    >>> img.setX(new Integer(160));
    >>> img.setY(new Integer(120));
    >>> img.setImage(imgData);
    >>> context.commitChanges();
    >>>
    >>> Cayenne fails with this error:
    >>>
    >>> QueryLogger: INSERT INTO images (group, image, name, type, x,
    >>> y) VALUES (?, ?, ?, ?, ?, ?)
    >>> QueryLogger: [bind: 'medarbetare', < 89 50 4E 47 0D 0A 1A 0A
    >>> 00 00 00 0D ...>, 'jei', 'image/jpeg', 160, 120]
    >>> QueryLogger: *** error.
    >>> java.sql.SQLException: Syntax error or access violation
    >>> message from server: "You have an error in your SQL syntax;
    >>> check the manual that corresponds to your MySQL server
    >>> version for the right syntax to use near 'group, image, name,
    >>> type, x, y) VALUES ('medarbetare', _binary'‰PNG\r\n\Z\n\0\0\'
    >>> at line 1"
    >>>
    >>> Images is defined as:
    >>>
    >>> CREATE TABLE `images` (
    >>> `name` varchar(64) NOT NULL default '',
    >>> `group` varchar(64) NOT NULL default '',
    >>> `type` varchar(64) NOT NULL default '',
    >>> `image` blob NOT NULL,
    >>> `x` int(11) NOT NULL default '0',
    >>> `y` int(11) NOT NULL default '0',
    >>> PRIMARY KEY (`name`,`group`)
    >>> ) ENGINE=MyISAM DEFAULT CHARSET=latin1
    >>>
    >>> and the relevant part in Images is:
    >>>
    >>> public void setImage(byte[] image) {
    >>> writeProperty("image", image);
    >>> }
    >>> public byte[] getImage() {
    >>> return (byte[])readProperty("image");
    >>> }
    >>>
    >>>
    >>> Any pointers or ideas? I already tried changing the column type
    >>> but it
    >>> doesn't change anything.
    >>>
    >>> Andreas Pardeike
    >



    This archive was generated by hypermail 2.0.0 : Tue May 23 2006 - 08:31:21 EDT