in reply to sql2008 Filestream

my $statement ="insert into ... values ('$thisid','$now','$id','$userid',cast('$print' as ... "

Don't interpolate Postscript content ($print) into SQL statements, use placeholders instead (this is a good idea in general, not only for Postscript content).

Postscript code can in theory (depending on how it's generated) contain arbitrary characters, and even if it's 7-bit only, it can still contain single quotes...

As for the out-of-memory error with Apache, I don't know, but maybe it's indirectly caused by the other problem, so I would fix that first.

Replies are listed 'Best First'.
Re^2: sql2008 Filestream
by ksublondie (Friar) on Mar 01, 2011 at 19:48 UTC
    Well, after using placeholders I'm not getting any errors anymore, but I'm not sure if the data is getting there properly. When I retrieve the binary data from the db (still have to figure out how to convert it back to ps), I'm only getting 161 characters out of the database when my original ps content was 1.3M. Can that be right???

    ...Oh, and the memory error is no longer showing up either...

        Slowly making progress...

        FINALLY retrieved my ps content from the db, however, I have discovered that I'm also concatenating the data inserted into the table. Selecting is fixed...back to working on getting the data in there. I've applied the blob update code from the DBD::Sybase documentation you linked, but now I'm getting:

        DBD::Sybase::st syb_ct_send_data failed: Server message number=102 sev +erity=15 state=1 line=1 server=SQL2008\SQL2008 text=Incorrect syntax near '0x00000000000000000000000000000000'.
        My previous insert was letting sql convert the binary for me. But, now I'm not sure if I'm converting the binary data correctly in this method or not.
        sub printTransaction{ ... my $statement ="insert into PrintedChecks (Checkid,[datetime],id,print +edby,data) values (?,?,?,?,cast(? as varbinary(MAX))) "; my $sth=$db->prepare($statement); eval{ $sth->execute(($checkid,$now,$id,$userid,'')); }; if ($@){ $db->rollback; return 0; } $db->commit; $sth = $db->prepare("select data from printedchecks where id = '$id'") +; $sth->execute; while($sth->fetch) {$sth->syb_ct_data_info('CS_GET', 1);} $sth->syb_ct_prepare_send(); my $binary = pack("b*", $print); #Is this right??? $sth->syb_ct_data_info('CS_SET', 1, {total_txtlen => length($binary), +log_on_update => 0}); $sth->syb_ct_send_data($binary, length($binary)); $sth->syb_ct_finish_send(); ... }