save point working environment variables

This commit is contained in:
kake26 2025-04-13 23:25:56 -05:00
parent 3ddd822c15
commit c835810c0e
Signed by: kake26
GPG key ID: E0A989B571D1F99F
4 changed files with 105 additions and 5 deletions

79
lib/Environment/SQLite.pm Normal file
View 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;

View file

@ -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

Binary file not shown.