WriteLOBs storage component and 2 implementations
authorRafael Kitover <rkitover@cpan.org>
Mon, 30 Jan 2012 11:08:54 +0000 (12:08 +0100)
committerRafael Kitover <rkitover@cpan.org>
Sun, 26 Aug 2012 16:03:15 +0000 (12:03 -0400)
commitfcaccd73cc6b0f8db0de2b73f146c54abb70f597
tree63fed00c88470b9db990598d7d9f250023a89be1
parent6343a20374932aeb277eb63a91f9769f9da2f4b6
WriteLOBs storage component and 2 implementations

Factor out the LOB Writing code through an API from ::Sybase::ASE into a
generic component, ::Storage::DBI::WriteLOBs which requires the
composing class to implement just two methods, _write_lobs and _empty_lob
and implements insert, update and insert_bulk as well as a bunch of low
level methods (which are private.) These methods are documented in the
component as top comments.

::DBI::Oracle::Generic and ::Sybase::ASE implement this component.

The implementation is stackable, so that a composing class override of
LOB handling using the low level methods will not conflict with the
inherited methods, however for performance reasons a flag has been
added:

    local $self->{_skip_writelobs_impl} = 1;

to shortcircuit the implementation even faster. This flag is not
documented and will be replaced using the capability system in the
future, it is used in the ASE implementation of insert_bulk because of
the special identities handling it requires.

This refactor addresses a number of issues:

 - rows can now be identified by unique constraints, not just PKs for
   LOB ops

 - ASE UPDATEs with LIKE queries on TEXT columns in the WHERE condition
   now work

 - LOB ops now work in Oracle with quoting turned on

 - LOB ops work in Oracle with DBD::Oracle 1.23

 - insert_bulk now works with LOBs for Oracle, as long as the slices can
   be uniquely identified
Changes
lib/DBIx/Class/Storage/DBI.pm
lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm
lib/DBIx/Class/Storage/DBI/Sybase/ASE.pm
lib/DBIx/Class/Storage/DBI/WriteLOBs.pm [new file with mode: 0644]
t/73oracle_blob.t
t/746sybase.t