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