=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<column_info|DBIx::Class::ResultSource/column_info> 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<inflate_datetime> on a non-datetime
+column so it also receives the L</datetime_timezone> and/or L</datetime_locale>.
=head2 datetime_timezone
-Set timezone attribute for L<DBIx::Class::InflateColumn::DateTime>
-to all columns with the type DATE.
+Sets the timezone attribute for L<DBIx::Class::InflateColumn::DateTime> for all
+columns with the DATE/DATETIME/TIMESTAMP data_types.
=head2 datetime_locale
-Set local attribute for L<DBIx::Class::InflateColumn::DateTime>
-to all columns with the type DATE.
+Sets the locale attribute for L<DBIx::Class::InflateColumn::DateTime> 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<DBIx::Class::Schema::Loader>. Anything you can find here
-can also be found via standard L<DBIx::Class::Schema> methods somehow.
+users of L<DBIx::Class::Schema::Loader>. Some are proxied via
+L<DBIx::Class::Schema::Loader>.
=cut
}
$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;
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);
}
}
+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
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
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;
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;
sub _custom_column_info {
my ( $table_name, $column_name, $column_info ) = @_;
+
$table_name = lc ( $table_name );
$column_name = lc ( $column_name );
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' });