[Dbix-class] _use_multicolumn_in() must not be called on replicated storage

Bill Moseley moseley at hank.org
Thu Jan 22 23:54:17 GMT 2015


I need some help with this error I'm seeing after upgrading DBIx::Class.

In ReulstSet.pm there's this code that calls $storage->_use_multicolumn_in.

The problem is that method throws and error on replicated storage.


sub _rs_update_delete {
  my ($self, $op, $values) = @_;
  ....

    if (@$idcols == 1) {
      $cond = { $idcols->[0] => { -in => $subrs->as_query } };
    }
    elsif ($storage->_use_multicolumn_in) {
      # no syntax for calling this properly yet
      # !!! EXPERIMENTAL API !!! WILL CHANGE !!!
      $cond = $storage->sql_maker->_where_op_multicolumn_in (
        $idcols, # how do I convey a list of idents...? can binds reside on
lhs?
        $subrs->as_query
      ),
    }
    else {

But, in DBIx::Class::Storage::Replicated the _use_multicolumn method is
blocked by this code:

for my $method (@{$method_dispatch->{unimplemented}}) {

  __PACKAGE__->meta->add_method($method, sub {
    my $self = shift;
    $self->throw_exception("$method() must not be called on ".(blessed
$self).' objects');
  });
}

What I'm not clear on is if this just wasn't tested with Replicated
storage, or if there's something odd in my code that is causing
ResultSet.pm to call that method (because other deletes are working).

The query that is failing is:

   my $student_class_rs = $account->search_related( 'classes'
)->search_related(
        'student_classes',
        {
            student => $student_id,
        }
    );

    $student_class_rs->delete();

$idcols in the code above is a arrayref of two names 'student' and 'class'.

-- 
Bill Moseley
moseley at hank.org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.scsys.co.uk/pipermail/dbix-class/attachments/20150122/478ad3e9/attachment.htm>


More information about the DBIx-Class mailing list