Skip to content

Commit

Permalink
Sanity-check columns added as primary key
Browse files Browse the repository at this point in the history
  • Loading branch information
ribasushi committed Feb 20, 2013
1 parent 7596ddc commit 8228ee6
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 6 deletions.
2 changes: 2 additions & 0 deletions Changes
Expand Up @@ -6,6 +6,8 @@ Revision history for DBIx::Class
inheritance.
- Optimize the generated rowparsers even more - no user-visible
changes.
- Emit a warning on incorrect use of nullable columns within a
primary key

0.08240-TRIAL (EXPERIMENTAL BETA RELEASE) 2013-02-14 05:56 (UTC)
* New Features / Changes
Expand Down
19 changes: 13 additions & 6 deletions lib/DBIx/Class/ResultSource.pm
Expand Up @@ -492,9 +492,9 @@ sub columns_info {
}
else {
$self->throw_exception( sprintf (
"No such column '%s' on source %s",
"No such column '%s' on source '%s'",
$_,
$self->source_name,
$self->source_name || $self->name || 'Unknown source...?',
));
}
}
Expand Down Expand Up @@ -588,11 +588,18 @@ for more info.

sub set_primary_key {
my ($self, @cols) = @_;
# check if primary key columns are valid columns
foreach my $col (@cols) {
$self->throw_exception("No such column $col on table " . $self->name)
unless $self->has_column($col);

my $colinfo = $self->columns_info(\@cols);
for my $col (@cols) {
carp_unique(sprintf (
"Primary key of source '%s' includes the column '%s' which has its "
. "'is_nullable' attribute set to true. This is a mistake and will cause "
. 'various Result-object operations to fail',
$self->source_name || $self->name || 'Unknown source...?',
$col,
)) if $colinfo->{$col}{is_nullable};
}

$self->_primaries(\@cols);

$self->add_unique_constraint(primary => \@cols);
Expand Down
30 changes: 30 additions & 0 deletions t/resultsource/set_primary_key.t
@@ -0,0 +1,30 @@
use strict;
use warnings;
use Test::More;
use Test::Exception;
use Test::Warn;

use lib 't/lib';
use DBICTest;

throws_ok {
package Foo;
use base 'DBIx::Class::Core';
__PACKAGE__->table('foo');
__PACKAGE__->set_primary_key('bar')
} qr/No such column 'bar' on source 'foo' /,
'proper exception on non-existing column as PK';

warnings_exist {
package Foo2;
use base 'DBIx::Class::Core';
__PACKAGE__->table('foo');
__PACKAGE__->add_columns(
foo => {},
bar => { is_nullable => 1 },
);
__PACKAGE__->set_primary_key(qw(foo bar))
} qr/Primary key of source 'foo' includes the column 'bar' which has its 'is_nullable' attribute set to true/,
'proper exception on non-existing column as PK';

This comment has been minimized.

Copy link
@DrHyde

DrHyde Mar 11, 2013

This should be s/non-existing/NULLable/

This comment has been minimized.

Copy link
@ribasushi

ribasushi Mar 11, 2013

Author Collaborator

0b56089

Cheers


done_testing;

0 comments on commit 8228ee6

Please sign in to comment.