On Tue, 20 Jul 2010 14:20:30 -0700, Tim Bunce <tim.bu...@pobox.com> wrote:
> On Tue, Jul 20, 2010 at 09:46:42PM +0100, Martin J. Evans wrote: > > [...] > > > > As a result of the above, I don't see any way of supporting the existing > > blob_read in DBI and as it is undocumented anyway and no DBDs seem to > > use it > > Feel free to mark it deprecated in the DBI docs.. > > > I've put a test implementation together as: > > > > odbc_lob_read(sth, colno, buf, length, \%attrs) > > > > where \%attrs can contain TYPE => SQL_type. > > > I appreciate this RFC is quite long and I'm guessing few people will get > > to the end. Increasingly, I'm working with several DBDs and the > > differences between them (beyond SQL differences) is proving VERY > > frustrating. It would be nice to try and sort out lob reading and whilst > > I'm on a roll, SQLMoreResults/more_results, last_insert_id, lob_write, > > binding with a specific type etc but I guess since some of these have > > been covered before and we didn't get too far in the past that perhaps > > there is not a lot of interest in it. I'd like to fit DBD::ODBC with > > DBI's blob_read but I don't think it works for DBD::ODBC as it stands > > and I note other DBDs have provided their own lob reading methods > > substantially different so I'm guessing they found that too. > > I encourage driver authors to implement a 'natural' private API first > before working together to agree on a common API for the DBI. > (The blob_read API is an example of what happens when the DBI specifies > things before drivers support them.) Implementing BLOB support for Unify was extremely easy. I waited a very long time before I started investigating what I would need to do, but with the way Unify interfaces to its databases, I can say the implementation took less than an hour. Unify was good in at least one thing then :) My blob_read function isn't even used at all --8<--- int dbd_st_blob_read (SV *sth, imp_sth_t *imp_sth, int field, long offset, long len, SV *destrv, long destoffset) { dTHX; NYI ("st_blob_read"); return (0); } /* dbd_st_blob_read */ -->8--- The FETCH in my code has more debug code than actual code: --8<--- case SQLBINARY: { auto char *s; st_dbg (4, imp_sth, "BINARY %2d: ", ftp); EXEC SQL GET DESCRIPTOR :o_sql_nm VALUE :fix :fdX = DATA; st_dbg (6, imp_sth, "\r\n After get, sqlcode = %d\n", SQLCODE); unless (sqlError (sth)) return (NULL); i = fdX.curlen; s = fdX.dataptr; unless (i && s) { s = ""; i = 0; } sv_setpvn (sv, s, i); st_dbg (4, imp_sth, "(%d) %8X ...", i, SvPVX (sv)); break; } -->8--- and the STORE is even smaller --8<--- case SQLBINARY: { auto char *s; st_dbg (4, imp_sth, "BINARY: "); s = SvPV (value, l); st_dbg (4, imp_sth, "(%d) %8X ...", l, s); fdX.curlen = l; fdX.dataptr = s; EXEC SQL SET SQL DESCRIPTOR :i_sql_nm VALUE :fix DATA = :fdX, INDICATOR = 0; st_dbg (4, imp_sth, " After set, sqlcode = %d\n", SQLCODE); unless (sqlError (sth)) return (0); break; } -->8--- > > With Perl 6 perhaps on the horizon and Tim's current interest in JDBC I > > think we are well advised to sort some of this out in Perl 5 first. It > > makes little difference to me right now as I'll implement what I need > > now and move on but I'm prepared to work to a DBI interface for the > > common goal. Some of this is not going to go away - you only have to > > watch perl monks to see the frustration with last_insert_id, lob > > reading, binding columns with types etc across DBDs to know this is > > proving troublesome for the average user. -- H.Merijn Brand http://tux.nl Perl Monger http://amsterdam.pm.org/ using 5.00307 through 5.12 and porting perl5.13.x on HP-UX 10.20, 11.00, 11.11, 11.23, and 11.31, OpenSuSE 10.3, 11.0, and 11.1, AIX 5.2 and 5.3. http://mirrors.develooper.com/hpux/ http://www.test-smoke.org/ http://qa.perl.org http://www.goldmark.org/jeff/stupid-disclaimers/