DBI-Shell
view release on metacpan or search on metacpan
lib/DBI/Shell/Completion.pm view on Meta::CPAN
return unless $sh->{term};
$term = $sh->{term};
my $attribs = $term->Attribs();
$attribs->{history_length} = '500';
$pi->{term} = \$sh->{term};
$pi->{dbh} = \$sh->{dbh};
$pi->{command_prefix} = \$sh->{command_prefix};
if ($term->ReadLine eq "Term::ReadLine::Gnu") {
print "Using Term::ReadLine::Gnu\n";
# Only source the current drivers Completion, if exists.
$sh->{completion} = $pi;
# Define the completion function.
my $ssc = sub {
return $pi->sql_shell_completion(@_);
};
$attribs->{attempted_completion_function} = $ssc;
# read in the history file.
if(-e $pi->{history}) {
$sh->log ("History file $pi->{history} not restored!" )
unless($term->ReadHistory($pi->{history}));
} else {
print "Creating ${history} to store your command line history\n";
open(HISTORY, "> $pi->{history}")
or $sh->log ("Could not create $pi->{history}: $!");
close(HISTORY);
}
}
return $pi;
}
# sub load_completion {
# my $cpi = shift;
# my $sh = shift;
# my @pi;
# foreach my $where (qw(DBI/Shell/Completion DBI_Shell_Completion)) {
# my $mod = $where; $mod =~ s!/!::!g; #/ so vim see the syn correctly
# my @dir = map { -d "$_/$where" ? ("$_/$where") : () } @INC;
# foreach my $dir (@dir) {
# opendir DIR, $dir or warn "Unable to read $dir: $!\n";
# push @pi, map { s/\.pm$//; "${mod}::$_" } grep { /\.pm$/ }
# readdir DIR;
# closedir DIR;
# }
# }
# my $driver = $sh->{data_source};
# # print STDERR join( " ", @pi, $driver, "\n");
# foreach my $pi (sort @pi) {
# #local $DBI::Shell::SHELL = $sh; # publish the current shell
# eval qq{ use $pi };
# $sh->alert("Unable to load $pi: $@") if $@;
# }
# # plug-ins should remove options they recognise from (localized) @ARGV
# # by calling Getopt::Long::GetOptions (which is already in pass_through mode).
# foreach my $pi (@pi) {
# #local *ARGV = $sh->{unhandled_options};
# $pi->init($sh);
# }
# }
sub populate {
my $sh = shift;
my $list = shift;
return $loa unless $list;
return undef unless exists $loa->{$list};
# print ( "$list populate ...", join " ", @_, "\n" );
if (@_) { # User provided a list of values.
$loa->{$list} = [ @_ ];
}
return $loa->{$list};
}
# Attempt to complete on the contents of TEXT. START and END bound
# the region of rl_line_buffer that contains the word to complete.
# TEXT is the word to complete. We can use the entire contents of
# rl_line_buffer in case we want to do some simple parsing. Return
# the array of matches, or NULL if there aren't any.
sub sql_shell_completion {
my $sh = shift;
my ($text, $line, $start, $end) = @_;
my @matches = ();
undef $tbl_nm;
# Notes for future development. The $line is the complete line,
# start is where the text begins, end where text ends (looks like word
# boundies). I need to attempt to determine where I'm in the line, and
# what was the last key word given.
# print STDERR "text:$text: line:$line: start:$start: end:$end:\n";
my $cmd_p = ${$sh->{command_prefix}};
# Load the keywords.
unless (defined $loa->{sql_keywords}) {
eval {
# Not all drivers support the get_info function yet, so we
# need a fall back plan.
my $key_words = ${$sh->{dbh}}->get_info( 'SQL_KEYWORDS' );
die unless (defined $key_words);
my @key_words = split( /\s+/, $key_words);
die unless (@key_words); # Keywords not supported by driver, default
$sh->populate( q{sql_keywords}, @key_words )
unless (defined $loa->{sql_keywords});
};
if($@) {
$sh->populate( q{sql_keywords}, @{$sh->{sql}} );
}
}
( run in 0.500 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )