Some cleanups around loading/use of DBIx::Class::Exception (no func. changes)
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Row.pm
1 package DBIx::Class::Row;
2
3 use strict;
4 use warnings;
5
6 use base qw/DBIx::Class/;
7
8 use Scalar::Util 'blessed';
9 use List::Util 'first';
10 use Try::Tiny;
11
12 ###
13 ### Internal method
14 ### Do not use
15 ###
16 BEGIN {
17   *MULTICREATE_DEBUG =
18     $ENV{DBIC_MULTICREATE_DEBUG}
19       ? sub () { 1 }
20       : sub () { 0 };
21 }
22
23 use namespace::clean;
24
25 =head1 NAME
26
27 DBIx::Class::Row - Basic row methods
28
29 =head1 SYNOPSIS
30
31 =head1 DESCRIPTION
32
33 This class is responsible for defining and doing basic operations on rows
34 derived from L<DBIx::Class::ResultSource> objects.
35
36 Result objects are returned from L<DBIx::Class::ResultSet>s using the
37 L<create|DBIx::Class::ResultSet/create>, L<find|DBIx::Class::ResultSet/find>,
38 L<next|DBIx::Class::ResultSet/next> and L<all|DBIx::Class::ResultSet/all> methods,
39 as well as invocations of 'single' (
40 L<belongs_to|DBIx::Class::Relationship/belongs_to>,
41 L<has_one|DBIx::Class::Relationship/has_one> or
42 L<might_have|DBIx::Class::Relationship/might_have>)
43 relationship accessors of L<Result|DBIx::Class::Manual::ResultClass> objects.
44
45 =head1 NOTE
46
47 All "Row objects" derived from a Schema-attached L<DBIx::Class::ResultSet>
48 object (such as a typical C<< L<search|DBIx::Class::ResultSet/search
49 >->L<next|DBIx::Class::ResultSet/next> >> call) are actually Result
50 instances, based on your application's
51 L<Result class|DBIx::Class::Manual::Glossary/Result_class>.
52
53 L<DBIx::Class::Row> implements most of the row-based communication with the
54 underlying storage, but a Result class B<should not inherit from it directly>.
55 Usually, Result classes inherit from L<DBIx::Class::Core>, which in turn
56 combines the methods from several classes, one of them being
57 L<DBIx::Class::Row>.  Therefore, while many of the methods available to a
58 L<DBIx::Class::Core>-derived Result class are described in the following
59 documentation, it does not detail all of the methods available to Result
60 objects.  Refer to L<DBIx::Class::Manual::ResultClass> for more info.
61
62 =head1 METHODS
63
64 =head2 new
65
66   my $row = My::Class->new(\%attrs);
67
68   my $row = $schema->resultset('MySource')->new(\%colsandvalues);
69
70 =over
71
72 =item Arguments: \%attrs or \%colsandvalues
73
74 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
75
76 =back
77
78 While you can create a new result object by calling C<new> directly on
79 this class, you are better off calling it on a
80 L<DBIx::Class::ResultSet> object.
81
82 When calling it directly, you will not get a complete, usable row
83 object until you pass or set the C<result_source> attribute, to a
84 L<DBIx::Class::ResultSource> instance that is attached to a
85 L<DBIx::Class::Schema> with a valid connection.
86
87 C<$attrs> is a hashref of column name, value data. It can also contain
88 some other attributes such as the C<result_source>.
89
90 Passing an object, or an arrayref of objects as a value will call
91 L<DBIx::Class::Relationship::Base/set_from_related> for you. When
92 passed a hashref or an arrayref of hashrefs as the value, these will
93 be turned into objects via new_related, and treated as if you had
94 passed objects.
95
96 For a more involved explanation, see L<DBIx::Class::ResultSet/create>.
97
98 Please note that if a value is not passed to new, no value will be sent
99 in the SQL INSERT call, and the column will therefore assume whatever
100 default value was specified in your database. While DBIC will retrieve the
101 value of autoincrement columns, it will never make an explicit database
102 trip to retrieve default values assigned by the RDBMS. You can explicitly
103 request that all values be fetched back from the database by calling
104 L</discard_changes>, or you can supply an explicit C<undef> to columns
105 with NULL as the default, and save yourself a SELECT.
106
107  CAVEAT:
108
109  The behavior described above will backfire if you use a foreign key column
110  with a database-defined default. If you call the relationship accessor on
111  an object that doesn't have a set value for the FK column, DBIC will throw
112  an exception, as it has no way of knowing the PK of the related object (if
113  there is one).
114
115 =cut
116
117 ## It needs to store the new objects somewhere, and call insert on that list later when insert is called on this object. We may need an accessor for these so the user can retrieve them, if just doing ->new().
118 ## This only works because DBIC doesnt yet care to check whether the new_related objects have been passed all their mandatory columns
119 ## When doing the later insert, we need to make sure the PKs are set.
120 ## using _relationship_data in new and funky ways..
121 ## check Relationship::CascadeActions and Relationship::Accessor for compat
122 ## tests!
123
124 sub __new_related_find_or_new_helper {
125   my ($self, $relname, $data) = @_;
126
127   my $rsrc = $self->result_source;
128
129   # create a mock-object so all new/set_column component overrides will run:
130   my $rel_rs = $rsrc->related_source($relname)->resultset;
131   my $new_rel_obj = $rel_rs->new_result($data);
132   my $proc_data = { $new_rel_obj->get_columns };
133
134   if ($self->__their_pk_needs_us($relname)) {
135     MULTICREATE_DEBUG and warn "MC $self constructing $relname via new_result";
136     return $new_rel_obj;
137   }
138   elsif ($rsrc->_pk_depends_on($relname, $proc_data )) {
139     if (! keys %$proc_data) {
140       # there is nothing to search for - blind create
141       MULTICREATE_DEBUG and warn "MC $self constructing default-insert $relname";
142     }
143     else {
144       MULTICREATE_DEBUG and warn "MC $self constructing $relname via find_or_new";
145       # this is not *really* find or new, as we don't want to double-new the
146       # data (thus potentially double encoding or whatever)
147       my $exists = $rel_rs->find ($proc_data);
148       return $exists if $exists;
149     }
150     return $new_rel_obj;
151   }
152   else {
153     my $us = $rsrc->source_name;
154     $self->throw_exception (
155       "Unable to determine relationship '$relname' direction from '$us', "
156     . "possibly due to a missing reverse-relationship on '$relname' to '$us'."
157     );
158   }
159 }
160
161 sub __their_pk_needs_us { # this should maybe be in resultsource.
162   my ($self, $relname) = @_;
163   my $source = $self->result_source;
164   my $reverse = $source->reverse_relationship_info($relname);
165   my $rel_source = $source->related_source($relname);
166   my $us = { $self->get_columns };
167   foreach my $key (keys %$reverse) {
168     # if their primary key depends on us, then we have to
169     # just create a result and we'll fill it out afterwards
170     return 1 if $rel_source->_pk_depends_on($key, $us);
171   }
172   return 0;
173 }
174
175 sub new {
176   my ($class, $attrs) = @_;
177   $class = ref $class if ref $class;
178
179   my $new = bless { _column_data => {} }, $class;
180
181   if ($attrs) {
182     $new->throw_exception("attrs must be a hashref")
183       unless ref($attrs) eq 'HASH';
184
185     my $source = delete $attrs->{-result_source};
186     if ( my $h = delete $attrs->{-source_handle} ) {
187       $source ||= $h->resolve;
188     }
189
190     $new->result_source($source) if $source;
191
192     if (my $col_from_rel = delete $attrs->{-cols_from_relations}) {
193       @{$new->{_ignore_at_insert}={}}{@$col_from_rel} = ();
194     }
195
196     my ($related,$inflated);
197
198     foreach my $key (keys %$attrs) {
199       if (ref $attrs->{$key}) {
200         ## Can we extract this lot to use with update(_or .. ) ?
201         $new->throw_exception("Can't do multi-create without result source")
202           unless $source;
203         my $info = $source->relationship_info($key);
204         my $acc_type = $info->{attrs}{accessor} || '';
205         if ($acc_type eq 'single') {
206           my $rel_obj = delete $attrs->{$key};
207           if(!blessed $rel_obj) {
208             $rel_obj = $new->__new_related_find_or_new_helper($key, $rel_obj);
209           }
210
211           if ($rel_obj->in_storage) {
212             $new->{_rel_in_storage}{$key} = 1;
213             $new->set_from_related($key, $rel_obj);
214           } else {
215             MULTICREATE_DEBUG and warn "MC $new uninserted $key $rel_obj\n";
216           }
217
218           $related->{$key} = $rel_obj;
219           next;
220         }
221         elsif ($acc_type eq 'multi' && ref $attrs->{$key} eq 'ARRAY' ) {
222           my $others = delete $attrs->{$key};
223           my $total = @$others;
224           my @objects;
225           foreach my $idx (0 .. $#$others) {
226             my $rel_obj = $others->[$idx];
227             if(!blessed $rel_obj) {
228               $rel_obj = $new->__new_related_find_or_new_helper($key, $rel_obj);
229             }
230
231             if ($rel_obj->in_storage) {
232               $rel_obj->throw_exception ('A multi relationship can not be pre-existing when doing multicreate. Something went wrong');
233             } else {
234               MULTICREATE_DEBUG and
235                 warn "MC $new uninserted $key $rel_obj (${\($idx+1)} of $total)\n";
236             }
237             push(@objects, $rel_obj);
238           }
239           $related->{$key} = \@objects;
240           next;
241         }
242         elsif ($acc_type eq 'filter') {
243           ## 'filter' should disappear and get merged in with 'single' above!
244           my $rel_obj = delete $attrs->{$key};
245           if(!blessed $rel_obj) {
246             $rel_obj = $new->__new_related_find_or_new_helper($key, $rel_obj);
247           }
248           if ($rel_obj->in_storage) {
249             $new->{_rel_in_storage}{$key} = 1;
250           }
251           else {
252             MULTICREATE_DEBUG and warn "MC $new uninserted $key $rel_obj";
253           }
254           $inflated->{$key} = $rel_obj;
255           next;
256         } elsif ($class->has_column($key)
257             && $class->column_info($key)->{_inflate_info}) {
258           $inflated->{$key} = $attrs->{$key};
259           next;
260         }
261       }
262       $new->throw_exception("No such column $key on $class")
263         unless $class->has_column($key);
264       $new->store_column($key => $attrs->{$key});
265     }
266
267     $new->{_relationship_data} = $related if $related;
268     $new->{_inflated_column} = $inflated if $inflated;
269   }
270
271   return $new;
272 }
273
274 =head2 $column_accessor
275
276   # Each pair does the same thing
277
278   # (un-inflated, regular column)
279   my $val = $row->get_column('first_name');
280   my $val = $row->first_name;
281
282   $row->set_column('first_name' => $val);
283   $row->first_name($val);
284
285   # (inflated column via DBIx::Class::InflateColumn::DateTime)
286   my $val = $row->get_inflated_column('last_modified');
287   my $val = $row->last_modified;
288
289   $row->set_inflated_column('last_modified' => $val);
290   $row->last_modified($val);
291
292 =over
293
294 =item Arguments: $value?
295
296 =item Return Value: $value
297
298 =back
299
300 A column accessor method is created for each column, which is used for
301 getting/setting the value for that column.
302
303 The actual method name is based on the
304 L<accessor|DBIx::Class::ResultSource/accessor> name given during the
305 L<Result Class|DBIx::Class::Manual::ResultClass> L<column definition
306 |DBIx::Class::ResultSource/add_columns>. Like L</set_column>, this
307 will not store the data in the database until L</insert> or L</update>
308 is called on the row.
309
310 =head2 insert
311
312   $row->insert;
313
314 =over
315
316 =item Arguments: none
317
318 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
319
320 =back
321
322 Inserts an object previously created by L</new> into the database if
323 it isn't already in there. Returns the object itself. To insert an
324 entirely new row into the database, use L<DBIx::Class::ResultSet/create>.
325
326 To fetch an uninserted result object, call
327 L<new_result|DBIx::Class::ResultSet/new_result> on a resultset.
328
329 This will also insert any uninserted, related objects held inside this
330 one, see L<DBIx::Class::ResultSet/create> for more details.
331
332 =cut
333
334 sub insert {
335   my ($self) = @_;
336   return $self if $self->in_storage;
337   my $source = $self->result_source;
338   $self->throw_exception("No result_source set on this object; can't insert")
339     unless $source;
340
341   my $storage = $source->storage;
342
343   my $rollback_guard;
344
345   # Check if we stored uninserted relobjs here in new()
346   my %related_stuff = (%{$self->{_relationship_data} || {}},
347                        %{$self->{_inflated_column} || {}});
348
349   # insert what needs to be inserted before us
350   my %pre_insert;
351   for my $relname (keys %related_stuff) {
352     my $rel_obj = $related_stuff{$relname};
353
354     if (! $self->{_rel_in_storage}{$relname}) {
355       next unless (blessed $rel_obj && $rel_obj->isa('DBIx::Class::Row'));
356
357       next unless $source->_pk_depends_on(
358                     $relname, { $rel_obj->get_columns }
359                   );
360
361       # The guard will save us if we blow out of this scope via die
362       $rollback_guard ||= $storage->txn_scope_guard;
363
364       MULTICREATE_DEBUG and warn "MC $self pre-reconstructing $relname $rel_obj\n";
365
366       my $them = { %{$rel_obj->{_relationship_data} || {} }, $rel_obj->get_columns };
367       my $existing;
368
369       # if there are no keys - nothing to search for
370       if (keys %$them and $existing = $self->result_source
371                                            ->related_source($relname)
372                                            ->resultset
373                                            ->find($them)
374       ) {
375         %{$rel_obj} = %{$existing};
376       }
377       else {
378         $rel_obj->insert;
379       }
380
381       $self->{_rel_in_storage}{$relname} = 1;
382     }
383
384     $self->set_from_related($relname, $rel_obj);
385     delete $related_stuff{$relname};
386   }
387
388   # start a transaction here if not started yet and there is more stuff
389   # to insert after us
390   if (keys %related_stuff) {
391     $rollback_guard ||= $storage->txn_scope_guard
392   }
393
394   MULTICREATE_DEBUG and do {
395     no warnings 'uninitialized';
396     warn "MC $self inserting (".join(', ', $self->get_columns).")\n";
397   };
398
399   # perform the insert - the storage will return everything it is asked to
400   # (autoinc primary columns and any retrieve_on_insert columns)
401   my %current_rowdata = $self->get_columns;
402   my $returned_cols = $storage->insert(
403     $source,
404     { %current_rowdata }, # what to insert, copy because the storage *will* change it
405   );
406
407   for (keys %$returned_cols) {
408     $self->store_column($_, $returned_cols->{$_})
409       # this ensures we fire store_column only once
410       # (some asshats like overriding it)
411       if (
412         (!exists $current_rowdata{$_})
413           or
414         (defined $current_rowdata{$_} xor defined $returned_cols->{$_})
415           or
416         (defined $current_rowdata{$_} and $current_rowdata{$_} ne $returned_cols->{$_})
417       );
418   }
419
420   delete $self->{_column_data_in_storage};
421   $self->in_storage(1);
422
423   $self->{_dirty_columns} = {};
424   $self->{related_resultsets} = {};
425
426   foreach my $relname (keys %related_stuff) {
427     next unless $source->has_relationship ($relname);
428
429     my @cands = ref $related_stuff{$relname} eq 'ARRAY'
430       ? @{$related_stuff{$relname}}
431       : $related_stuff{$relname}
432     ;
433
434     if (@cands && blessed $cands[0] && $cands[0]->isa('DBIx::Class::Row')
435     ) {
436       my $reverse = $source->reverse_relationship_info($relname);
437       foreach my $obj (@cands) {
438         $obj->set_from_related($_, $self) for keys %$reverse;
439         if ($self->__their_pk_needs_us($relname)) {
440           if (exists $self->{_ignore_at_insert}{$relname}) {
441             MULTICREATE_DEBUG and warn "MC $self skipping post-insert on $relname";
442           }
443           else {
444             MULTICREATE_DEBUG and warn "MC $self inserting $relname $obj";
445             $obj->insert;
446           }
447         } else {
448           MULTICREATE_DEBUG and warn "MC $self post-inserting $obj";
449           $obj->insert();
450         }
451       }
452     }
453   }
454
455   delete $self->{_ignore_at_insert};
456
457   $rollback_guard->commit if $rollback_guard;
458
459   return $self;
460 }
461
462 =head2 in_storage
463
464   $row->in_storage; # Get value
465   $row->in_storage(1); # Set value
466
467 =over
468
469 =item Arguments: none or 1|0
470
471 =item Return Value: 1|0
472
473 =back
474
475 Indicates whether the object exists as a row in the database or
476 not. This is set to true when L<DBIx::Class::ResultSet/find>,
477 L<DBIx::Class::ResultSet/create> or L<DBIx::Class::ResultSet/insert>
478 are used.
479
480 Creating a result object using L<DBIx::Class::ResultSet/new_result>, or
481 calling L</delete> on one, sets it to false.
482
483 =cut
484
485 sub in_storage {
486   my ($self, $val) = @_;
487   $self->{_in_storage} = $val if @_ > 1;
488   return $self->{_in_storage} ? 1 : 0;
489 }
490
491 =head2 update
492
493   $row->update(\%columns?)
494
495 =over
496
497 =item Arguments: none or a hashref
498
499 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
500
501 =back
502
503 Throws an exception if the result object is not yet in the database,
504 according to L</in_storage>.
505
506 This method issues an SQL UPDATE query to commit any changes to the
507 object to the database if required (see L</get_dirty_columns>).
508 It throws an exception if a proper WHERE clause uniquely identifying
509 the database row can not be constructed (see
510 L<significance of primary keys|DBIx::Class::Manual::Intro/The Significance and Importance of Primary Keys>
511 for more details).
512
513 Also takes an optional hashref of C<< column_name => value >> pairs
514 to update on the object first. Be aware that the hashref will be
515 passed to C<set_inflated_columns>, which might edit it in place, so
516 don't rely on it being the same after a call to C<update>.  If you
517 need to preserve the hashref, it is sufficient to pass a shallow copy
518 to C<update>, e.g. ( { %{ $href } } )
519
520 If the values passed or any of the column values set on the object
521 contain scalar references, e.g.:
522
523   $row->last_modified(\'NOW()')->update();
524   # OR
525   $row->update({ last_modified => \'NOW()' });
526
527 The update will pass the values verbatim into SQL. (See
528 L<SQL::Abstract> docs).  The values in your Result object will NOT change
529 as a result of the update call, if you want the object to be updated
530 with the actual values from the database, call L</discard_changes>
531 after the update.
532
533   $row->update()->discard_changes();
534
535 To determine before calling this method, which column values have
536 changed and will be updated, call L</get_dirty_columns>.
537
538 To check if any columns will be updated, call L</is_changed>.
539
540 To force a column to be updated, call L</make_column_dirty> before
541 this method.
542
543 =cut
544
545 sub update {
546   my ($self, $upd) = @_;
547
548   $self->set_inflated_columns($upd) if $upd;
549
550   my %to_update = $self->get_dirty_columns
551     or return $self;
552
553   $self->throw_exception( "Not in database" ) unless $self->in_storage;
554
555   my $rows = $self->result_source->storage->update(
556     $self->result_source, \%to_update, $self->_storage_ident_condition
557   );
558   if ($rows == 0) {
559     $self->throw_exception( "Can't update ${self}: row not found" );
560   } elsif ($rows > 1) {
561     $self->throw_exception("Can't update ${self}: updated more than one row");
562   }
563   $self->{_dirty_columns} = {};
564   $self->{related_resultsets} = {};
565   delete $self->{_column_data_in_storage};
566   return $self;
567 }
568
569 =head2 delete
570
571   $row->delete
572
573 =over
574
575 =item Arguments: none
576
577 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
578
579 =back
580
581 Throws an exception if the object is not in the database according to
582 L</in_storage>. Also throws an exception if a proper WHERE clause
583 uniquely identifying the database row can not be constructed (see
584 L<significance of primary keys|DBIx::Class::Manual::Intro/The Significance and Importance of Primary Keys>
585 for more details).
586
587 The object is still perfectly usable, but L</in_storage> will
588 now return 0 and the object must be reinserted using L</insert>
589 before it can be used to L</update> the row again.
590
591 If you delete an object in a class with a C<has_many> relationship, an
592 attempt is made to delete all the related objects as well. To turn
593 this behaviour off, pass C<< cascade_delete => 0 >> in the C<$attr>
594 hashref of the relationship, see L<DBIx::Class::Relationship>. Any
595 database-level cascade or restrict will take precedence over a
596 DBIx-Class-based cascading delete, since DBIx-Class B<deletes the
597 main row first> and only then attempts to delete any remaining related
598 rows.
599
600 If you delete an object within a txn_do() (see L<DBIx::Class::Storage/txn_do>)
601 and the transaction subsequently fails, the result object will remain marked as
602 not being in storage. If you know for a fact that the object is still in
603 storage (i.e. by inspecting the cause of the transaction's failure), you can
604 use C<< $obj->in_storage(1) >> to restore consistency between the object and
605 the database. This would allow a subsequent C<< $obj->delete >> to work
606 as expected.
607
608 See also L<DBIx::Class::ResultSet/delete>.
609
610 =cut
611
612 sub delete {
613   my $self = shift;
614   if (ref $self) {
615     $self->throw_exception( "Not in database" ) unless $self->in_storage;
616
617     $self->result_source->storage->delete(
618       $self->result_source, $self->_storage_ident_condition
619     );
620
621     delete $self->{_column_data_in_storage};
622     $self->in_storage(undef);
623   }
624   else {
625     my $rsrc = try { $self->result_source_instance }
626       or $self->throw_exception("Can't do class delete without a ResultSource instance");
627
628     my $attrs = @_ > 1 && ref $_[$#_] eq 'HASH' ? { %{pop(@_)} } : {};
629     my $query = ref $_[0] eq 'HASH' ? $_[0] : {@_};
630     $rsrc->resultset->search(@_)->delete;
631   }
632   return $self;
633 }
634
635 =head2 get_column
636
637   my $val = $row->get_column($col);
638
639 =over
640
641 =item Arguments: $columnname
642
643 =item Return Value: The value of the column
644
645 =back
646
647 Throws an exception if the column name given doesn't exist according
648 to L<has_column|DBIx::Class::ResultSource/has_column>.
649
650 Returns a raw column value from the result object, if it has already
651 been fetched from the database or set by an accessor.
652
653 If an L<inflated value|DBIx::Class::InflateColumn> has been set, it
654 will be deflated and returned.
655
656 Note that if you used the C<columns> or the C<select/as>
657 L<search attributes|DBIx::Class::ResultSet/ATTRIBUTES> on the resultset from
658 which C<$row> was derived, and B<did not include> C<$columnname> in the list,
659 this method will return C<undef> even if the database contains some value.
660
661 To retrieve all loaded column values as a hash, use L</get_columns>.
662
663 =cut
664
665 sub get_column {
666   my ($self, $column) = @_;
667   $self->throw_exception( "Can't fetch data as class method" ) unless ref $self;
668   return $self->{_column_data}{$column} if exists $self->{_column_data}{$column};
669   if (exists $self->{_inflated_column}{$column}) {
670     return $self->store_column($column,
671       $self->_deflated_column($column, $self->{_inflated_column}{$column}));
672   }
673   $self->throw_exception( "No such column '${column}'" ) unless $self->has_column($column);
674   return undef;
675 }
676
677 =head2 has_column_loaded
678
679   if ( $row->has_column_loaded($col) ) {
680      print "$col has been loaded from db";
681   }
682
683 =over
684
685 =item Arguments: $columnname
686
687 =item Return Value: 0|1
688
689 =back
690
691 Returns a true value if the column value has been loaded from the
692 database (or set locally).
693
694 =cut
695
696 sub has_column_loaded {
697   my ($self, $column) = @_;
698   $self->throw_exception( "Can't call has_column data as class method" ) unless ref $self;
699   return 1 if exists $self->{_inflated_column}{$column};
700   return exists $self->{_column_data}{$column};
701 }
702
703 =head2 get_columns
704
705   my %data = $row->get_columns;
706
707 =over
708
709 =item Arguments: none
710
711 =item Return Value: A hash of columnname, value pairs.
712
713 =back
714
715 Returns all loaded column data as a hash, containing raw values. To
716 get just one value for a particular column, use L</get_column>.
717
718 See L</get_inflated_columns> to get the inflated values.
719
720 =cut
721
722 sub get_columns {
723   my $self = shift;
724   if (exists $self->{_inflated_column}) {
725     foreach my $col (keys %{$self->{_inflated_column}}) {
726       $self->store_column($col, $self->_deflated_column($col, $self->{_inflated_column}{$col}))
727         unless exists $self->{_column_data}{$col};
728     }
729   }
730   return %{$self->{_column_data}};
731 }
732
733 =head2 get_dirty_columns
734
735   my %data = $row->get_dirty_columns;
736
737 =over
738
739 =item Arguments: none
740
741 =item Return Value: A hash of column, value pairs
742
743 =back
744
745 Only returns the column, value pairs for those columns that have been
746 changed on this object since the last L</update> or L</insert> call.
747
748 See L</get_columns> to fetch all column/value pairs.
749
750 =cut
751
752 sub get_dirty_columns {
753   my $self = shift;
754   return map { $_ => $self->{_column_data}{$_} }
755            keys %{$self->{_dirty_columns}};
756 }
757
758 =head2 make_column_dirty
759
760   $row->make_column_dirty($col)
761
762 =over
763
764 =item Arguments: $columnname
765
766 =item Return Value: not defined
767
768 =back
769
770 Throws an exception if the column does not exist.
771
772 Marks a column as having been changed regardless of whether it has
773 really changed.
774
775 =cut
776 sub make_column_dirty {
777   my ($self, $column) = @_;
778
779   $self->throw_exception( "No such column '${column}'" )
780     unless exists $self->{_column_data}{$column} || $self->has_column($column);
781
782   # the entire clean/dirty code relies on exists, not on true/false
783   return 1 if exists $self->{_dirty_columns}{$column};
784
785   $self->{_dirty_columns}{$column} = 1;
786
787   # if we are just now making the column dirty, and if there is an inflated
788   # value, force it over the deflated one
789   if (exists $self->{_inflated_column}{$column}) {
790     $self->store_column($column,
791       $self->_deflated_column(
792         $column, $self->{_inflated_column}{$column}
793       )
794     );
795   }
796 }
797
798 =head2 get_inflated_columns
799
800   my %inflated_data = $obj->get_inflated_columns;
801
802 =over
803
804 =item Arguments: none
805
806 =item Return Value: A hash of column, object|value pairs
807
808 =back
809
810 Returns a hash of all column keys and associated values. Values for any
811 columns set to use inflation will be inflated and returns as objects.
812
813 See L</get_columns> to get the uninflated values.
814
815 See L<DBIx::Class::InflateColumn> for how to setup inflation.
816
817 =cut
818
819 sub get_inflated_columns {
820   my $self = shift;
821
822   my $loaded_colinfo = $self->columns_info ([
823     grep { $self->has_column_loaded($_) } $self->columns
824   ]);
825
826   my %inflated;
827   for my $col (keys %$loaded_colinfo) {
828     if (exists $loaded_colinfo->{$col}{accessor}) {
829       my $acc = $loaded_colinfo->{$col}{accessor};
830       $inflated{$col} = $self->$acc if defined $acc;
831     }
832     else {
833       $inflated{$col} = $self->$col;
834     }
835   }
836
837   # return all loaded columns with the inflations overlayed on top
838   return %{ { $self->get_columns, %inflated } };
839 }
840
841 sub _is_column_numeric {
842    my ($self, $column) = @_;
843     my $colinfo = $self->column_info ($column);
844
845     # cache for speed (the object may *not* have a resultsource instance)
846     if (
847       ! defined $colinfo->{is_numeric}
848         and
849       my $storage = try { $self->result_source->schema->storage }
850     ) {
851       $colinfo->{is_numeric} =
852         $storage->is_datatype_numeric ($colinfo->{data_type})
853           ? 1
854           : 0
855         ;
856     }
857
858     return $colinfo->{is_numeric};
859 }
860
861 =head2 set_column
862
863   $row->set_column($col => $val);
864
865 =over
866
867 =item Arguments: $columnname, $value
868
869 =item Return Value: $value
870
871 =back
872
873 Sets a raw column value. If the new value is different from the old one,
874 the column is marked as dirty for when you next call L</update>.
875
876 If passed an object or reference as a value, this method will happily
877 attempt to store it, and a later L</insert> or L</update> will try and
878 stringify/numify as appropriate. To set an object to be deflated
879 instead, see L</set_inflated_columns>, or better yet, use L</$column_accessor>.
880
881 =cut
882
883 sub set_column {
884   my ($self, $column, $new_value) = @_;
885
886   my $had_value = $self->has_column_loaded($column);
887   my ($old_value, $in_storage) = ($self->get_column($column), $self->in_storage)
888     if $had_value;
889
890   $new_value = $self->store_column($column, $new_value);
891
892   my $dirty =
893     $self->{_dirty_columns}{$column}
894       ||
895     $in_storage # no point tracking dirtyness on uninserted data
896       ? ! $self->_eq_column_values ($column, $old_value, $new_value)
897       : 1
898   ;
899
900   if ($dirty) {
901     # FIXME sadly the update code just checks for keys, not for their value
902     $self->{_dirty_columns}{$column} = 1;
903
904     # Clear out the relation/inflation cache related to this column
905     #
906     # FIXME - this is a quick *largely incorrect* hack, pending a more
907     # serious rework during the merge of single and filter rels
908     my $rels = $self->result_source->{_relationships};
909     for my $rel (keys %$rels) {
910
911       my $acc = $rels->{$rel}{attrs}{accessor} || '';
912
913       if ( $acc eq 'single' and $rels->{$rel}{attrs}{fk_columns}{$column} ) {
914         delete $self->{related_resultsets}{$rel};
915         delete $self->{_relationship_data}{$rel};
916         #delete $self->{_inflated_column}{$rel};
917       }
918       elsif ( $acc eq 'filter' and $rel eq $column) {
919         delete $self->{related_resultsets}{$rel};
920         #delete $self->{_relationship_data}{$rel};
921         delete $self->{_inflated_column}{$rel};
922       }
923     }
924
925     if (
926       # value change from something (even if NULL)
927       $had_value
928         and
929       # no storage - no storage-value
930       $in_storage
931         and
932       # no value already stored (multiple changes before commit to storage)
933       ! exists $self->{_column_data_in_storage}{$column}
934         and
935       $self->_track_storage_value($column)
936     ) {
937       $self->{_column_data_in_storage}{$column} = $old_value;
938     }
939   }
940
941   return $new_value;
942 }
943
944 sub _eq_column_values {
945   my ($self, $col, $old, $new) = @_;
946
947   if (defined $old xor defined $new) {
948     return 0;
949   }
950   elsif (not defined $old) {  # both undef
951     return 1;
952   }
953   elsif ($old eq $new) {
954     return 1;
955   }
956   elsif ($self->_is_column_numeric($col)) {  # do a numeric comparison if datatype allows it
957     return $old == $new;
958   }
959   else {
960     return 0;
961   }
962 }
963
964 # returns a boolean indicating if the passed column should have its original
965 # value tracked between column changes and commitment to storage
966 sub _track_storage_value {
967   my ($self, $col) = @_;
968   return defined first { $col eq $_ } ($self->primary_columns);
969 }
970
971 =head2 set_columns
972
973   $row->set_columns({ $col => $val, ... });
974
975 =over
976
977 =item Arguments: \%columndata
978
979 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
980
981 =back
982
983 Sets multiple column, raw value pairs at once.
984
985 Works as L</set_column>.
986
987 =cut
988
989 sub set_columns {
990   my ($self,$data) = @_;
991   foreach my $col (keys %$data) {
992     $self->set_column($col,$data->{$col});
993   }
994   return $self;
995 }
996
997 =head2 set_inflated_columns
998
999   $row->set_inflated_columns({ $col => $val, $relname => $obj, ... });
1000
1001 =over
1002
1003 =item Arguments: \%columndata
1004
1005 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
1006
1007 =back
1008
1009 Sets more than one column value at once. Any inflated values are
1010 deflated and the raw values stored.
1011
1012 Any related values passed as Result objects, using the relation name as a
1013 key, are reduced to the appropriate foreign key values and stored. If
1014 instead of related result objects, a hashref of column, value data is
1015 passed, will create the related object first then store.
1016
1017 Will even accept arrayrefs of data as a value to a
1018 L<DBIx::Class::Relationship/has_many> key, and create the related
1019 objects if necessary.
1020
1021 Be aware that the input hashref might be edited in place, so don't rely
1022 on it being the same after a call to C<set_inflated_columns>. If you
1023 need to preserve the hashref, it is sufficient to pass a shallow copy
1024 to C<set_inflated_columns>, e.g. ( { %{ $href } } )
1025
1026 See also L<DBIx::Class::Relationship::Base/set_from_related>.
1027
1028 =cut
1029
1030 sub set_inflated_columns {
1031   my ( $self, $upd ) = @_;
1032   foreach my $key (keys %$upd) {
1033     if (ref $upd->{$key}) {
1034       my $info = $self->relationship_info($key);
1035       my $acc_type = $info->{attrs}{accessor} || '';
1036       if ($acc_type eq 'single') {
1037         my $rel = delete $upd->{$key};
1038         $self->set_from_related($key => $rel);
1039         $self->{_relationship_data}{$key} = $rel;
1040       }
1041       elsif ($acc_type eq 'multi') {
1042         $self->throw_exception(
1043           "Recursive update is not supported over relationships of type '$acc_type' ($key)"
1044         );
1045       }
1046       elsif ($self->has_column($key) && exists $self->column_info($key)->{_inflate_info}) {
1047         $self->set_inflated_column($key, delete $upd->{$key});
1048       }
1049     }
1050   }
1051   $self->set_columns($upd);
1052 }
1053
1054 =head2 copy
1055
1056   my $copy = $orig->copy({ change => $to, ... });
1057
1058 =over
1059
1060 =item Arguments: \%replacementdata
1061
1062 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass> copy
1063
1064 =back
1065
1066 Inserts a new row into the database, as a copy of the original
1067 object. If a hashref of replacement data is supplied, these will take
1068 precedence over data in the original. Also any columns which have
1069 the L<column info attribute|DBIx::Class::ResultSource/add_columns>
1070 C<< is_auto_increment => 1 >> are explicitly removed before the copy,
1071 so that the database can insert its own autoincremented values into
1072 the new object.
1073
1074 Relationships will be followed by the copy procedure B<only> if the
1075 relationship specifies a true value for its
1076 L<cascade_copy|DBIx::Class::Relationship::Base> attribute. C<cascade_copy>
1077 is set by default on C<has_many> relationships and unset on all others.
1078
1079 =cut
1080
1081 sub copy {
1082   my ($self, $changes) = @_;
1083   $changes ||= {};
1084   my $col_data = { %{$self->{_column_data}} };
1085
1086   my $colinfo = $self->columns_info([ keys %$col_data ]);
1087   foreach my $col (keys %$col_data) {
1088     delete $col_data->{$col}
1089       if $colinfo->{$col}{is_auto_increment};
1090   }
1091
1092   my $new = { _column_data => $col_data };
1093   bless $new, ref $self;
1094
1095   $new->result_source($self->result_source);
1096   $new->set_inflated_columns($changes);
1097   $new->insert;
1098
1099   # Its possible we'll have 2 relations to the same Source. We need to make
1100   # sure we don't try to insert the same row twice else we'll violate unique
1101   # constraints
1102   my $rels_copied = {};
1103
1104   foreach my $rel ($self->result_source->relationships) {
1105     my $rel_info = $self->result_source->relationship_info($rel);
1106
1107     next unless $rel_info->{attrs}{cascade_copy};
1108
1109     my $resolved = $self->result_source->_resolve_condition(
1110       $rel_info->{cond}, $rel, $new, $rel
1111     );
1112
1113     my $copied = $rels_copied->{ $rel_info->{source} } ||= {};
1114     foreach my $related ($self->search_related($rel)) {
1115       my $id_str = join("\0", $related->id);
1116       next if $copied->{$id_str};
1117       $copied->{$id_str} = 1;
1118       my $rel_copy = $related->copy($resolved);
1119     }
1120
1121   }
1122   return $new;
1123 }
1124
1125 =head2 store_column
1126
1127   $row->store_column($col => $val);
1128
1129 =over
1130
1131 =item Arguments: $columnname, $value
1132
1133 =item Return Value: The value sent to storage
1134
1135 =back
1136
1137 Set a raw value for a column without marking it as changed. This
1138 method is used internally by L</set_column> which you should probably
1139 be using.
1140
1141 This is the lowest level at which data is set on a result object,
1142 extend this method to catch all data setting methods.
1143
1144 =cut
1145
1146 sub store_column {
1147   my ($self, $column, $value) = @_;
1148   $self->throw_exception( "No such column '${column}'" )
1149     unless exists $self->{_column_data}{$column} || $self->has_column($column);
1150   $self->throw_exception( "set_column called for ${column} without value" )
1151     if @_ < 3;
1152   return $self->{_column_data}{$column} = $value;
1153 }
1154
1155 =head2 inflate_result
1156
1157   Class->inflate_result($result_source, \%me, \%prefetch?)
1158
1159 =over
1160
1161 =item Arguments: L<$result_source|DBIx::Class::ResultSource>, \%columndata, \%prefetcheddata
1162
1163 =item Return Value: L<$result|DBIx::Class::Manual::ResultClass>
1164
1165 =back
1166
1167 All L<DBIx::Class::ResultSet> methods that retrieve data from the
1168 database and turn it into result objects call this method.
1169
1170 Extend this method in your Result classes to hook into this process,
1171 for example to rebless the result into a different class.
1172
1173 Reblessing can also be done more easily by setting C<result_class> in
1174 your Result class. See L<DBIx::Class::ResultSource/result_class>.
1175
1176 Different types of results can also be created from a particular
1177 L<DBIx::Class::ResultSet>, see L<DBIx::Class::ResultSet/result_class>.
1178
1179 =cut
1180
1181 sub inflate_result {
1182   my ($class, $source, $me, $prefetch) = @_;
1183
1184   $source = $source->resolve
1185     if $source->isa('DBIx::Class::ResultSourceHandle');
1186
1187   my $new = bless
1188     { _column_data => $me, _result_source => $source },
1189     ref $class || $class
1190   ;
1191
1192   foreach my $pre (keys %{$prefetch||{}}) {
1193
1194     my (@pre_vals, $is_multi);
1195     if (ref $prefetch->{$pre}[0] eq 'ARRAY') {
1196       $is_multi = 1;
1197       @pre_vals = @{$prefetch->{$pre}};
1198     }
1199     else {
1200       @pre_vals = $prefetch->{$pre};
1201     }
1202
1203     my $pre_source = try {
1204       $source->related_source($pre)
1205     }
1206     catch {
1207       $class->throw_exception(sprintf
1208
1209         "Can't inflate manual prefetch into non-existent relationship '%s' from '%s', "
1210       . "check the inflation specification (columns/as) ending in '%s.%s'.",
1211
1212         $pre,
1213         $source->source_name,
1214         $pre,
1215         (keys %{$pre_vals[0][0]})[0] || 'something.something...',
1216       );
1217     };
1218
1219     my $accessor = $source->relationship_info($pre)->{attrs}{accessor}
1220       or $class->throw_exception("No accessor type declared for prefetched $pre");
1221
1222     if (! $is_multi and $accessor eq 'multi') {
1223       $class->throw_exception("Manual prefetch (via select/columns) not supported with accessor 'multi'");
1224     }
1225
1226     my @pre_objects;
1227     for my $me_pref (@pre_vals) {
1228
1229         # FIXME - this should not be necessary
1230         # the collapser currently *could* return bogus elements with all
1231         # columns set to undef
1232         my $has_def;
1233         for (values %{$me_pref->[0]}) {
1234           if (defined $_) {
1235             $has_def++;
1236             last;
1237           }
1238         }
1239         next unless $has_def;
1240
1241         push @pre_objects, $pre_source->result_class->inflate_result(
1242           $pre_source, @$me_pref
1243         );
1244     }
1245
1246     if ($accessor eq 'single') {
1247       $new->{_relationship_data}{$pre} = $pre_objects[0];
1248     }
1249     elsif ($accessor eq 'filter') {
1250       $new->{_inflated_column}{$pre} = $pre_objects[0];
1251     }
1252
1253     $new->related_resultset($pre)->set_cache(\@pre_objects);
1254   }
1255
1256   $new->in_storage (1);
1257   return $new;
1258 }
1259
1260 =head2 update_or_insert
1261
1262   $row->update_or_insert
1263
1264 =over
1265
1266 =item Arguments: none
1267
1268 =item Return Value: Result of update or insert operation
1269
1270 =back
1271
1272 L</Update>s the object if it's already in the database, according to
1273 L</in_storage>, else L</insert>s it.
1274
1275 =head2 insert_or_update
1276
1277   $obj->insert_or_update
1278
1279 Alias for L</update_or_insert>
1280
1281 =cut
1282
1283 sub insert_or_update { shift->update_or_insert(@_) }
1284
1285 sub update_or_insert {
1286   my $self = shift;
1287   return ($self->in_storage ? $self->update : $self->insert);
1288 }
1289
1290 =head2 is_changed
1291
1292   my @changed_col_names = $row->is_changed();
1293   if ($row->is_changed()) { ... }
1294
1295 =over
1296
1297 =item Arguments: none
1298
1299 =item Return Value: 0|1 or @columnnames
1300
1301 =back
1302
1303 In list context returns a list of columns with uncommited changes, or
1304 in scalar context returns a true value if there are uncommitted
1305 changes.
1306
1307 =cut
1308
1309 sub is_changed {
1310   return keys %{shift->{_dirty_columns} || {}};
1311 }
1312
1313 =head2 is_column_changed
1314
1315   if ($row->is_column_changed('col')) { ... }
1316
1317 =over
1318
1319 =item Arguments: $columname
1320
1321 =item Return Value: 0|1
1322
1323 =back
1324
1325 Returns a true value if the column has uncommitted changes.
1326
1327 =cut
1328
1329 sub is_column_changed {
1330   my( $self, $col ) = @_;
1331   return exists $self->{_dirty_columns}->{$col};
1332 }
1333
1334 =head2 result_source
1335
1336   my $resultsource = $row->result_source;
1337
1338 =over
1339
1340 =item Arguments: L<$result_source?|DBIx::Class::ResultSource>
1341
1342 =item Return Value: L<$result_source|DBIx::Class::ResultSource>
1343
1344 =back
1345
1346 Accessor to the L<DBIx::Class::ResultSource> this object was created from.
1347
1348 =cut
1349
1350 sub result_source {
1351   $_[0]->throw_exception( 'result_source can be called on instances only' )
1352     unless ref $_[0];
1353
1354   @_ > 1
1355     ? $_[0]->{_result_source} = $_[1]
1356
1357     # note this is a || not a ||=, the difference is important
1358     : $_[0]->{_result_source} || do {
1359         my $class = ref $_[0];
1360         $_[0]->can('result_source_instance')
1361           ? $_[0]->result_source_instance
1362           : $_[0]->throw_exception(
1363             "No result source instance registered for $class, did you forget to call $class->table(...) ?"
1364           )
1365       }
1366   ;
1367 }
1368
1369 =head2 register_column
1370
1371   $column_info = { .... };
1372   $class->register_column($column_name, $column_info);
1373
1374 =over
1375
1376 =item Arguments: $columnname, \%columninfo
1377
1378 =item Return Value: not defined
1379
1380 =back
1381
1382 Registers a column on the class. If the column_info has an 'accessor'
1383 key, creates an accessor named after the value if defined; if there is
1384 no such key, creates an accessor with the same name as the column
1385
1386 The column_info attributes are described in
1387 L<DBIx::Class::ResultSource/add_columns>
1388
1389 =cut
1390
1391 sub register_column {
1392   my ($class, $col, $info) = @_;
1393   my $acc = $col;
1394   if (exists $info->{accessor}) {
1395     return unless defined $info->{accessor};
1396     $acc = [ $info->{accessor}, $col ];
1397   }
1398   $class->mk_group_accessors('column' => $acc);
1399 }
1400
1401 =head2 get_from_storage
1402
1403   my $copy = $row->get_from_storage($attrs)
1404
1405 =over
1406
1407 =item Arguments: \%attrs
1408
1409 =item Return Value: A Result object
1410
1411 =back
1412
1413 Fetches a fresh copy of the Result object from the database and returns it.
1414 Throws an exception if a proper WHERE clause identifying the database row
1415 can not be constructed (i.e. if the original object does not contain its
1416 entire
1417  L<primary key|DBIx::Class::Manual::Intro/The Significance and Importance of Primary Keys>
1418 ). If passed the \%attrs argument, will first apply these attributes to
1419 the resultset used to find the row.
1420
1421 This copy can then be used to compare to an existing result object, to
1422 determine if any changes have been made in the database since it was
1423 created.
1424
1425 To just update your Result object with any latest changes from the
1426 database, use L</discard_changes> instead.
1427
1428 The \%attrs argument should be compatible with
1429 L<DBIx::Class::ResultSet/ATTRIBUTES>.
1430
1431 =cut
1432
1433 sub get_from_storage {
1434     my $self = shift @_;
1435     my $attrs = shift @_;
1436     my $resultset = $self->result_source->resultset;
1437
1438     if(defined $attrs) {
1439       $resultset = $resultset->search(undef, $attrs);
1440     }
1441
1442     return $resultset->find($self->_storage_ident_condition);
1443 }
1444
1445 =head2 discard_changes
1446
1447   $row->discard_changes
1448
1449 =over
1450
1451 =item Arguments: none or $attrs
1452
1453 =item Return Value: self (updates object in-place)
1454
1455 =back
1456
1457 Re-selects the row from the database, losing any changes that had
1458 been made. Throws an exception if a proper C<WHERE> clause identifying
1459 the database row can not be constructed (i.e. if the original object
1460 does not contain its entire
1461 L<primary key|DBIx::Class::Manual::Intro/The Significance and Importance of Primary Keys>).
1462
1463 This method can also be used to refresh from storage, retrieving any
1464 changes made since the row was last read from storage.
1465
1466 $attrs, if supplied, is expected to be a hashref of attributes suitable for passing as the
1467 second argument to C<< $resultset->search($cond, $attrs) >>;
1468
1469 Note: If you are using L<DBIx::Class::Storage::DBI::Replicated> as your
1470 storage, please kept in mind that if you L</discard_changes> on a row that you
1471 just updated or created, you should wrap the entire bit inside a transaction.
1472 Otherwise you run the risk that you insert or update to the master database
1473 but read from a replicant database that has not yet been updated from the
1474 master.  This will result in unexpected results.
1475
1476 =cut
1477
1478 sub discard_changes {
1479   my ($self, $attrs) = @_;
1480   return unless $self->in_storage; # Don't reload if we aren't real!
1481
1482   # add a replication default to read from the master only
1483   $attrs = { force_pool => 'master', %{$attrs||{}} };
1484
1485   if( my $current_storage = $self->get_from_storage($attrs)) {
1486
1487     # Set $self to the current.
1488     %$self = %$current_storage;
1489
1490     # Avoid a possible infinite loop with
1491     # sub DESTROY { $_[0]->discard_changes }
1492     bless $current_storage, 'Do::Not::Exist';
1493
1494     return $self;
1495   }
1496   else {
1497     $self->in_storage(0);
1498     return $self;
1499   }
1500 }
1501
1502 =head2 throw_exception
1503
1504 See L<DBIx::Class::Schema/throw_exception>.
1505
1506 =cut
1507
1508 sub throw_exception {
1509   my $self=shift;
1510
1511   if (ref $self && ref $self->result_source ) {
1512     $self->result_source->throw_exception(@_)
1513   }
1514   else {
1515     DBIx::Class::Exception->throw(@_);
1516   }
1517 }
1518
1519 =head2 id
1520
1521   my @pk = $row->id;
1522
1523 =over
1524
1525 =item Arguments: none
1526
1527 =item Returns: A list of primary key values
1528
1529 =back
1530
1531 Returns the primary key(s) for a row. Can't be called as a class method.
1532 Actually implemented in L<DBIx::Class::PK>
1533
1534 =head1 AUTHOR AND CONTRIBUTORS
1535
1536 See L<AUTHOR|DBIx::Class/AUTHOR> and L<CONTRIBUTORS|DBIx::Class/CONTRIBUTORS> in DBIx::Class
1537
1538 =head1 LICENSE
1539
1540 You may distribute this code under the same terms as Perl itself.
1541
1542 =cut
1543
1544 1;