DBIx-Class-Schema-Loader
view release on metacpan or search on metacpan
lib/DBIx/Class/Schema/Loader/DBI/MSSQL.pm view on Meta::CPAN
DBIx::Class::Schema::Loader::DBI::MSSQL - DBIx::Class::Schema::Loader::DBI MSSQL Implementation.
=head1 DESCRIPTION
Base driver for Microsoft SQL Server, used by
L<DBIx::Class::Schema::Loader::DBI::Sybase::Microsoft_SQL_Server> for support
via L<DBD::Sybase> and
L<DBIx::Class::Schema::Loader::DBI::ODBC::Microsoft_SQL_Server> for support via
L<DBD::ODBC>.
See L<DBIx::Class::Schema::Loader> and L<DBIx::Class::Schema::Loader::Base> for
usage information.
=head1 CASE SENSITIVITY
Most MSSQL databases use C<CI> (case-insensitive) collation, for this reason
generated column names are lower-cased as this makes them easier to work with
in L<DBIx::Class>.
We attempt to detect the database collation at startup for any database
included in L<db_schema|DBIx::Class::Schema::Loader::Base/db_schema>, and set
the column lowercasing behavior accordingly, as lower-cased column names do not
work on case-sensitive databases.
To manually control case-sensitive mode, put:
preserve_case => 1|0
in your Loader options.
See L<preserve_case|DBIx::Class::Schema::Loader::Base/preserve_case>.
B<NOTE:> this option used to be called C<case_sensitive_collation>, but has
been renamed to a more generic option.
=cut
# SQL Server 2000: Ancient as time itself, but still out in the wild
sub _is_2k {
return shift->schema->storage->_server_info->{normalized_dbms_version} < 9;
}
sub _system_databases {
return (qw/
master model tempdb msdb
/);
}
sub _system_tables {
return (qw/
spt_fallback_db spt_fallback_dev spt_fallback_usg spt_monitor spt_values MSreplication_options
/);
}
sub _schemas {
my ($self, $db) = @_;
my $owners = $self->dbh->selectcol_arrayref($self->_is_2k ? <<"EOF2K" : <<"EOF");
SELECT name
FROM [$db].dbo.sysusers
WHERE uid <> gid
EOF2K
SELECT name
FROM [$db].sys.schemas
EOF
return grep !/^(?:#|guest|INFORMATION_SCHEMA|sys)/, @$owners;
}
sub _current_schema {
my $self = shift;
if ($self->_is_2k) {
return ($self->dbh->selectrow_array('SELECT user_name()'))[0];
}
return ($self->dbh->selectrow_array('SELECT schema_name()'))[0];
}
sub _current_db {
my $self = shift;
return ($self->dbh->selectrow_array('SELECT db_name()'))[0];
}
sub _switch_db {
my ($self, $db) = @_;
$self->dbh->do("use [$db]");
}
sub _setup {
my $self = shift;
$self->next::method(@_);
my $current_db = $self->_current_db;
if (ref $self->db_schema eq 'HASH') {
if (keys %{ $self->db_schema } < 2) {
my ($db) = keys %{ $self->db_schema };
$db ||= $current_db;
if ($db eq '%') {
my $owners = $self->db_schema->{$db};
my $db_names = $self->dbh->selectcol_arrayref(<<'EOF');
SELECT name
FROM master.dbo.sysdatabases
EOF
my @dbs;
foreach my $db_name (@$db_names) {
push @dbs, $db_name
unless any { $_ eq $db_name } $self->_system_databases;
}
$self->db_schema({});
DB: foreach my $db (@dbs) {
if (not ((ref $owners eq 'ARRAY' && $owners->[0] eq '%') || $owners eq '%')) {
( run in 0.526 second using v1.01-cache-2.11-cpan-5735350b133 )