package History::SQLite; use DBI; use Cwd; sub new { my ($class, %args) = @_; my $self = bless { db_path => $args{db_path} || 'command_history.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 command_history ( id INTEGER PRIMARY KEY AUTOINCREMENT, command TEXT NOT NULL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ) SQL $dbh->disconnect; } sub add { my ($self, $command) = @_; my $dbh = DBI->connect("dbi:SQLite:dbname=$self->{db_path}", "", "", { RaiseError => 1, PrintError => 0 }); $dbh->do("INSERT INTO command_history (command) VALUES (?)", undef, $command); $dbh->disconnect; } sub get_all { my ($self) = @_; my $dbh = DBI->connect("dbi:SQLite:dbname=$self->{db_path}", "", "", { RaiseError => 1, PrintError => 0 }); my $sth = $dbh->prepare("SELECT command FROM command_history ORDER BY timestamp"); $sth->execute; my @commands; while (my $row = $sth->fetchrow_arrayref) { push @commands, $row->[0]; } $dbh->disconnect; return @commands; } 1;