Merge 'bulk_create' into 'DBIx-Class-current'
Matt S Trout [Tue, 29 May 2007 01:08:17 +0000 (01:08 +0000)]
1  2 
lib/DBIx/Class/ResultSet.pm
lib/DBIx/Class/Row.pm

Simple merge
@@@ -97,8 -142,61 +142,64 @@@ sub insert 
      if $self->can('result_source_instance');
    $self->throw_exception("No result_source set on this object; can't insert")
      unless $source;
++  #use Data::Dumper; warn Dumper($self);
++  # Check if we stored uninserted relobjs here in new()
++  $source->storage->txn_begin if(!$self->{_rel_in_storage});
+   # Check if we stored uninserted relobjs here in new()
+   my %related_stuff = (%{$self->{_relationship_data} || {}}, 
+                        %{$self->{_inflated_column} || {}});
+   if(!$self->{_rel_in_storage})
+   {
+     $source->storage->txn_begin;
+     ## Should all be in relationship_data, but we need to get rid of the
+     ## 'filter' reltype..
+     ## These are the FK rels, need their IDs for the insert.
+     foreach my $relname (keys %related_stuff) {
+       my $rel_obj = $related_stuff{$relname};
+       if(Scalar::Util::blessed($rel_obj) && $rel_obj->isa('DBIx::Class::Row')) {
+         $rel_obj->insert();
+         $self->set_from_related($relname, $rel_obj);
+       }
+     }
+   }
  
    $source->storage->insert($source, { $self->get_columns });
+   ## PK::Auto
+   my ($pri, $too_many) = grep { !defined $self->get_column($_) || 
+                                     ref($self->get_column($_)) eq 'SCALAR'} $self->primary_columns;
+   if(defined $pri) {
+     $self->throw_exception( "More than one possible key found for auto-inc on ".ref $self )
+       if defined $too_many;
+     my $storage = $self->result_source->storage;
+     $self->throw_exception( "Missing primary key but Storage doesn't support last_insert_id" )
+       unless $storage->can('last_insert_id');
+     my $id = $storage->last_insert_id($self->result_source,$pri);
+     $self->throw_exception( "Can't get last insert id" ) unless $id;
+     $self->store_column($pri => $id);
+   }
+   if(!$self->{_rel_in_storage})
+   {
+     ## Now do the has_many rels, that need $selfs ID.
+     foreach my $relname (keys %related_stuff) {
+       my $relobj = $related_stuff{$relname};
+       if(ref $relobj eq 'ARRAY') {
+         foreach my $obj (@$relobj) {
+           my $info = $self->relationship_info($relname);
+           ## What about multi-col FKs ?
+           my $key = $1 if($info && (keys %{$info->{cond}})[0] =~ /^foreign\.(\w+)/);
+           $obj->set_from_related($key, $self);
+           $obj->insert() if(!$obj->in_storage);
+         }
+       }
+     }
+     $source->storage->txn_commit;
+   }
    $self->in_storage(1);
    $self->{_dirty_columns} = {};
    $self->{related_resultsets} = {};