package DBIx::dbMan::History;
use strict;
use locale;
use POSIX;
use DBIx::dbMan::Config;
our $VERSION = '0.05';
1;
sub new {
my $class = shift;
my $obj = bless { @_ }, $class;
$obj->{buffer} = [];
$obj->{position} = -1;
return $obj;
}
sub load_and_store {
my $obj = shift;
my $file = $obj->historyfile;
return () unless $file;
my @lines = ();
if (open F,$file) {
if ( $obj->{ -interface }->is_utf8 ) {
binmode F, ':utf8';
}
while (<F>) {
chomp;
push @lines,$_;
}
close F;
}
$obj->{buffer} = \@lines;
$obj->{position} = 1+$#lines;
}
sub load {
my $obj = shift;
my $file = $obj->historyfile;
return () unless $file;
my @lines = ();
if (open F,$file) {
if ( $obj->{ -interface }->is_utf8 ) {
binmode F, ':utf8';
}
while (<F>) {
chomp;
push @lines,$_;
}
close F;
}
return @lines;
}
sub historyfile {
my $obj = shift;
return $ENV{DBMAN_HISTORY} if $ENV{DBMAN_HISTORY};
return $obj->{-config}->history if $obj->{-config}->history;
mkdir $ENV{HOME}.'/.dbman' unless -d $ENV{HOME}.'/.dbman';
return $ENV{HOME}.'/.dbman/history';
}
sub add {
my $obj = shift;
my $line = join "\n",@_;
my $file = $obj->historyfile;
return unless $file;
if (open F,">>$file") {
if ( $obj->{ -interface }->is_utf8 ) {
binmode F, ':utf8';
}
print F "$line\n";
close F;
}
push @{$obj->{buffer}},$line;
$obj->{position} = scalar @{$obj->{buffer}};
}
sub clear {
my $obj = shift;
my $file = $obj->historyfile;
return unless $file;
unlink $file;
$obj->{buffer} = [];
$obj->{position} = -1;
}
sub prev {
my $obj = shift;
return '' if $obj->{position} < 0;
--$obj->{position};
return '' if $obj->{position} < 0;
return $obj->{buffer}->[$obj->{position}];
}
sub next {
my $obj = shift;
return '' if $obj->{position} >= scalar @{$obj->{buffer}};
++$obj->{position};
return '' if $obj->{position} >= scalar @{$obj->{buffer}};
return $obj->{buffer}->[$obj->{position}];
}
sub reverse_search {
my ($obj,$pattern,$dec) = @_;
$dec = 0 unless defined $dec;
my $curr = $obj->{position}-$dec;
while ($curr >= 0) {
if ($obj->{buffer}->[$curr] =~ /$pattern/i) {
$obj->{position} = $curr;
return $obj->{buffer}->[$obj->{position}];
}
--$curr;
}
return undef;
}