From: Rafael Kitover Date: Fri, 19 Feb 2010 11:57:17 +0000 (-0500) Subject: code/pod cleanup X-Git-Tag: 0.05003~5^2 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=d67d058e7bb0f4fbe04c73b9cb3eb72eaec063cb;p=dbsrgits%2FDBIx-Class-Schema-Loader.git code/pod cleanup --- diff --git a/lib/DBIx/Class/Schema/Loader/Base.pm b/lib/DBIx/Class/Schema/Loader/Base.pm index 4f57523..11d1605 100644 --- a/lib/DBIx/Class/Schema/Loader/Base.pm +++ b/lib/DBIx/Class/Schema/Loader/Base.pm @@ -384,57 +384,41 @@ careful with this option. =head2 custom_column_info -Must be a coderef, returing a hashref with the custom column informations. - -Example: - - custom_column_info => sub { - my $info = shift; - # Example from $info hashref: - # $info = { - # 'DECIMAL_DIGITS' => undef, - # 'COLUMN_DEF' => undef, - # 'TABLE_CAT' => undef, - # 'NUM_PREC_RADIX' => undef, - # 'TABLE_SCHEM' => 'TESTS', - # 'BUFFER_LENGTH' => '8', - # 'CHAR_OCTET_LENGTH' => undef, - # 'IS_NULLABLE' => 'NO', - # 'REMARKS' => undef, - # 'COLUMN_SIZE' => '8', - # 'ORDINAL_POSITION' => '1', - # 'COLUMN_NAME' => 'LOADER_TEST9', - # 'TYPE_NAME' => 'VARCHAR2', - # 'NULLABLE' => '0', - # 'DATA_TYPE' => '12', - # 'TABLE_NAME' => 'LOADER_TEST9', - # 'SQL_DATA_TYPE' => '12', - # 'SQL_DATETIME_SUB' => undef - # }; - - if ( $info->{TYPE_NAME} eq 'DATE' ){ - return { timezone => "Europe/Berlin" }; - } - return; - } +Hook for adding extra attributes to the +L for a column. + +Must be a coderef that returns a hashref with the extra attributes. + +Receives the table name, column name and column_info. + +For example: + + custom_column_info => sub { + my ($table_name, $column_name, $column_info) = @_; + + if ($column_name eq 'dog' && $column_info->{default_value} eq 'snoopy') { + return { is_snoopy => 1 }; + } + }, -Add to all columns with type DATE the attribute timezone => "Europe/Berlin". +This attribute can also be used to set C on a non-datetime +column so it also receives the L and/or L. =head2 datetime_timezone -Set timezone attribute for L -to all columns with the type DATE. +Sets the timezone attribute for L for all +columns with the DATE/DATETIME/TIMESTAMP data_types. =head2 datetime_locale -Set local attribute for L -to all columns with the type DATE. +Sets the locale attribute for L for all +columns with the DATE/DATETIME/TIMESTAMP data_types. =head1 METHODS None of these methods are intended for direct invocation by regular -users of L. Anything you can find here -can also be found via standard L methods somehow. +users of L. Some are proxied via +L. =cut @@ -520,6 +504,10 @@ sub new { } $self->{naming} ||= {}; + if ($self->custom_column_info && ref $self->custom_column_info ne 'CODE') { + croak 'custom_column_info must be a CODE ref'; + } + $self->_check_back_compat; $self->use_namespaces(1) unless defined $self->use_namespaces; @@ -1363,7 +1351,7 @@ sub _setup_src_meta { my $cols = $self->_table_columns($table); my $col_info; - eval { $col_info = $self->_columns_info_for($table) }; + eval { $col_info = $self->__columns_info_for($table) }; if($@) { $self->_dbic_stmt($table_class,'add_columns',@$cols); } @@ -1407,6 +1395,21 @@ sub _setup_src_meta { } +sub __columns_info_for { + my ($self, $table) = @_; + + my $result = $self->_columns_info_for($table); + + while (my ($col, $info) = each %$result) { + $info = { %$info, %{ $self->_custom_column_info ($table, $col, $info) } }; + $info = { %$info, %{ $self->_datetime_column_info($table, $col, $info) } }; + + $result->{$col} = $info; + } + + return $result; +} + =head2 tables Returns a sorted list of loaded tables, using the original database table @@ -1615,27 +1618,22 @@ sub _is_case_sensitive { 0 } sub _custom_column_info { my ( $self, $table_name, $column_name, $column_info ) = @_; - if( ref $self->custom_column_info eq 'CODE' ) { - return $self->custom_column_info->( $table_name, $column_name, $column_info ); + if (my $code = $self->custom_column_info) { + return $code->($table_name, $column_name, $column_info) || {}; } return {}; } sub _datetime_column_info { my ( $self, $table_name, $column_name, $column_info ) = @_; - my $return = {}; - my $type = lc ( $column_info->{data_type} ); - if ( - ( defined $column_info->{inflate_datetime} and $column_info->{inflate_datetime} ) - or ( defined $column_info->{inflate_date} and $column_info->{inflate_date} ) - or ( $type eq 'date') - or ( $type eq 'datetime') - or ( $type eq 'timestamp') - ){ - $return->{timezone} = $self->datetime_timezone if $self->datetime_timezone; - $return->{locale} = $self->datetime_locale if $self->datetime_locale; + my $result = {}; + my $type = $column_info->{data_type} || ''; + if ((grep $_, @{ $column_info }{map "inflate_$_", qw/date datetime timestamp/}) + or ($type =~ /date|timestamp/i)) { + $result->{timezone} = $self->datetime_timezone if $self->datetime_timezone; + $result->{locale} = $self->datetime_locale if $self->datetime_locale; } - return $return; + return $result; } # remove the dump dir from @INC on destruction diff --git a/lib/DBIx/Class/Schema/Loader/DBI.pm b/lib/DBIx/Class/Schema/Loader/DBI.pm index fb2669e..1e82f2e 100644 --- a/lib/DBIx/Class/Schema/Loader/DBI.pm +++ b/lib/DBIx/Class/Schema/Loader/DBI.pm @@ -293,12 +293,6 @@ sub _columns_info_for { my $extra_info = $self->_extra_column_info($info) || {}; $column_info = { %$column_info, %$extra_info }; - my $custom_info = $self->_custom_column_info( $table, $col_name, $column_info ) || {}; - $column_info = { %$column_info, %$custom_info }; - - my $datetime_info = $self->_datetime_column_info( $table, $col_name, $column_info ) || {}; - $column_info = { %$column_info, %$datetime_info }; - $result{$col_name} = $column_info; } $sth->finish; @@ -324,12 +318,6 @@ sub _columns_info_for { my $extra_info = $self->_extra_column_info($table, $columns[$i], $sth, $i) || {}; $column_info = { %$column_info, %$extra_info }; - my $custom_info = $self->_custom_column_info( $table, $columns[$i], $column_info ) || {}; - $column_info = { %$column_info, %$custom_info }; - - my $datetime_info = $self->_datetime_column_info( $table, $columns[$i], $column_info ) || {}; - $column_info = { %$column_info, %$datetime_info }; - $result{$columns[$i]} = $column_info; } $sth->finish; diff --git a/t/lib/dbixcsl_common_tests.pm b/t/lib/dbixcsl_common_tests.pm index 478cf52..b134845 100644 --- a/t/lib/dbixcsl_common_tests.pm +++ b/t/lib/dbixcsl_common_tests.pm @@ -59,6 +59,7 @@ sub _monikerize { sub _custom_column_info { my ( $table_name, $column_name, $column_info ) = @_; + $table_name = lc ( $table_name ); $column_name = lc ( $column_name ); @@ -640,19 +641,20 @@ sub test_schema { ok($class10->column_info('loader_test11')->{is_foreign_key}, 'Foreign key detected'); ok($class11->column_info('loader_test10')->{is_foreign_key}, 'Foreign key detected'); + # Added by custom_column_info - ok($class11->column_info('loader_test10')->{is_numeric}, 'is_numeric detected'); + ok($class11->column_info('loader_test10')->{is_numeric}, 'custom_column_info'); - is($class36->column_info('a_date')->{locale},'de_DE','locale is correct'); - is($class36->column_info('a_date')->{timezone},'Europe/Berlin','locale is correct'); + is($class36->column_info('a_date')->{locale},'de_DE','datetime_locale'); + is($class36->column_info('a_date')->{timezone},'Europe/Berlin','datetime_timezone'); - ok($class36->column_info('b_char_as_data')->{inflate_datetime},'inflate_datetime detected'); - is($class36->column_info('b_char_as_data')->{locale},'de_DE','locale is correct'); - is($class36->column_info('b_char_as_data')->{timezone},'Europe/Berlin','locale is correct'); + ok($class36->column_info('b_char_as_data')->{inflate_datetime},'custom_column_info'); + is($class36->column_info('b_char_as_data')->{locale},'de_DE','datetime_locale'); + is($class36->column_info('b_char_as_data')->{timezone},'Europe/Berlin','datetime_timezone'); - ok($class36->column_info('c_char_as_data')->{inflate_date},'inflate_date detected'); - is($class36->column_info('c_char_as_data')->{locale},'de_DE','locale is correct'); - is($class36->column_info('c_char_as_data')->{timezone},'Europe/Berlin','locale is correct'); + ok($class36->column_info('c_char_as_data')->{inflate_date},'custom_column_info'); + is($class36->column_info('c_char_as_data')->{locale},'de_DE','datetime_locale'); + is($class36->column_info('c_char_as_data')->{timezone},'Europe/Berlin','datetime_timezone'); my $obj10 = $rsobj10->create({ subject => 'xyzzy' });