X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema%2FLoader%2FDBI%2FSQLite.pm;h=9a93072629caa353b035783ef184054ba9a76d03;hb=f671b6308c4f2210255b2eaa12fc47a49621d436;hp=f77dc4cf48f6c1dd5f0a8fd75bcaa955fca5dd90;hpb=007e35115cb7dd95dd4205cebb4dee1c8af2a744;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/lib/DBIx/Class/Schema/Loader/DBI/SQLite.pm b/lib/DBIx/Class/Schema/Loader/DBI/SQLite.pm index f77dc4c..9a93072 100644 --- a/lib/DBIx/Class/Schema/Loader/DBI/SQLite.pm +++ b/lib/DBIx/Class/Schema/Loader/DBI/SQLite.pm @@ -7,10 +7,9 @@ use base qw/ DBIx::Class::Schema::Loader::DBI /; use Carp::Clan qw/^DBIx::Class/; -use Text::Balanced qw( extract_bracketed ); -use Class::C3; +use mro 'c3'; -our $VERSION = '0.07000'; +our $VERSION = '0.07002'; =head1 NAME @@ -49,6 +48,22 @@ sub rescan { $self->next::method($schema); } +# A hack so that qualify_objects can be tested on SQLite, SQLite does not +# actually have schemas. +{ + sub _table_as_sql { + my $self = shift; + local $self->{db_schema}; + return $self->next::method(@_); + } + + sub _table_pk_info { + my $self = shift; + local $self->{db_schema}; + return $self->next::method(@_); + } +} + sub _columns_info_for { my $self = shift; my ($table) = @_; @@ -58,33 +73,33 @@ sub _columns_info_for { my $dbh = $self->schema->storage->dbh; local $dbh->{FetchHashKeyName} = 'NAME_lc'; - my $has_autoinc = eval { - my $get_seq = $self->{_cache}{sqlite_sequence} - ||= $dbh->prepare(q{SELECT count(*) FROM sqlite_sequence WHERE name = ?}); - $get_seq->execute($table); - my ($ret) = $get_seq->fetchrow_array; - $get_seq->finish; - $ret; - }; - - if (!$@ && $has_autoinc) { - my $sth = $dbh->prepare( - "pragma table_info(" . $dbh->quote_identifier($table) . ")" - ); - $sth->execute; - my $cols = $sth->fetchall_hashref('name'); - - while (my ($col_name, $info) = each %$result) { - if ($cols->{$col_name}{pk}) { - $info->{is_auto_increment} = 1; - } + my $sth = $dbh->prepare( + "pragma table_info(" . $dbh->quote_identifier($table) . ")" + ); + $sth->execute; + my $cols = $sth->fetchall_hashref('name'); + + my ($num_pk, $pk_col) = (0); + # SQLite doesn't give us the info we need to do this nicely :( + # If there is exactly one column marked PK, and its type is integer, + # set it is_auto_increment. This isn't 100%, but it's better than the + # alternatives. + while (my ($col_name, $info) = each %$result) { + if ($cols->{$col_name}{pk}) { + $num_pk ++; + if (lc($cols->{$col_name}{type}) eq 'integer') { + $pk_col = $col_name; } + } } while (my ($col, $info) = each %$result) { - if (eval { ${ $info->{default_value} } eq 'CURRENT_TIMESTAMP' }) { + if ((eval { ${ $info->{default_value} } }||'') eq 'CURRENT_TIMESTAMP') { ${ $info->{default_value} } = 'current_timestamp'; } + if ($num_pk == 1 and defined $pk_col and $pk_col eq $col) { + $info->{is_auto_increment} = 1; + } } return $result; @@ -129,6 +144,7 @@ sub _table_uniq_info { my @uniqs; while (my $idx = $sth->fetchrow_hashref) { next unless $idx->{unique}; + my $name = $idx->{name}; my $get_idx_sth = $dbh->prepare("pragma index_info(" . $dbh->quote($name) . ")"); @@ -138,6 +154,11 @@ sub _table_uniq_info { push @cols, $self->_lc($idx_row->{name}); } $get_idx_sth->finish; + + # Rename because SQLite complains about sqlite_ prefixes on identifiers + # and ignores constraint names in DDL. + $name = (join '_', @cols) . '_unique'; + push @uniqs, [ $name => \@cols ]; } $sth->finish;