sub
_table_fk_info {
my
(
$self
,
$table
) =
@_
;
my
$dbh
=
$self
->schema->storage->dbh;
my
$query
=
"SHOW CREATE TABLE ${table}"
;
my
$sth
=
$dbh
->prepare(
$query
)
or
die
(
"Cannot get table definition: $table"
);
$sth
->execute;
my
$table_def
=
$sth
->fetchrow_arrayref->[1] ||
''
;
$sth
->finish;
my
(
@reldata
) = (
$table_def
=~ /CONSTRAINT `.*` FOREIGN KEY \(`(.*)`\) REFERENCES `(.*)` \(`(.*)`\)/ig);
my
@rels
;
while
(
scalar
@reldata
> 0) {
my
$cols
=
shift
@reldata
;
my
$f_table
=
shift
@reldata
;
my
$f_cols
=
shift
@reldata
;
my
@cols
=
map
{ s/\Q
$self
->{_quoter}\E//;
lc
$_
}
split
(/\s*,\s*/,
$cols
);
my
@f_cols
=
map
{ s/\Q
$self
->{_quoter}\E//;
lc
$_
}
split
(/\s*,\s*/,
$f_cols
);
push
(
@rels
, {
local_columns
=> \
@cols
,
remote_columns
=> \
@f_cols
,
remote_table
=>
$f_table
});
}
return
\
@rels
;
}
sub
_mysql_table_get_keys {
my
(
$self
,
$table
) =
@_
;
if
(!
exists
(
$self
->{_mysql_keys}->{
$table
})) {
my
%keydata
;
my
$dbh
=
$self
->schema->storage->dbh;
my
$sth
=
$dbh
->prepare(
"SHOW INDEX FROM $table"
);
$sth
->execute;
while
(
my
$row
=
$sth
->fetchrow_hashref) {
next
if
$row
->{Non_unique};
push
(@{
$keydata
{
$row
->{Key_name}}},
[
$row
->{Seq_in_index},
lc
$row
->{Column_name} ]
);
}
foreach
my
$keyname
(
keys
%keydata
) {
my
@ordered_cols
=
map
{
$_
->[1] }
sort
{
$a
->[0] <=>
$b
->[0] }
@{
$keydata
{
$keyname
}};
$keydata
{
$keyname
} = \
@ordered_cols
;
}
$self
->{_mysql_keys}->{
$table
} = \
%keydata
;
}
return
$self
->{_mysql_keys}->{
$table
};
}
sub
_table_pk_info {
my
(
$self
,
$table
) =
@_
;
return
$self
->_mysql_table_get_keys(
$table
)->{PRIMARY};
}
sub
_table_uniq_info {
my
(
$self
,
$table
) =
@_
;
my
@uniqs
;
my
$keydata
=
$self
->_mysql_table_get_keys(
$table
);
foreach
my
$keyname
(
%$keydata
) {
next
if
$keyname
eq
'PRIMARY'
;
push
(
@uniqs
, [
$keyname
=>
$keydata
->{
$keyname
} ]);
}
return
\
@uniqs
;
}
1;