From: Jess Robinson Date: Fri, 19 May 2006 20:26:38 +0000 (+0000) Subject: zbys Postgres casecheck patch X-Git-Tag: v0.07002~75^2~186 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=0b88a5bb24f2b536a11ea76e228897f60a10893d;p=dbsrgits%2FDBIx-Class.git zbys Postgres casecheck patch --- diff --git a/lib/DBIx/Class/ResultSource.pm b/lib/DBIx/Class/ResultSource.pm index 4ce8e08..7b4c48c 100644 --- a/lib/DBIx/Class/ResultSource.pm +++ b/lib/DBIx/Class/ResultSource.pm @@ -176,13 +176,15 @@ sub column_info { { $self->{_columns_info_loaded}++; my $info; + my $lc_info; # eval for the case of storage without table - eval { $info = $self->storage->columns_info_for($self->from) }; + eval { $info = $self->storage->columns_info_for( $self->from, keys %{$self->_columns} ) }; unless ($@) { + for my $realcol ( keys %{$info} ) { + $lc_info->{lc $realcol} = $info->{$realcol}; + } foreach my $col ( keys %{$self->_columns} ) { - foreach my $i ( keys %{$info->{$col}} ) { - $self->_columns->{$col}{$i} = $info->{$col}{$i}; - } + $self->_columns->{$col} = $info->{$col} || $lc_info->{lc $col}; } } } diff --git a/lib/DBIx/Class/Storage/DBI.pm b/lib/DBIx/Class/Storage/DBI.pm index bf556cb..3f3f49c 100644 --- a/lib/DBIx/Class/Storage/DBI.pm +++ b/lib/DBIx/Class/Storage/DBI.pm @@ -692,8 +692,10 @@ sub columns_info_for { $column_info{size} = $info->{COLUMN_SIZE}; $column_info{is_nullable} = $info->{NULLABLE} ? 1 : 0; $column_info{default_value} = $info->{COLUMN_DEF}; + my $col_name = $info->{COLUMN_NAME}; + $col_name =~ s/^\"(.*)\"$/$1/; - $result{$info->{COLUMN_NAME}} = \%column_info; + $result{$col_name} = \%column_info; } }; $dbh->{RaiseError} = $old_raise_err; diff --git a/t/lib/DBICTest/Schema.pm b/t/lib/DBICTest/Schema.pm index d69abc0..0fa6a1d 100644 --- a/t/lib/DBICTest/Schema.pm +++ b/t/lib/DBICTest/Schema.pm @@ -11,6 +11,7 @@ __PACKAGE__->load_classes(qw/ CD Link Bookmark + Casecheck #dummy Track Tag diff --git a/t/run/12pg.tl b/t/run/12pg.tl index d71e39c..5432a60 100644 --- a/t/run/12pg.tl +++ b/t/run/12pg.tl @@ -5,16 +5,18 @@ my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_PG_${_}" } qw/DSN USER PASS/}; #warn "$dsn $user $pass"; plan skip_all, 'Set $ENV{DBICTEST_PG_DSN}, _USER and _PASS to run this test' - . ' (note: creates and drops a table named artist!)' unless ($dsn && $user); + . ' (note: creates and drops tables named artist and casecheck!)' unless ($dsn && $user); -plan tests => 4; +plan tests => 8; DBICTest::Schema->compose_connection('PgTest' => $dsn, $user, $pass); my $dbh = PgTest->schema->storage->dbh; PgTest->schema->source("Artist")->name("testschema.artist"); $dbh->do("CREATE SCHEMA testschema;"); -$dbh->do("CREATE TABLE testschema.artist (artistid serial PRIMARY KEY, name VARCHAR(255), charfield CHAR(10));"); + +$dbh->do("CREATE TABLE testschema.artist (artistid serial PRIMARY KEY, name VARCHAR(100), charfield CHAR(10));"); +ok ( $dbh->do('CREATE TABLE testschema.casecheck (id serial PRIMARY KEY, "name" VARCHAR(1), "NAME" VARCHAR(2), "UC_NAME" VARCHAR(3));'), 'Creation of casecheck table'); PgTest::Artist->load_components('PK::Auto'); @@ -35,7 +37,7 @@ my $test_type_info = { 'name' => { 'data_type' => 'character varying', 'is_nullable' => 1, - 'size' => 255, + 'size' => 100, 'default_value' => undef, }, 'charfield' => { @@ -55,7 +57,17 @@ like($artistid_defval, is_deeply($type_info, $test_type_info, 'columns_info_for - column data types'); +my $name_info = PgTest::Casecheck->column_info( 'name' ); +is( $name_info->{size}, 1, "Case sensitive matching info for 'name'" ); + +my $NAME_info = PgTest::Casecheck->column_info( 'NAME' ); +is( $NAME_info->{size}, 2, "Case sensitive matching info for 'NAME'" ); + +my $uc_name_info = PgTest::Casecheck->column_info( 'uc_name' ); +is( $uc_name_info->{size}, 3, "Case insensitive matching info for 'uc_name'" ); + $dbh->do("DROP TABLE testschema.artist;"); +$dbh->do("DROP TABLE testschema.casecheck;"); $dbh->do("DROP SCHEMA testschema;"); }