Fix updating multiple CLOB/BLOB columns on Oracle
Kevin L. Kane [Tue, 18 Nov 2014 13:02:33 +0000 (08:02 -0500)]
The genric _dbi_attrs_for_bind caches the attribute hashrefs by data
type, so we can't modify them directly with column-specific data.

Instead, copy it and add the ora_field attribute to the copy.

(cherry pick of 3d02b69a)

AUTHORS
Changes
lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm

diff --git a/AUTHORS b/AUTHORS
index 180d485..6a9f6ef 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -104,6 +104,7 @@ Jordan Metzmeier <jmetzmeier@magazines.com>
 jshirley: J. Shirley <jshirley@gmail.com>
 kaare: Kaare Rasmussen
 kd: Kieren Diment <diment@gmail.com>
+kkane: Kevin L. Kane <kevin.kane@gmail.com>
 konobi: Scott McWhirter <konobi@cpan.org>
 lejeunerenard: Sean Zellmer <sean@lejeunerenard.com>
 littlesavage: Alexey Illarionov <littlesavage@orionet.ru>
diff --git a/Changes b/Changes
index a241cbd..1821b49 100644 (file)
--- a/Changes
+++ b/Changes
@@ -4,6 +4,7 @@ Revision history for DBIx::Class
         - Relax the 'self_result_object' argument check in the relationship
           resolution codepath, restoring exotic uses of inflate_result
           http://lists.scsys.co.uk/pipermail/dbix-class/2015-January/011876.html
+        - Fix updating multiple CLOB/BLOB columns on Oracle
 
     * Misc
         - Remove warning about potential side effects of RT#79576 (scheduled)
index 2b4ce75..636e40e 100644 (file)
@@ -419,11 +419,17 @@ sub _dbi_attrs_for_bind {
 
   my $attrs = $self->next::method($ident, $bind);
 
-  for my $i (0 .. $#$attrs) {
-    if (keys %{$attrs->[$i]||{}} and my $col = $bind->[$i][0]{dbic_colname}) {
-      $attrs->[$i]{ora_field} = $col;
-    }
-  }
+  # Push the column name into all bind attrs, make sure to *NOT* write into
+  # the existing $attrs->[$idx]{..} hashref, as it is cached by the call to
+  # next::method above.
+  $attrs->[$_]
+    and
+  keys %{ $attrs->[$_] }
+    and
+  $bind->[$_][0]{dbic_colname}
+    and
+  $attrs->[$_] = { %{$attrs->[$_]}, ora_field => $bind->[$_][0]{dbic_colname} }
+    for 0 .. $#$attrs;
 
   $attrs;
 }