Greg Sabino Mullane wrote:
-----BEGIN PGP SIGNED MESSAGE----- Hash: RIPEMD160

I'm mostly settled on DBIstcf_STRICT _not_ being the default.
So 'loosely typed' will be the default and people who want an error
if the type can't be cast safely will need to use StrictlyTyped => 1.
I'm (slightly) open to persuasion, but that seems to fit the general philosophy of perl and the DBI better. It also makes transition easier
for anyone who happens to have code that calls bind_column with an SQL type.

I'd opine that since we're dealing with databases holding Important Things, the default should be to throw an error and make people flip a switch to get lax mode. A large warning in the upgreade notes should suffice for anyone transitioning.
I'm undecided about the name of the attribute to indicate use of
DBIstcf_DISCARD_PV. MinMemory or DiscardString or ...? I'm leaning more towards DiscardString => 1 as it directly describes what it does rather than a side-effect.

+1 to DiscardString

o I wouldn't mind someone else looking over the changes as although I
currently maintain DBD::ODBC I do not consider myself a DBI internals of
XS expert.

Post a diff and I'll review it for you. The code you appended previously
looks ok.

Ditto.

o Although my primary impetus for doing this is I need it in DBD::Oracle
I would plan to do something similar in DBD::ODBC once this stuff is
committed.

Does anyone know if there are other databases that have mapping issues with
integers and Perlish integers other than Oracle? Just curious, as I only
personally know how a handful deal with ints internally.


Greg, the issue I started by trying to address is rather specific to our use of JSON::XS and roughly described at http://rt.cpan.org/Public/Bug/Display.html?id=49818. The problem we faced is not specific to DBD::Oracle and applies to many DBDs (and certainly DBD::ODBC) although I believe it was addressed in Postgres a while ago. I don't think there is anything fundamentally wrong with what most DBDs do right now - Perl has always worked on the basis that you shouldn't need to know the way the underlaying data is stored, Perl will just do the right thing for the context you use the data. On the other hand we have the TYPE attribute to bind_col and no DBDs seems to do anything with it. While some may (and do) argue JSON::XS shouldn't do what it does I think the DBI side of this has moved on a bit now with these changes. Few, if any, DBDs pay any attention to the TYPE attribute on the bind_col method but /could/ benefit from knowing the type before the data is retrieved. For instance, DBD::ODBC (like may other DBDs) binds all the data from the database as strings but in many cases if you know the data is really an integer (or will be used as an integer) it is more efficient to retrieve it as such from the database. The TYPE argument to bind_col provides that information and these changes (if implemented in a DBD) simply arrange for the retrieved data to be "cast" to a Perl scalar with only the IV etc set and not the pv (assuming DiscardString is used).

A big (pardon the pun) gain (other than the above) would be to support SQL_BIGINT. The database we are using is Oracle and it supports very large integers and as we know these will get (for primary keys etc) too big to fit in an integer or long integer we have to treat them as strings but they are not strings. Also, Oracle (and perhaps other databases) don't always like accepting strings for columns which are integers (they have to convert the strings and then sometimes decide that because of that they won't use an index on that column). I'd like to follow these changes up with some investigation for big integers and I'll hopefully find some time to do just that but one thing at a time.

Martin

Reply via email to