From: Matt S Trout Date: Tue, 29 May 2007 01:08:17 +0000 (+0000) Subject: Merge 'bulk_create' into 'DBIx-Class-current' X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=fdb8385a961f14c3fd4ecf321c7ea6465066d306;p=dbsrgits%2FDBIx-Class-Historic.git Merge 'bulk_create' into 'DBIx-Class-current' --- fdb8385a961f14c3fd4ecf321c7ea6465066d306 diff --cc lib/DBIx/Class/Row.pm index 2165801,f4d33cb..e4d885a --- a/lib/DBIx/Class/Row.pm +++ b/lib/DBIx/Class/Row.pm @@@ -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} = {};