AcePerl
view release on metacpan or search on metacpan
examples/ace.pl view on Meta::CPAN
#!/usr/bin/perl
# Simple interface to acedb.
# Uses readline for command-line editing if available.
use lib '..','..blib/lib','../blib/arch';
use Ace 1.66;
use Getopt::Long;
use Text::ParseWords;
use strict vars;
use vars qw/@CLASSES @HELP_TOPICS/;
use constant DEBUG => 0;
my ($HOST,$PORT,$PATH,$TCSH,$URL,$AUTOSAVE,$USER,$PASS,@EXEC);
GetOptions('host=s' => \$HOST,
'port=i' => \$PORT,
'path=s' => \$PATH,
'tcsh' => \$TCSH,
'url' => \$URL,
'login:s' => \$USER,
'user:s' => \$USER,
'password:s' => \$PASS,
'save' => \$AUTOSAVE,
'exec=s' => \@EXEC,
) || die <<USAGE;
Usage: $0 [options] [URL]
Interactive Perl client for ACEDB
Options (can be abbreviated):
-host <hostname> Server host (localhost)
-port <port> Server port (200005)
-path <db path> Local database path (no default)
-url <url> Server URL (see below
-login <user> Username
-pass <pass> Password
-tcsh Use T-shell completion mode
-save Save database updates automatically
-exec <command> Run a command and quit
Respects the environment variables \$ACEDB_HOST and \$ACEDB_PORT, if present.
You can edit the command line using the cursor keys and emacs style
key bindings. Use up and down arrows (or ^P, ^N) to access the history.
The tab key completes partial commands. In tcsh mode, the tab key cycles
among the completions, otherwise pressing the tab key a second time lists
all the possibilities.
You may use multiple -exec switches to run a sequence of commands, or
separate multiple commands in a single string by semicolons:
ace.pl -e 'find Author Thierry-Mieg*' -e 'show'
ace.pl -e 'find Author Thierry-Mieg*; show'
Server URLs:
rpcace://hostname:port RPC server
sace://hostname:port Socket server
tace:/path/to/database Local database
/path/to/database Local database
Usernames can be provided as sace://user\@hostname:port
USAGE
;
$HOST ||= $ENV{ACEDB_HOST} || 'localhost';
$PORT ||= $ENV{ACEDB_PORT} || 200005;
$URL = shift if $ARGV[0] =~ /^(rpcace|sace|tace):/;
my $PROMPT = "aceperl> ";
$USER ||= $1 if $URL && $URL=~ m!//(\w+)\@!;
$PASS ||= get_passwd($USER) if $USER;
my $DB = $URL ? Ace->connect(-url=>$URL,-user=>$USER,-pass=>$PASS)
: $PATH ? Ace->connect(-path=>$PATH)
: Ace->connect(-host=>$HOST,-port=>$PORT,-user=>$USER,-pass=>$PASS);
$DB || die "Connection failure: ",Ace->error,"\n";
$DB->auto_save($AUTOSAVE);
if (@EXEC) {
foreach (@EXEC) {
foreach (split (';'))
{ evaluate($_); }
examples/ace.pl view on Meta::CPAN
return grep(/^$txt/i,@readline::rl_basic_commands);
}
# This handles the
sub setup_parse {
my ($command,$file) = @_;
my (@files) = glob($file);
# if we're local, then we just create a series
# of parse commands and let tace take care of reading
# the file
return map {"parse $_"} @files if $PATH;
# if we're talking to a remote server, we create a series of parse
# commands and stop at the first file that we find
my @c;
local(*F);
local($/) = undef; # file slurp
foreach (@files) {
open (F,$_) || die "Couldn't open $_: $!";
print "parse $_\n";
my $result = $DB->raw_query(scalar(<F>),1);
print $result;
return if $result=~/error|sorry/i and $command ne 'pparse';
close F;
}
return ();
}
sub get_help_topics {
return () unless $DB;
my $result = $DB->raw_query('help topics');
return grep(/^About/../^nohelp/,split(' ',$result));
}
sub debug {
return unless DEBUG;
my @text = @_;
warn "\n",@text,"\n";
$readline::force_redraw++;
readline::redisplay();
}
sub read_top_material {
while ($DB->db->status == STATUS_PENDING) {
my $h = $DB->db->low_read;
$h=~s/\A\s+\*\*\*.+\.\n\n//s;
$h=~s!\n// Type.*\n!!s;
$h=~s/acedb> \Z//;
$h=~s/\0+\Z//; # get rid of nulls in data stream!
print $h;
}
}
sub get_passwd {
my $user = shift;
local $| = 1;
chomp(my $settings = `stty -g </dev/tty`);
system "stty -echo </dev/tty";
print $ENV{EMACS} ? "password: " : "$user password: ";
chomp(my $password = <STDIN>);
print "\n";
system "stty $settings </dev/tty";
return $password;
}
( run in 0.728 second using v1.01-cache-2.11-cpan-fe3c2283af0 )