package DBIx::dbMan::Extension::OracleSQL;
use strict;
use base 'DBIx::dbMan::Extension';
our $VERSION = '0.11';
1;
sub IDENTIFICATION { return "000001-000038-000011"; }
sub preference { return 3999; }
sub known_actions { return [ qw/COMMAND SQL/ ]; }
sub handle_action {
my ($obj,%action) = @_;
if ($action{action} eq 'COMMAND' and $obj->{-dbi}->driver eq 'Oracle') {
$action{processed} = 1;
$obj->{-dbi}->set('LongTruncOk',1);
if ($obj->{-mempool}->get('dbms_output')) {
$obj->{-dbi}->func(1000000,'dbms_output_enable');
$action{oracle_dbms} = 1;
}
if ($action{cmd} !~ /end;$/i) {
return %action if $action{cmd} =~ s/(;|(?<!\*)\/)$//;
}
}
if ($action{action} eq 'SQL' and $action{oper} eq 'complete' and $obj->{-dbi}->driver eq 'Oracle') {
$action{action} = 'CACHE';
my @all = ();
if ($action{context} =~ /\./) {
$action{cache_type} = 'sql_oracle_' . $action{type} . '___' . $action{context};
my $tab = $action{context}; $tab =~ s/\.[^.]*$//;
my $sth = $obj->{-dbi}->prepare(q!SELECT * FROM !.$tab.q! WHERE 0 = 1!);
if (defined $sth and not @all) {
if ($sth->execute) {
@all = map { ($action{type} eq 'FIELDS') ? $_ : $tab.'.'.$_ } @{$sth->{NAME}};
$sth->finish;
} elsif (lc $action{type} eq 'seq') { # don't work ??? why ???
if ($tab !~ /\./) { @all = map { $tab.'.'.$_ } qw/next_val curr_val/; }
}
} else {
my $d = $obj->{-dbi}->selectall_arrayref(q!
SELECT object_name
FROM all_objects
WHERE owner = ? AND object_type !.(lc $action{type} ne 'object'?((lc $action{type} eq 'context')?q! IN ('TABLE','VIEW','FUNCTION','PACKAGE')!:((lc $action{type} eq 'seq')?q! = 'SEQUENCE'!:q! = '!.uc($action{type}).q!'!)):q!IN ('PROCEDURE','FUNCTION','TRIGGER','VIEW','PACKAGE','PACKAGE BODY')!),{},uc $tab);
@all = map { uc($tab).'.'.$_->[0] } @$d if defined $d;
}
} else {
$action{cache_type} = 'sql_oracle_' . $action{type};
my $d = $obj->{-dbi}->selectall_arrayref(q!
SELECT object_name
FROM user_objects
WHERE object_type !.(lc $action{type} ne 'object'?((lc $action{type} eq 'context')?q! IN ('TABLE','VIEW','FUNCTION','PACKAGE')!:((lc $action{type} eq 'seq')?q! = 'SEQUENCE'!:q! = '!.uc($action{type}).q!'!)):q!IN ('PROCEDURE','FUNCTION','TRIGGER','VIEW','PACKAGE','PACKAGE BODY')!));
@all = map { $_->[0] } @$d if defined $d;
push @all,'DUAL';
push @all,'SYSDATE';
}
$action{list} = \@all;
}
$action{processed} = 1;
return %action;
}