use
vars
qw($VERSION @ISA %typemap)
;
$VERSION
=
'0.01'
;
@ISA
=
qw(DBIx::DBSchema::DBD)
;
%typemap
= (
'VARCHAR'
=>
'VARCHAR2'
,
'SERIAL'
=>
'INTEGER'
,
'LONG VARBINARY'
=>
'BLOB'
,
'TIMESTAMP'
=>
'DATE'
,
'BOOL'
=>
'INTEGER'
);
sub
columns {
my
(
$proto
,
$dbh
,
$table
) =
@_
;
return
$proto
->_column_info(
$dbh
,
$table
);
}
sub
column {
my
(
$proto
,
$dbh
,
$table
,
$column
) =
@_
;
return
$proto
->_column_info(
$dbh
,
$table
,
$column
);
}
sub
_column_info {
my
(
$proto
,
$dbh
,
$table
,
$column
) =
@_
;
my
$sql
= "SELECT column_name, data_type,
CASE WHEN nullable =
'Y'
THEN 1
WHEN nullable =
'N'
THEN 0
ELSE 1
END AS nullable,
data_length, data_default, NULL AS reserved
FROM user_tab_columns
WHERE table_name = ?";
$sql
.=
" AND column_name = ?"
if
defined
(
$column
);
if
(
defined
(
$column
)) {
return
$dbh
->selectrow_arrayref(
$sql
,
undef
,
$table
,
$column
);
}
else
{
return
$dbh
->selectall_arrayref(
$sql
,
undef
,
$table
);
}
}
sub
primary_key {
my
(
$proto
,
$dbh
,
$table
) =
@_
;
my
$sql
= "SELECT column_name
FROM user_constraints
uc
, user_cons_columns ucc
WHERE
uc
.constraint_name = ucc.constraint_name
AND
uc
.constraint_type =
'P'
AND
uc
.table_name = ?";
my
(
$key
) =
$dbh
->selectrow_array(
$sql
,
undef
,
$table
);
return
$key
;
}
sub
unique {
my
(
$proto
,
$dbh
,
$table
) =
@_
;
return
$proto
->_index_info(
$dbh
,
$table
,
'UNIQUE'
);
}
sub
index
{
my
(
$proto
,
$dbh
,
$table
) =
@_
;
return
$proto
->_index_info(
$dbh
,
$table
,
'NONUNIQUE'
);
}
sub
_index_info {
my
(
$proto
,
$dbh
,
$table
,
$type
) =
@_
;
die
"\$type must be 'UNIQUE' or 'NONUNIQUE'"
unless
$type
=~ /^(NON)?UNIQUE$/;
my
$sql
= "SELECT ui.index_name, uic.column_name
FROM user_indexes ui, user_ind_columns uic
WHERE ui.index_name = uic.index_name
AND ui.uniqueness = ?
AND table_name = ?";
my
$sth
=
$dbh
->prepare(
$sql
);
$sth
->execute(
$table
,
$type
);
my
$results
= {};
while
(
my
(
$idx
,
$col
) =
$sth
->fetchrow_array()) {
if
(!
exists
(
$results
->{
$idx
})) {
$results
->{
$idx
} = [];
}
push
@{
$results
->{
$idx
}},
$col
;
}
return
$results
;
}