remove Prot.pm, sort %valid fields
[spider.git] / perl / DXDb.pm
index a7f31acca8ec1f4e07b59c187b910e252b77e812..5d96e6cf2029db4ad798a699b350ff1f877ef392 100644 (file)
@@ -21,27 +21,28 @@ $dbbase = "$main::root/db";         # where all the databases are kept;
 %avail = ();                                   # The hash contains a list of all the databases
 %valid = (
                  accesst => '9,Last Accs Time,atime',
+                 allowread => '9,Allowed read,parray',
+                 allowupd => '9,Allow upd,parray',
+                 atemplate => '9,App Templates,parray',
+                 cal => '0,No Key txt',
+                 chain => '0,Search these,parray',
                  createt => '9,Create 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',
+                 disable => '0,Disabled?,yesno',
                  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',
+                 lastt => '9,Last Upd Time,atime',
+                 localcmd => '0,Local Command',
+                 name => '0,Name',
+                 nf => '0,Not Found txt',
+                 post => '0,Tail txt',
+                 pre => '0,Heading txt',
+                 remote => '0,Remote Database',
+                 tae => '9,End App txt',
+                 te => '9,End Upd txt',
+                 template => '9,Upd Templates,parray',
                 );
 
 $lastprocesstime = time;
@@ -76,9 +77,10 @@ sub load
 {
        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;
        }
 }
 
@@ -148,9 +150,22 @@ sub getkey
        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;
        }
@@ -180,13 +195,18 @@ sub new
        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
@@ -218,81 +238,58 @@ sub normal
 #
 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]") if $mchan;
-                       }
-                       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
@@ -338,16 +335,19 @@ sub field_prompt
        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;