generate_pod
pod_comment_mode
pod_comment_spillover_length
+ preserve_case
/);
=head1 NAME
How to name Result classes.
+=item column_accessors
+
+How to name column accessors in Result classes.
+
=back
The values can be:
This mode is identical to C<v6> mode, except that monikerization of CamelCase
table names is also done correctly.
-CamelCase column names in case-sensitive mode will also be handled correctly
-for relationship name inflection.
+CamelCase column names in case-preserving mode will also be handled correctly
+for relationship name inflection. See L</preserve_case>.
-Currently, only Sybase ASE, MSSQL with CS/BIN collation and Firebird without
-the L<unquoted_ddl|DBIx::Class::Schema::Loader::DBI::InterBase/unquoted_ddl>
-option are in case-sensitive mode.
+In this mode, CamelCase L</column_accessors> are normalized based on case
+transition instead of just being lowercased, so C<FooId> becomes C<foo_id>.
If you don't have any CamelCase table or column names, you can upgrade without
breaking any of your code.
For example:
relationship_attrs => {
- all => { cascade_delete => 0 },
- has_many => { cascade_delete => 1 },
+ belongs_to => { is_deferrable => 1 },
},
-will set the C<cascade_delete> option to 0 for all generated relationships,
-except for C<has_many>, which will have cascade_delete as 1.
+use this to make your foreign key constraints DEFERRABLE.
=head2 debug
File in Perl format, which should return a HASH reference, from which to read
loader options.
+=head1 preserve_case
+
+Usually column names are lowercased, to make them easier to work with in
+L<DBIx::Class>. This option lets you turn this behavior off, if the driver
+supports it.
+
+Drivers for case sensitive databases like Sybase ASE or MSSQL with a
+case-sensitive collation will turn this option on unconditionally.
+
+Currently the drivers for SQLite, mysql, MSSQL and Firebird/InterBase support
+setting this option.
+
=head1 METHODS
None of these methods are intended for direct invocation by regular
$self->{naming} = {
relationships => $naming_ver,
monikers => $naming_ver,
+ column_accessors => $naming_ver,
};
}
last;
}
- $self->naming->{relationships} ||= $v;
- $self->naming->{monikers} ||= $v;
+ $self->naming->{relationships} ||= $v;
+ $self->naming->{monikers} ||= $v;
+ $self->naming->{column_accessors} ||= $v;
$self->schema_version_to_dump($real_ver);
$self->_ext_stmt($class, <<"EOF");
# These lines were loaded from '$old_real_inc_path',
-# based on the Result class name that would have been created by an 0.04006
+# based on the Result class name that would have been created by an older
# version of the Loader. For a static schema, this happens only once during
# upgrade. See skip_load_external to disable this feature.
EOF
warn <<"EOF";
Detected external content in '$old_real_inc_path', a class name that would have
-been used by an 0.04006 version of the Loader.
+been used by an older version of the Loader.
* PLEASE RENAME THIS CLASS: from '$old_class' to '$class', as that is the
new name of the Result.
my @created;
my @current = $self->_tables_list({ constraint => $self->constraint, exclude => $self->exclude });
+
foreach my $table (@current) {
if(!exists $self->{_tables}->{$table}) {
push(@created, $table);
}
}
+ my %current;
+ @current{@current} = ();
+ foreach my $table (keys %{ $self->{_tables} }) {
+ if (not exists $current{$table}) {
+ $self->_unregister_source_for_table($table);
+ }
+ }
+
my $loaded = $self->_load_tables(@created);
return map { $self->monikers->{$_} } @$loaded;
}
}
+sub _make_column_accessor_name {
+ my ($self, $column_name) = @_;
+
+ return join '_', map lc, split /(?<=[[:lower:]])[\W_]*(?=[[:upper:]])|[\W_]+/, $column_name;
+}
+
# Set up metadata (cols, pks, etc)
sub _setup_src_meta {
my ($self, $table) = @_;
my $cols = $self->_table_columns($table);
my $col_info = $self->__columns_info_for($table);
- if ($self->_is_case_sensitive) {
+ if ($self->preserve_case) {
for my $col (keys %$col_info) {
- $col_info->{$col}{accessor} = lc $col
- if $col ne lc($col);
+ if ($col ne lc($col)) {
+ if ((not exists $self->naming->{column_accessors}) || (($self->naming->{column_accessors} =~ /(\d+)/)[0] >= 7)) {
+ $col_info->{$col}{accessor} = $self->_make_column_accessor_name($col);
+ }
+ else {
+ $col_info->{$col}{accessor} = lc $col;
+ }
+ }
}
}
else {
return $qt . $table . $qt;
}
-sub _is_case_sensitive { 0 }
-
sub _custom_column_info {
my ( $self, $table_name, $column_name, $column_info ) = @_;
return $result;
}
+sub _lc {
+ my ($self, $name) = @_;
+
+ return $self->preserve_case ? $name : lc($name);
+}
+
+sub _uc {
+ my ($self, $name) = @_;
+
+ return $self->preserve_case ? $name : uc($name);
+}
+
+sub _unregister_source_for_table {
+ my ($self, $table) = @_;
+
+ eval {
+ local $@;
+ my $schema = $self->schema;
+ # in older DBIC it's a private method
+ my $unregister = $schema->can('unregister_source') || $schema->can('_unregister_source');
+ $schema->$unregister($self->_table2moniker($table));
+ delete $self->monikers->{$table};
+ delete $self->classes->{$table};
+ delete $self->_upgrading_classes->{$table};
+ delete $self->{_tables}{$table};
+ };
+}
+
# remove the dump dir from @INC on destruction
sub DESTROY {
my $self = shift;