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