Restore ability to handle underdefined root (t/prefetch/incomplete.t)
[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;
1195     @pre_vals = (ref $prefetch->{$pre}[0] eq 'ARRAY')
1196       ? @{$prefetch->{$pre}} : $prefetch->{$pre}
1197     if @{$prefetch->{$pre}};
1198
1199     my $pre_source = $source->related_source($pre);
1200
1201     my $accessor = $source->relationship_info($pre)->{attrs}{accessor}
1202       or $class->throw_exception("No accessor type declared for prefetched relationship '$pre'");
1203
1204     my @pre_objects;
1205     for my $me_pref (@pre_vals) {
1206
1207       # FIXME SUBOPTIMAL - the new row parsers can very well optimize
1208       # this away entirely, and *never* return such empty rows.
1209       # For now we maintain inflate_result API backcompat, see
1210       # t/resultset/inflate_result_api.t
1211       next unless defined first { defined $_ } values %{$me_pref->[0]};
1212
1213       push @pre_objects, $pre_source->result_class->inflate_result(
1214         $pre_source, @$me_pref
1215       );
1216     }
1217
1218     if ($accessor eq 'single') {
1219       $new->{_relationship_data}{$pre} = $pre_objects[0];
1220     }
1221     elsif ($accessor eq 'filter') {
1222       $new->{_inflated_column}{$pre} = $pre_objects[0];
1223     }
1224
1225     $new->related_resultset($pre)->set_cache(\@pre_objects);
1226   }
1227
1228   $new->in_storage (1);
1229   return $new;
1230 }
1231
1232 =head2 update_or_insert
1233
1234   $row->update_or_insert
1235
1236 =over
1237
1238 =item Arguments: none
1239
1240 =item Return Value: Result of update or insert operation
1241
1242 =back
1243
1244 L</Update>s the object if it's already in the database, according to
1245 L</in_storage>, else L</insert>s it.
1246
1247 =head2 insert_or_update
1248
1249   $obj->insert_or_update
1250
1251 Alias for L</update_or_insert>
1252
1253 =cut
1254
1255 sub insert_or_update { shift->update_or_insert(@_) }
1256
1257 sub update_or_insert {
1258   my $self = shift;
1259   return ($self->in_storage ? $self->update : $self->insert);
1260 }
1261
1262 =head2 is_changed
1263
1264   my @changed_col_names = $row->is_changed();
1265   if ($row->is_changed()) { ... }
1266
1267 =over
1268
1269 =item Arguments: none
1270
1271 =item Return Value: 0|1 or @columnnames
1272
1273 =back
1274
1275 In list context returns a list of columns with uncommited changes, or
1276 in scalar context returns a true value if there are uncommitted
1277 changes.
1278
1279 =cut
1280
1281 sub is_changed {
1282   return keys %{shift->{_dirty_columns} || {}};
1283 }
1284
1285 =head2 is_column_changed
1286
1287   if ($row->is_column_changed('col')) { ... }
1288
1289 =over
1290
1291 =item Arguments: $columname
1292
1293 =item Return Value: 0|1
1294
1295 =back
1296
1297 Returns a true value if the column has uncommitted changes.
1298
1299 =cut
1300
1301 sub is_column_changed {
1302   my( $self, $col ) = @_;
1303   return exists $self->{_dirty_columns}->{$col};
1304 }
1305
1306 =head2 result_source
1307
1308   my $resultsource = $row->result_source;
1309
1310 =over
1311
1312 =item Arguments: L<$result_source?|DBIx::Class::ResultSource>
1313
1314 =item Return Value: L<$result_source|DBIx::Class::ResultSource>
1315
1316 =back
1317
1318 Accessor to the L<DBIx::Class::ResultSource> this object was created from.
1319
1320 =cut
1321
1322 sub result_source {
1323   $_[0]->throw_exception( 'result_source can be called on instances only' )
1324     unless ref $_[0];
1325
1326   @_ > 1
1327     ? $_[0]->{_result_source} = $_[1]
1328
1329     # note this is a || not a ||=, the difference is important
1330     : $_[0]->{_result_source} || do {
1331         my $class = ref $_[0];
1332         $_[0]->can('result_source_instance')
1333           ? $_[0]->result_source_instance
1334           : $_[0]->throw_exception(
1335             "No result source instance registered for $class, did you forget to call $class->table(...) ?"
1336           )
1337       }
1338   ;
1339 }
1340
1341 =head2 register_column
1342
1343   $column_info = { .... };
1344   $class->register_column($column_name, $column_info);
1345
1346 =over
1347
1348 =item Arguments: $columnname, \%columninfo
1349
1350 =item Return Value: not defined
1351
1352 =back
1353
1354 Registers a column on the class. If the column_info has an 'accessor'
1355 key, creates an accessor named after the value if defined; if there is
1356 no such key, creates an accessor with the same name as the column
1357
1358 The column_info attributes are described in
1359 L<DBIx::Class::ResultSource/add_columns>
1360
1361 =cut
1362
1363 sub register_column {
1364   my ($class, $col, $info) = @_;
1365   my $acc = $col;
1366   if (exists $info->{accessor}) {
1367     return unless defined $info->{accessor};
1368     $acc = [ $info->{accessor}, $col ];
1369   }
1370   $class->mk_group_accessors('column' => $acc);
1371 }
1372
1373 =head2 get_from_storage
1374
1375   my $copy = $row->get_from_storage($attrs)
1376
1377 =over
1378
1379 =item Arguments: \%attrs
1380
1381 =item Return Value: A Result object
1382
1383 =back
1384
1385 Fetches a fresh copy of the Result object from the database and returns it.
1386 Throws an exception if a proper WHERE clause identifying the database row
1387 can not be constructed (i.e. if the original object does not contain its
1388 entire
1389  L<primary key|DBIx::Class::Manual::Intro/The Significance and Importance of Primary Keys>
1390 ). If passed the \%attrs argument, will first apply these attributes to
1391 the resultset used to find the row.
1392
1393 This copy can then be used to compare to an existing result object, to
1394 determine if any changes have been made in the database since it was
1395 created.
1396
1397 To just update your Result object with any latest changes from the
1398 database, use L</discard_changes> instead.
1399
1400 The \%attrs argument should be compatible with
1401 L<DBIx::Class::ResultSet/ATTRIBUTES>.
1402
1403 =cut
1404
1405 sub get_from_storage {
1406     my $self = shift @_;
1407     my $attrs = shift @_;
1408     my $resultset = $self->result_source->resultset;
1409
1410     if(defined $attrs) {
1411       $resultset = $resultset->search(undef, $attrs);
1412     }
1413
1414     return $resultset->find($self->_storage_ident_condition);
1415 }
1416
1417 =head2 discard_changes
1418
1419   $row->discard_changes
1420
1421 =over
1422
1423 =item Arguments: none or $attrs
1424
1425 =item Return Value: self (updates object in-place)
1426
1427 =back
1428
1429 Re-selects the row from the database, losing any changes that had
1430 been made. Throws an exception if a proper C<WHERE> clause identifying
1431 the database row can not be constructed (i.e. if the original object
1432 does not contain its entire
1433 L<primary key|DBIx::Class::Manual::Intro/The Significance and Importance of Primary Keys>).
1434
1435 This method can also be used to refresh from storage, retrieving any
1436 changes made since the row was last read from storage.
1437
1438 $attrs, if supplied, is expected to be a hashref of attributes suitable for passing as the
1439 second argument to C<< $resultset->search($cond, $attrs) >>;
1440
1441 Note: If you are using L<DBIx::Class::Storage::DBI::Replicated> as your
1442 storage, please kept in mind that if you L</discard_changes> on a row that you
1443 just updated or created, you should wrap the entire bit inside a transaction.
1444 Otherwise you run the risk that you insert or update to the master database
1445 but read from a replicant database that has not yet been updated from the
1446 master.  This will result in unexpected results.
1447
1448 =cut
1449
1450 sub discard_changes {
1451   my ($self, $attrs) = @_;
1452   return unless $self->in_storage; # Don't reload if we aren't real!
1453
1454   # add a replication default to read from the master only
1455   $attrs = { force_pool => 'master', %{$attrs||{}} };
1456
1457   if( my $current_storage = $self->get_from_storage($attrs)) {
1458
1459     # Set $self to the current.
1460     %$self = %$current_storage;
1461
1462     # Avoid a possible infinite loop with
1463     # sub DESTROY { $_[0]->discard_changes }
1464     bless $current_storage, 'Do::Not::Exist';
1465
1466     return $self;
1467   }
1468   else {
1469     $self->in_storage(0);
1470     return $self;
1471   }
1472 }
1473
1474 =head2 throw_exception
1475
1476 See L<DBIx::Class::Schema/throw_exception>.
1477
1478 =cut
1479
1480 sub throw_exception {
1481   my $self=shift;
1482
1483   if (ref $self && ref $self->result_source ) {
1484     $self->result_source->throw_exception(@_)
1485   }
1486   else {
1487     DBIx::Class::Exception->throw(@_);
1488   }
1489 }
1490
1491 =head2 id
1492
1493   my @pk = $row->id;
1494
1495 =over
1496
1497 =item Arguments: none
1498
1499 =item Returns: A list of primary key values
1500
1501 =back
1502
1503 Returns the primary key(s) for a row. Can't be called as a class method.
1504 Actually implemented in L<DBIx::Class::PK>
1505
1506 =head1 AUTHOR AND CONTRIBUTORS
1507
1508 See L<AUTHOR|DBIx::Class/AUTHOR> and L<CONTRIBUTORS|DBIx::Class/CONTRIBUTORS> in DBIx::Class
1509
1510 =head1 LICENSE
1511
1512 You may distribute this code under the same terms as Perl itself.
1513
1514 =cut
1515
1516 1;