changed storage->insert|update|delete to accept the source object directly and to...
John Napiorkowski [Mon, 20 Nov 2006 05:01:56 +0000 (05:01 +0000)]
lib/DBIx/Class/ResultSet.pm
lib/DBIx/Class/Row.pm
lib/DBIx/Class/Storage/DBI.pm
t/bindtype_columns.t
t/lib/DBICTest/Schema/Artist.pm

index 5212799..4fe5276 100644 (file)
@@ -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;
 }
 
index 6bf479c..6e1cd42 100644 (file)
@@ -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")
index 6859f1c..de21478 100644 (file)
@@ -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;
index 2100cca..d88815d 100644 (file)
@@ -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');
 }
 
-
index 8799188..90eb7bf 100644 (file)
@@ -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');