X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema%2FLoader%2FBase.pm;h=e715268d2452ae7149c2a2c3541fbe26f1ee2038;hb=refs%2Ftags%2F0.05003;hp=905eb76bece4c2d4ad67d20ddfd491e4e9fec306;hpb=6f98406eee4f4f35e74cbe8015198b6d5fedb677;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/lib/DBIx/Class/Schema/Loader/Base.pm b/lib/DBIx/Class/Schema/Loader/Base.pm index 905eb76..e715268 100644 --- a/lib/DBIx/Class/Schema/Loader/Base.pm +++ b/lib/DBIx/Class/Schema/Loader/Base.pm @@ -17,7 +17,7 @@ use Class::Unload; use Class::Inspector (); require DBIx::Class; -our $VERSION = '0.05002'; +our $VERSION = '0.05003'; __PACKAGE__->mk_group_ro_accessors('simple', qw/ schema @@ -55,6 +55,8 @@ __PACKAGE__->mk_group_ro_accessors('simple', qw/ monikers dynamic naming + datetime_timezone + datetime_locale /); @@ -382,26 +384,41 @@ careful with this option. =head2 custom_column_info -Must be a coderef, returing a hashref with the custom column informations. +Hook for adding extra attributes to the +L for a column. -Example: +Must be a coderef that returns a hashref with the extra attributes. - custom_column_info => sub { - my $info = shift; +Receives the table name, column name and column_info. - if ( $info->{TYPE_NAME} eq 'DATE' ){ - return { timezone => "Europe/Berlin" }; - } - return; - } +For example: -Add to all columns with type DATE the attribute timezone => "Europe/Berlin". + 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 }; + } + }, + +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 + +Sets the timezone attribute for L for all +columns with the DATE/DATETIME/TIMESTAMP data_types. + +=head2 datetime_locale + +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 @@ -487,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; @@ -1330,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); } @@ -1374,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 @@ -1512,9 +1548,11 @@ sub _make_pod { $self->_pod( $class, join "\n", map { my $s = $attrs->{$_}; - $s = !defined $s ? 'undef' : - length($s) == 0 ? '(empty string)' : - $s; + $s = !defined $s ? 'undef' : + length($s) == 0 ? '(empty string)' : + ref($s) eq 'SCALAR' ? $$s : + $s + ; " $_: $s" } sort keys %$attrs, @@ -1578,14 +1616,26 @@ sub _quote_table_name { sub _is_case_sensitive { 0 } sub _custom_column_info { - my ( $self, $info ) = @_; + my ( $self, $table_name, $column_name, $column_info ) = @_; - if( ref $self->custom_column_info eq 'CODE' ) { - return $self->custom_column_info->($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 $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 $result; +} + # remove the dump dir from @INC on destruction sub DESTROY { my $self = shift;