save point working environment variables
This commit is contained in:
parent
3ddd822c15
commit
c835810c0e
4 changed files with 105 additions and 5 deletions
79
lib/Environment/SQLite.pm
Normal file
79
lib/Environment/SQLite.pm
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
package Environment::SQLite;
|
||||||
|
|
||||||
|
use DBI;
|
||||||
|
use Cwd;
|
||||||
|
|
||||||
|
sub new {
|
||||||
|
my ($class, %args) = @_;
|
||||||
|
|
||||||
|
my $self = bless {
|
||||||
|
db_path => $args{db_path} || 'pshell_env.db'
|
||||||
|
}, $class;
|
||||||
|
|
||||||
|
# Convert to absolute path
|
||||||
|
$self->{db_path} = getcwd() . '/' . $self->{db_path} unless $self->{db_path} =~ m|^/|;
|
||||||
|
|
||||||
|
$self->_init_db;
|
||||||
|
|
||||||
|
return $self;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _init_db {
|
||||||
|
my ($self) = @_;
|
||||||
|
|
||||||
|
my $dbh = DBI->connect("dbi:SQLite:dbname=$self->{db_path}", "", "",
|
||||||
|
{ RaiseError => 1, PrintError => 0 });
|
||||||
|
|
||||||
|
$dbh->do(<<"SQL");
|
||||||
|
CREATE TABLE IF NOT EXISTS environment (
|
||||||
|
name TEXT PRIMARY KEY,
|
||||||
|
value TEXT NOT NULL
|
||||||
|
)
|
||||||
|
SQL
|
||||||
|
|
||||||
|
$dbh->disconnect;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub set {
|
||||||
|
my ($self, $name, $value) = @_;
|
||||||
|
|
||||||
|
my $dbh = DBI->connect("dbi:SQLite:dbname=$self->{db_path}", "", "",
|
||||||
|
{ RaiseError => 1, PrintError => 0 });
|
||||||
|
|
||||||
|
$dbh->do("REPLACE INTO environment (name, value) VALUES (?, ?)", undef, $name, $value);
|
||||||
|
|
||||||
|
$dbh->disconnect;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get {
|
||||||
|
my ($self, $name) = @_;
|
||||||
|
|
||||||
|
my $dbh = DBI->connect("dbi:SQLite:dbname=$self->{db_path}", "", "",
|
||||||
|
{ RaiseError => 1, PrintError => 0 });
|
||||||
|
|
||||||
|
my ($value) = $dbh->selectrow_array(
|
||||||
|
"SELECT value FROM environment WHERE name = ?", undef, $name);
|
||||||
|
|
||||||
|
$dbh->disconnect;
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub get_all {
|
||||||
|
my ($self) = @_;
|
||||||
|
|
||||||
|
my $dbh = DBI->connect("dbi:SQLite:dbname=$self->{db_path}", "", "",
|
||||||
|
{ RaiseError => 1, PrintError => 0 });
|
||||||
|
|
||||||
|
my $sth = $dbh->prepare("SELECT name, value FROM environment");
|
||||||
|
$sth->execute;
|
||||||
|
|
||||||
|
my %env;
|
||||||
|
while (my $row = $sth->fetchrow_arrayref) {
|
||||||
|
$env{$row->[0]} = $row->[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
$dbh->disconnect;
|
||||||
|
return %env;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
23
pshell.pl
23
pshell.pl
|
@ -2,13 +2,17 @@
|
||||||
|
|
||||||
use lib 'lib';
|
use lib 'lib';
|
||||||
use History::SQLite;
|
use History::SQLite;
|
||||||
|
use Environment::SQLite;
|
||||||
use Term::ReadLine;
|
use Term::ReadLine;
|
||||||
use Cwd;
|
use Cwd;
|
||||||
|
|
||||||
# Initialize command history
|
# Initialize command history and environment
|
||||||
my $history = History::SQLite->new(
|
my $history = History::SQLite->new(
|
||||||
db_path => 'pshell_history.db'
|
db_path => 'pshell_history.db'
|
||||||
);
|
);
|
||||||
|
my $env = Environment::SQLite->new(
|
||||||
|
db_path => 'pshell_env.db'
|
||||||
|
);
|
||||||
|
|
||||||
print "Perl Shell (pshell) - Type 'exit' to quit\n";
|
print "Perl Shell (pshell) - Type 'exit' to quit\n";
|
||||||
|
|
||||||
|
@ -19,6 +23,10 @@ $term->ornaments(0);
|
||||||
my @history = $history->get_all;
|
my @history = $history->get_all;
|
||||||
$term->addhistory($_) for @history;
|
$term->addhistory($_) for @history;
|
||||||
|
|
||||||
|
# Load environment variables
|
||||||
|
my %env_vars = $env->get_all;
|
||||||
|
$ENV{$_} = $env_vars{$_} for keys %env_vars;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
my $cwd = getcwd();
|
my $cwd = getcwd();
|
||||||
my $prompt = "pshell:$cwd> ";
|
my $prompt = "pshell:$cwd> ";
|
||||||
|
@ -38,6 +46,19 @@ while (1) {
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Handle environment variable assignment
|
||||||
|
if ($command =~ /^export\s+(\w+)=(.*)/) {
|
||||||
|
$ENV{$1} = $2;
|
||||||
|
$env->set($1, $2);
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Handle environment variable display
|
||||||
|
if ($command eq 'env') {
|
||||||
|
print "$_=$ENV{$_}\n" for sort keys %ENV;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
# Save command to history
|
# Save command to history
|
||||||
$history->add($command);
|
$history->add($command);
|
||||||
$term->addhistory($command);
|
$term->addhistory($command);
|
||||||
|
|
BIN
pshell_env.db
Normal file
BIN
pshell_env.db
Normal file
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue