File Coverage

blib/lib/App/DBCritic/Policy/NullableTextColumn.pm
Criterion Covered Total %
statement 27 27 100.0
branch n/a
condition n/a
subroutine 9 9 100.0
pod n/a
total 36 36 100.0


line stmt bran cond sub pod time code
1             package App::DBCritic::Policy::NullableTextColumn;
2              
3 5     5   4385 use strict;
  5         12  
  5         169  
4 5     5   28 use utf8;
  5         10  
  5         49  
5 5     5   140 use Modern::Perl '2011'; ## no critic (Modules::ProhibitUseQuotedVersion)
  5         11  
  5         33  
6              
7             our $VERSION = '0.022'; # VERSION
8 5     5   778 use DBI ':sql_types';
  5         10  
  5         1917  
9 5     5   38 use English '-no_match_vars';
  5         12  
  5         50  
10 5     5   1970 use List::Util 1.33 'any';
  5         138  
  5         352  
11 5     5   39 use Moo;
  5         12  
  5         30  
12 5     5   2922 use Sub::Quote;
  5         12  
  5         529  
13 5     5   43 use namespace::autoclean -also => qr{\A _}xms;
  5         13  
  5         58  
14              
15             has description => (
16             is => 'ro',
17             default => quote_sub q{'Nullable text column'},
18             );
19             has explanation => (
20             is => 'ro',
21             default => quote_sub
22             q{'Text columns should not be nullable. Default to empty string instead.'},
23             );
24              
25             sub violates {
26             my $source = shift->element;
27              
28             ## no critic (ProhibitAccessOfPrivateData,ProhibitCallsToUndeclaredSubs)
29             my @text_types = (
30             qw(TEXT NTEXT CLOB NCLOB CHARACTER CHAR NCHAR VARCHAR VARCHAR2 NVARCHAR2),
31             'CHARACTER VARYING',
32             map { uc $_->{TYPE_NAME} }
33             map { $source->storage->dbh->type_info($_) } (
34             SQL_CHAR, SQL_CLOB,
35             SQL_VARCHAR, SQL_WVARCHAR,
36             SQL_LONGVARCHAR, SQL_WLONGVARCHAR,
37             ),
38             );
39              
40             my %column = %{ $source->columns_info };
41             return join "\n", map {"$_ is a nullable text column."} grep {
42             my $col = $_;
43             any { uc( $column{$col}{data_type} // q{} ) eq $_ } @text_types
44             and $column{$col}{is_nullable};
45             } keys %column;
46             }
47              
48             with 'App::DBCritic::PolicyType::ResultSource';
49             1;
50              
51             # ABSTRACT: Check for ResultSources with nullable text columns
52              
53             __END__