From: John Napiorkowski Date: Mon, 20 Nov 2006 05:01:56 +0000 (+0000) Subject: changed storage->insert|update|delete to accept the source object directly and to... X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=7af8b477f07d8ae5b759a285ae95d0c0f1697c8a;p=dbsrgits%2FDBIx-Class-Historic.git changed storage->insert|update|delete to accept the source object directly and to get the attributes for the columns in storage::DBI and not elsewhere. Cleaned up the tests. Still getting attribute info from the table schemas --- diff --git a/lib/DBIx/Class/ResultSet.pm b/lib/DBIx/Class/ResultSet.pm index 5212799..4fe5276 100644 --- a/lib/DBIx/Class/ResultSet.pm +++ b/lib/DBIx/Class/ResultSet.pm @@ -1107,17 +1107,9 @@ sub update { unless ref $values eq 'HASH'; my $cond = $self->_cond_for_update_delete; - - my $bind_attributes; - foreach my $column ($self->result_source->columns) { - - $bind_attributes->{$column} = $self->result_source->column_info($column)->{bind_attributes} - if defined $self->result_source->column_info($column)->{bind_attributes}; - } - $self->result_source->storage->bind_attributes($bind_attributes); - + return $self->result_source->storage->update( - $self->result_source->from, $values, $cond + $self->result_source, $values, $cond ); } @@ -1167,7 +1159,7 @@ sub delete { my $cond = $self->_cond_for_update_delete; - $self->result_source->storage->delete($self->result_source->from, $cond); + $self->result_source->storage->delete($self->result_source, $cond); return 1; } diff --git a/lib/DBIx/Class/Row.pm b/lib/DBIx/Class/Row.pm index 6bf479c..6e1cd42 100644 --- a/lib/DBIx/Class/Row.pm +++ b/lib/DBIx/Class/Row.pm @@ -75,15 +75,7 @@ sub insert { $self->throw_exception("No result_source set on this object; can't insert") unless $source; - my $bind_attributes; - foreach my $column ($self->result_source->columns) { - - $bind_attributes->{$column} = $self->result_source->column_info($column)->{bind_attributes} - if defined $self->result_source->column_info($column)->{bind_attributes}; - } - $self->result_source->storage->bind_attributes($bind_attributes); - - $source->storage->insert($source->from, { $self->get_columns }); + $source->storage->insert($source, { $self->get_columns }); $self->in_storage(1); $self->{_dirty_columns} = {}; $self->{related_resultsets} = {}; @@ -125,16 +117,8 @@ sub update { $self->throw_exception("Cannot safely update a row in a PK-less table") if ! keys %$ident_cond; - my $bind_attributes; - foreach my $column ($self->result_source->columns) { - - $bind_attributes->{$column} = $self->result_source->column_info($column)->{bind_attributes} - if defined $self->result_source->column_info($column)->{bind_attributes}; - } - $self->result_source->storage->bind_attributes($bind_attributes); - my $rows = $self->result_source->storage->update( - $self->result_source->from, \%to_update, $ident_cond); + $self->result_source, \%to_update, $ident_cond); if ($rows == 0) { $self->throw_exception( "Can't update ${self}: row not found" ); } elsif ($rows > 1) { @@ -172,7 +156,7 @@ sub delete { unless exists $self->{_column_data}{$column}; } $self->result_source->storage->delete( - $self->result_source->from, $ident_cond); + $self->result_source, $ident_cond); $self->in_storage(undef); } else { $self->throw_exception("Can't do class delete without a ResultSource instance") diff --git a/lib/DBIx/Class/Storage/DBI.pm b/lib/DBIx/Class/Storage/DBI.pm index 6859f1c..de21478 100644 --- a/lib/DBIx/Class/Storage/DBI.pm +++ b/lib/DBIx/Class/Storage/DBI.pm @@ -14,7 +14,7 @@ use IO::File; __PACKAGE__->mk_group_accessors( 'simple' => qw/_connect_info _dbh _sql_maker _sql_maker_opts _conn_pid _conn_tid - disable_sth_caching cursor on_connect_do transaction_depth bind_attributes/ + disable_sth_caching cursor on_connect_do transaction_depth/ ); BEGIN { @@ -816,7 +816,8 @@ sub _prep_for_execute { } sub _execute { - my ($self, $op, $extra_bind, $ident, @args) = @_; + my ($self, $op, $extra_bind, $ident, $bind_attributes, @args) = @_; + my ($sql, @bind) = $self->sql_maker->$op($ident, @args); unshift(@bind, @$extra_bind) if $extra_bind; if ($self->debug) { @@ -838,7 +839,6 @@ sub _execute { $rv = eval { my $placeholder_index = 1; - my $bind_attributes = $self->bind_attributes; foreach my $bound (@bind) { @@ -857,7 +857,6 @@ sub _execute { } $sth->execute; }; - $self->bind_attributes({}); if ($@ || !$rv) { $self->throw_exception("Error executing '$sql': ".($@ || $sth->errstr)); @@ -873,12 +872,21 @@ sub _execute { } sub insert { - my ($self, $ident, $to_insert) = @_; + my ($self, $source, $to_insert) = @_; + + my $ident = $source->from; + my $bind_attributes; + foreach my $column ($source->columns) { + + $bind_attributes->{$column} = $source->column_info($column)->{bind_attributes} + if defined $source->column_info($column)->{bind_attributes}; + } + $self->throw_exception( "Couldn't insert ".join(', ', map "$_ => $to_insert->{$_}", keys %$to_insert )." into ${ident}" - ) unless ($self->_execute('insert' => [], $ident, $to_insert)); + ) unless ($self->_execute('insert' => [], $ident, $bind_attributes, $to_insert)); return $to_insert; } @@ -891,7 +899,9 @@ sub insert_bulk { my %colvalues; @colvalues{@$cols} = (0..$#$cols); my ($sql, @bind) = $self->sql_maker->insert($table, \%colvalues); -# print STDERR "BIND".Dumper(\@bind); + + ##need this to support using bindtype=>columns for sql abstract + @bind = map {$_->[1]} @bind; if ($self->debug) { my @debug_bind = map { defined $_ ? qq{'$_'} : q{'NULL'} } @bind; @@ -931,11 +941,29 @@ sub insert_bulk { } sub update { - return shift->_execute('update' => [], @_); + my $self = shift @_; + my $source = shift @_; + + my $bind_attributes; + foreach my $column ($source->columns) { + + $bind_attributes->{$column} = $source->column_info($column)->{bind_attributes} + if defined $source->column_info($column)->{bind_attributes}; + } + + my $ident = $source->from; + return $self->_execute('update' => [], $ident, $bind_attributes, @_); } + sub delete { - return shift->_execute('delete' => [], @_); + my $self = shift @_; + my $source = shift @_; + + my $bind_attrs = {}; ## If ever it's needed... + my $ident = $source->from; + + return $self->_execute('delete' => [], $ident, $bind_attrs, @_); } sub _select { @@ -951,7 +979,8 @@ sub _select { ($order ? (order_by => $order) : ()) }; } - my @args = ('select', $attrs->{bind}, $ident, $select, $condition, $order); + my $bind_attrs = {}; ## Future support + my @args = ('select', $attrs->{bind}, $ident, $bind_attrs, $select, $condition, $order); if ($attrs->{software_limit} || $self->sql_maker->_default_limit_syntax eq "GenericSubQ") { $attrs->{software_limit} = 1; diff --git a/t/bindtype_columns.t b/t/bindtype_columns.t index 2100cca..d88815d 100644 --- a/t/bindtype_columns.t +++ b/t/bindtype_columns.t @@ -9,19 +9,6 @@ my $schema = DBICTest->init_schema(); plan tests => 2; -# figure out if we've got a version of sqlite that is older than 3.2.6, in -# which case COUNT(DISTINCT()) doesn't work -my $is_broken_sqlite = 0; -my ($sqlite_major_ver,$sqlite_minor_ver,$sqlite_patch_ver) = - split /\./, $schema->storage->dbh->get_info(18); -if( $schema->storage->dbh->get_info(17) eq 'SQLite' && - ( ($sqlite_major_ver < 3) || - ($sqlite_major_ver == 3 && $sqlite_minor_ver < 2) || - ($sqlite_major_ver == 3 && $sqlite_minor_ver == 2 && $sqlite_patch_ver < 6) ) ) { - $is_broken_sqlite = 1; -} - - #Bindtest { my $new = $schema->resultset("Artist")->new({ @@ -38,4 +25,3 @@ if( $schema->storage->dbh->get_info(17) eq 'SQLite' && is($resultset->name, 'JohnNapiorkowski', 'Testing New Name'); } - diff --git a/t/lib/DBICTest/Schema/Artist.pm b/t/lib/DBICTest/Schema/Artist.pm index 8799188..90eb7bf 100644 --- a/t/lib/DBICTest/Schema/Artist.pm +++ b/t/lib/DBICTest/Schema/Artist.pm @@ -13,13 +13,11 @@ __PACKAGE__->add_columns( 'artistid' => { data_type => 'integer', is_auto_increment => 1, - bind_attributes => { testkey1 => 1}, }, 'name' => { data_type => 'varchar', size => 100, is_nullable => 1, - bind_attributes => {testkey2 =>2}, }, ); __PACKAGE__->set_primary_key('artistid');