use DXLog;
use DXUtil;
use DB_File;
-
-use Carp;
+use DXDebug;
use vars qw($opentime $dbbase %avail %valid $lastprocesstime $nextstream %stream);
$dbbase = "$main::root/db"; # where all the databases are kept;
%avail = (); # The hash contains a list of all the databases
%valid = (
- accesst => '9,Last Access Time,atime',
+ accesst => '9,Last Accs Time,atime',
createt => '9,Create Time,atime',
- lastt => '9,Last Update Time,atime',
+ lastt => '9,Last Upd Time,atime',
name => '0,Name',
db => '9,DB Tied hash',
remote => '0,Remote Database',
+ pre => '0,Heading txt',
+ post => '0,Tail txt',
+ chain => '0,Search these,parray',
+ disable => '0,Disabled?,yesno',
+ nf => '0,Not Found txt',
+ cal => '0,No Key txt',
+ allowread => '9,Allowed read,parray',
+ denyread => '9,Deny read,parray',
+ allowupd => '9,Allow upd,parray',
+ denyupd => '9,Deny upd,parray',
+ fwdupd => '9,Forw upd to,parray',
+ template => '9,Upd Templates,parray',
+ te => '9,End Upd txt',
+ tae => '9,End App txt',
+ atemplate => '9,App Templates,parray',
+ help => '0,Help txt,parray',
+ localcmd => '0,Local Command',
);
$lastprocesstime = time;
$nextstream = 0;
%stream = ();
+use vars qw($VERSION $BRANCH);
+$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
+$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ || (0,0));
+$main::build += $VERSION;
+$main::branch += $BRANCH;
+
# allocate a new stream for this request
sub newstream
{
{
my $s = readfilestr($dbbase, "dbs", "pl");
if ($s) {
- my $a = { eval $s } ;
+ my $a;
+ eval "\$a = $s";
confess $@ if $@;
- %avail = %{$a} if $a
+ %avail = ( %$a ) if ref $a;
}
}
# save all the database descriptors
sub save
{
- my $date = cldatetime($main::systime);
-
- writefilestr($dbbase, "dbs", "pl", \%avail, "#\n# database descriptor file\n# Don't alter this by hand unless you know what you are doing\n# last modified $date\n#\n");
+ closeall();
+ writefilestr($dbbase, "dbs", "pl", \%avail);
}
# get the descriptor of the database you want.
# search for a partial if not found direct
unless ($r) {
- for (values %avail) {
+ for (sort { $a->{name} cmp $b->{name} }values %avail) {
if ($_->{name} =~ /^$name/) {
$r = $_;
last;
{
my $self = shift;
if ($self->{db}) {
- untie $self->{db};
+ undef $self->{db};
+ delete $self->{db};
}
}
my $key = uc shift;
my $value;
+ # massage the key
+ $key =~ s/[\@\$\&\%\*]+//g;
+ $key =~ s/^[\.\/]+//g;
+
# make sure we are open
$self->open;
- if ($self->{db}) {
+ if ($self->{localcmd}) {
+ my $dxchan = $main::me;
+ $dxchan->{remotecmd} = 1; # for the benefit of any command that needs to know
+ my $oldpriv = $dxchan->{priv};
+ $dxchan->{priv} = 0;
+ my @in = (DXCommandmode::run_cmd($dxchan, "$self->{localcmd} $key"));
+ $dxchan->{priv} = $oldpriv;
+ delete $dxchan->{remotecmd};
+ return @in ? join("\n", @in) : undef;
+ } elsif ($self->{db}) {
my $s = $self->{db}->get($key, $value);
return $s ? undef : $value;
}
my $self = bless {};
my $name = shift;
my $remote = shift;
+ my $chain = shift;
+ my $cmd = shift;
+
$self->{name} = lc $name;
$self->{remote} = uc $remote if $remote;
+ $self->{chain} = $chain if $chain && ref $chain;
$self->{accesst} = $self->{createt} = $self->{lastt} = $main::systime;
+ $self->{localcmd} = lc $cmd if $cmd;
+
$avail{$self->{name}} = $self;
mkdir $dbbase, 02775 unless -e $dbbase;
save();
+ return $self;
}
# delete a database
#
sub process
{
- my ($dxchan, $line) = @_;
-
- # this is periodic processing
- if (!$dxchan || !$line) {
- if ($main::systime - $lastprocesstime >= 60) {
- if (%avail) {
- for (values %avail) {
- if ($main::systime - $_->{accesst} > $opentime) {
- $_->close;
- }
+ if ($main::systime - $lastprocesstime >= 60) {
+ if (%avail) {
+ for (values %avail) {
+ if ($main::systime - $_->{accesst} > $opentime) {
+ $_->close;
}
}
- $lastprocesstime = $main::systime;
}
- return;
+ $lastprocesstime = $main::systime;
}
+}
- my @f = split /\^/, $line;
- my ($pcno) = $f[0] =~ /^PC(\d\d)/; # just get the number
+sub handle_37
+{
- # route out ones that are not for us
- if ($f[1] eq $main::mycall) {
- ;
- } else {
- $dxchan->route($f[1], $line);
- return;
- }
+}
- SWITCH: {
- if ($pcno == 37) { # probably obsolete
- last SWITCH;
- }
+sub handle_44
+{
+ my $self = shift;
- if ($pcno == 44) { # incoming DB Request
- my $db = getdesc($f[4]);
- if ($db) {
- if ($db->{remote}) {
- sendremote($dxchan, $f[2], $f[3], $dxchan->msg('dx1', $db->{remote}));
- } else {
- my $value = $db->getkey($f[5]);
- if ($value) {
- my @out = split /\n/, $value;
- sendremote($dxchan, $f[2], $f[3], @out);
- } else {
- sendremote($dxchan, $f[2], $f[3], $dxchan->msg('dx2', $f[5], $db->{name}));
- }
- }
- } else {
- sendremote($dxchan, $f[2], $f[3], $dxchan->msg('dx3', $f[4]));
- }
- last SWITCH;
- }
+ # incoming DB Request
+ my @in = DXCommandmode::run_cmd($self, "dbshow $_[4] $_[5]");
+ sendremote($self, $_[2], $_[3], @in);
+}
- if ($pcno == 45) { # incoming DB Information
- my $n = getstream($f[3]);
- if ($n) {
- my $mchan = DXChannel->get($n->{call});
- $mchan->send($f[2] . ":$f[4]");
- }
- last SWITCH;
- }
+sub handle_45
+{
+ my $self = shift;
- if ($pcno == 46) { # incoming DB Complete
- delstream($f[3]);
- last SWITCH;
- }
+ # incoming DB Information
+ my $n = getstream($_[3]);
+ if ($n) {
+ my $mchan = DXChannel::get($n->{call});
+ $mchan->send($_[2] . ":$_[4]") if $mchan;
+ }
+}
- if ($pcno == 47) { # incoming DB Update request
- last SWITCH;
- }
+sub handle_46
+{
+ my $self = shift;
- if ($pcno == 48) { # incoming DB Update request
- last SWITCH;
- }
- }
+ # incoming DB Complete
+ delstream($_[3]);
+}
+
+sub handle_47
+{
+}
+
+sub handle_48
+{
}
# send back a trache of data to the remote
$dxchan->send(DXProt::pc46($main::mycall, $tonode, $stream));
}
+# print a value from the db reference
+sub print
+{
+ my $self = shift;
+ my $s = shift;
+ return $self->{$s} ? $self->{$s} : undef;
+}
+
# various access routines
#
return $valid{$ele};
}
-no strict;
+#no strict;
sub AUTOLOAD
{
- my $self = shift;
+ no strict;
my $name = $AUTOLOAD;
return if $name =~ /::DESTROY$/;
- $name =~ s/.*:://o;
+ $name =~ s/^.*:://o;
confess "Non-existant field '$AUTOLOAD'" if !$valid{$name};
- @_ ? $self->{$name} = shift : $self->{$name} ;
+ # this clever line of code creates a subroutine which takes over from autoload
+ # from OO Perl - Conway
+ *$AUTOLOAD = sub {@_ > 1 ? $_[0]->{$name} = $_[1] : $_[0]->{$name}};
+ goto &$AUTOLOAD;
}
1;