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.07007';
=head1 NAME
$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) = @_;
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') {
${ $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;
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) . ")");
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;