I've just uploaded a new experimental (and development) release of
DBD::ODBC 1.26_1 to CPAN. This contains over 200 block code changes so
it is a VERY significant change and should not be used on production
servers until you have tested it.
This release adds little in the way of functionality (and a few bug
fixes) but is a major push to get DBD::ODBC truely ODBC 3.0 compliant
and as such it will REQUIRE an ODBC driver manager to translate ODBC 3.0
calls to ODBC 2.0 if you are unlucky enough to have an ODBC 2.0 driver.
I include the changes below but a few notes in addition:
1. If you are using (or more likely attempting to use) the mdbtools ODBC
driver then you are out of luck. I have no issues with anyone working on
mdbtools personally but it is so far from being a reliable ODBC driver I
cannot accept bug reports for DBD::ODBC involving it. I started adding
workarounds and the list got just too big, sorry. There are alternatives
to mdbtools but they will cost you hard cash; I'm afraid that is the way
it is right now.
2. I don't think anyone has been using DBD::ODBC without an ODBC driver
manager in the last few years but I could be proved wrong. If you are,
again, sorry but what is the problem with you using one (in the future I
will remove support for linking directly with an ODBC driver and require
an ODBC Driver Manager but that will come later in the DBD::ODBC 1.26
release chain). If you are still not using an ODBC driver manager this
article (http://www.easysoft.com/developer/interfaces/odbc/linux.html)
might persuade you to start using one (and in particular
http://www.easysoft.com/developer/interfaces/odbc/linux.html#odbc_driver_managers).
Basically, an ODBC Driver Manager will map ODBC 3 calls to an ODBC 2
driver and vice versa and it avoids a load of nastiness in DBD::ODBC
which is best employed in the driver manager. I recommend the unixODBC
Driver Manager and my reasons are fairly straight forward 1) it is open
source 2) it is included with most Linux distributions 3) the main
developer works in my office so it is easy for me to liase with him and
get problems fixed 4) it is the most complete non Microsoft Driver
Manager implementation 5) it supports unicode like MS does, 6) the
cursor library works to the ODBC spec... I'm sure there is more.
However, if you choose to use iODBC (another ODBC Driver Manager) that
is fine and I will continue to support it. There are a few other more
minor non-Microsoft ODBC Driver Managers but they don't support Unicode
like the MS one so they provide a big headache for me and unless anyone
else wants to take over support for them they are problematic.
3. You will need a more up to date DBI (v1.609 to be precise) to use
this version of DBD::ODBC. I'm sorry about this but the reasons are
explained in the DBD::ODBC Changes file and the links from it.
4. I should point out (if you didn't know) I work for Easysoft which
provides a number of commercial ODBC Drivers for Windows and UNIX and
supports the development of the unixODBC Driver Manager. This is not why
I recommend unixODBC (it is purley a recommentation on what I believe is
the best) and I assure you that as far as DBD::ODBC is concerned my
focus is on making DBD::ODBC better but I of course have loyalties with
the company who pays me my salary. If anyone has a problem with that I
will happily give up maintainership of DBD::ODBC to someone else
considered more neutral.
The changes follow:
=head2 Changes in DBD::ODBC 1.26_1 October 24, 2010
There are over 200 block changes in the source code for this release
from the previous one (see below). If you are using DBD::ODBC in
production you should not upgrade without testing this release first
as it introduces a lot of internal changes. DBD::ODBC has now gone
entirely ODBC 3 and relies on an ODBC Driver Manager to map calls
to ODBC 2.0 drivers (why are you still using ODBC 2.0 drivers?).
From now on DBD::ODBC needs to be linked with an ODBC Driver Manager
and I recommend unixODBC on UNIX and the MS ODBC Driver Manager
on Windows. There are really good reasons for this but mainly it
is because an ODBC Driver Manager will map ODBC 2.0 calls to an
ODBC 3.0 driver and vice versa and handle UNICODE transparently.
Bumped Test::Simple requirement up to 0.90 so we can use done_testing
and note.
Bump Perl requirement to 5.8 as per DBI.
Workaround a bug in mdbtools which fails to set the out connection
string in a SQLDriverConnect call. This can lead to:
Fixed panic: sv_setpvn called with negative strlen at
blib/lib/DBD/ODBC.pm line 107.
Added rt_61370.t for rt 61370.
Removed last remaining sprintf calls and replaced with my_snprintf.
Changed the point at which DBD::ODBC switches from VARCHAR to
LONGVARCHAR or WVARCHAR to WLONGVARCHAR when SQLDesribeParam fails. It
was 4000 and is now 2000 for unicode builds. Works around a daft issue
in the MS SQL Server driver which will not allow 'x' x 2001 converted to
wide characters to be inserted into a varchar(8000).
Minor change to Makefile.PL to print out found libs for iODBC and
unixODBC.
Added some FAQs for problems with iODBC and a recent bug in DBI.
Added FAQ on my_snprintf problem.
Fixed some pod errors in FAQ document.
Fixed warning on 64 bit Strawberry Perl when compiling dbdimp.c for
cast from ptr to UDWORD.
Moved to_do items from Changes to TO_DO.
Reformatted this file to save Jens work.
Changed calls to SQLTransact (ODBC 2.0) to SQLEndTran (ODBC 3.0).
There really shouldn't be any ODBC 2.0 drivers still around but even
if there are, the ODBC driver manager should do the mapping for us.
Changed calls to SQLGetConnectOption/SQLSetConnectOption to
to SQLGetConnectAttr/SQLSetConnectAttr for ODBC 3.0.
Changed calls to SQLColAttributes (ODBC 2.0) to SQLColAttribute
(ODBC 3.0).
Bumped requirement on DBI to 1.609 because that is the first version
to contain a dbipport.h which defined my_snprintf - see
https://rt.cpan.org/Public/Bug/Display.html?id=62346 and
http://www.nntp.perl.org/group/perl.dbi.dev/2010/10/msg6335.html
Various small changes to dbdimp.c which should have no effect other
than to make it leaner:
Removed all dTHR occurrences from dbdimp.c as it is a NOOP since 5.8
and we need 5.8 at least.
Removed dbd_param_err as it was not used
Removed odbc_get_query_timeout as it was never compiled
Removed eod field from statement as it was never used
Removed a load of commented out code
Replaced some SvPV calls with SvPV_nolen when we didn't used the
length
Removed some silly code from dbd_db_execdirect which attempted to
return -3 - don't think it could ever get run.
Minor tracing output tidy up
Removed dbd_caution as it was no used
Localised more variable declarations
Martin
--
Martin J. Evans
Easysoft Limited
http://www.easysoft.com