Diff for /loncom/lonsql between versions 1.2 and 1.21

version 1.2, 2000/06/26 02:42:42 version 1.21, 2001/03/27 13:35:35
Line 1 Line 1
 #!/usr/bin/perl  #!/usr/bin/perl
 # lonsql-based on the preforker:harsha jagasia:date:5/10/00  # lonsql-based on the preforker:harsha jagasia:date:5/10/00
   # 7/25 Gerd Kortemeyer
   # many different dates Scott Harrison
   # 03/22/2001 Scott Harrison
 use IO::Socket;  use IO::Socket;
 use Symbol;  use Symbol;
 use POSIX;  use POSIX;
Line 11  use Fcntl; Line 13  use Fcntl;
 use Tie::RefHash;  use Tie::RefHash;
 use DBI;  use DBI;
   
   my @metalist;
   # ----------------- Code to enable 'find' subroutine listing of the .meta files
   require "find.pl";
   sub wanted {
       (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
       -f _ &&
       /^.*\.meta$/ &&
       push(@metalist,"$dir/$_");
   }
   
   
 $childmaxattempts=10;  $childmaxattempts=10;
 $run =0;#running counter to generate the query-id  $run =0;#running counter to generate the query-id
Line 27  while ($configline=<CONFIG>) { Line 39  while ($configline=<CONFIG>) {
 }  }
 close(CONFIG);  close(CONFIG);
   
   # --------------------------------------------- Check if other instance running
   
   my $pidfile="$perlvar{'lonDaemons'}/logs/lonsql.pid";
   
   if (-e $pidfile) {
      my $lfh=IO::File->new("$pidfile");
      my $pide=<$lfh>;
      chomp($pide);
      if (kill 0 => $pide) { die "already running"; }
   }
   
 # ------------------------------------------------------------- Read hosts file  # ------------------------------------------------------------- Read hosts file
 $PREFORK=4; # number of children to maintain, at least four spare  $PREFORK=4; # number of children to maintain, at least four spare
   
Line 168  sub make_new_child { Line 191  sub make_new_child {
         #open database handle          #open database handle
  # making dbh global to avoid garbage collector   # making dbh global to avoid garbage collector
  unless (   unless (
  $dbh = DBI->connect("DBI:mysql:loncapa","www","newmysql",{ RaiseError =>1,})   $dbh = DBI->connect("DBI:mysql:loncapa","www","123",{ RaiseError =>0,PrintError=>0})
  ) {    ) { 
             my $st=120+int(rand(240));              my $st=120+int(rand(240));
     &logthis("<font color=blue>WARNING: Couldn't connect to database  ($st secs): $@</font>");      &logthis("<font color=blue>WARNING: Couldn't connect to database  ($st secs): $@</font>");
Line 189  sub make_new_child { Line 212  sub make_new_child {
     my $userinput = <$client>;      my $userinput = <$client>;
     chomp($userinput);      chomp($userinput);
                   
     my ($conserver,$query)=split(/&/,$userinput);      my ($conserver,$querytmp,
    $customtmp,$customshowtmp)=split(/&/,$userinput);
       my $query=unescape($querytmp);
       my $custom=unescape($customtmp);
       my $customshow=unescape($customshowtmp);
   
             #send query id which is pid_unixdatetime_runningcounter              #send query id which is pid_unixdatetime_runningcounter
     $queryid = $thisserver;      $queryid = $thisserver;
Line 199  sub make_new_child { Line 226  sub make_new_child {
     print $client "$queryid\n";      print $client "$queryid\n";
           
             #prepare and execute the query              #prepare and execute the query
 #    my $sth = $dbh->prepare($query);      my $sth = $dbh->prepare($query);
 #    unless ($sth->execute())      my $result;
 #    {      my @files;
 # &logthis(      unless ($sth->execute())
 # "<font color=blue>WARNING: Could not retrieve from database: $@</font>"      {
 #                );   &logthis("<font color=blue>WARNING: Could not retrieve from database: $@</font>");
 #    }   $result="";
 #            my $result=$sth->fetch(???);      }
     $result="123";      else {
    my $r1=$sth->fetchall_arrayref;
    my @r2;
    map {my $a=$_; 
        my @b=map {escape($_)} @$a;
        push @files,@{$a}[3];
        push @r2,join(",", @b)
        } (@$r1);
    $result=join("&",@r2);
       }
   
       # do custom metadata searching here and build into result
       if ($custom) {
    &logthis("am going to do custom query for $custom");
    if (@files) {
       @metalist=map {$perlvar{'lonDocRoot'}.$_.'meta'} @files;
    }
    else {
       @metalist=(); pop @metalist;
       &find("$perlvar{'lonDocRoot'}/res");
    }
   # &logthis("FILELIST:" . join(":::",@metalist));
    # if file is indicated in sql database and
    # not part of sql-relevant query, do not pattern match.
    # if file is not in sql database, output error.
    # if file is indicated in sql database and is
    # part of query result list, then do the pattern match.
    my $customresult='';
    foreach my $m (@metalist) {
       my $fh=IO::File->new($m);
       my @lines=<$fh>;
       my $stuff=join('',@lines);
       if ($stuff=~/$custom/s) {
    foreach my $f ('abstract','author','copyright',
          'creationdate','keywords','language',
          'lastrevisiondate','mime','notes',
          'owner','subject','title') {
       $stuff=~s/\n?\<$f[^\>]*\>.*?<\/$f[^\>]*\>\n?//;
    }
    my $m2=$m; my $docroot=$perlvar{'lonDocRoot'};
    $m2=~s/^$docroot//; $m2=~s/\.meta$//;
   # &logthis("found: $stuff");
    $customresult.='&custom='.escape($m2).','.escape($stuff);
       }
    }
    $result.=$customresult;
       }
       # reply with result
       $result.="\n" if $result;
             &reply("queryreply:$queryid:$result",$conserver);              &reply("queryreply:$queryid:$result",$conserver);
   
         }          }
Line 262  sub reply { Line 337  sub reply {
   return $answer;    return $answer;
 }  }
   
   # -------------------------------------------------------- Escape Special Chars
   
   sub escape {
       my $str=shift;
       $str =~ s/(\W)/"%".unpack('H2',$1)/eg;
       return $str;
   }
   
   # ----------------------------------------------------- Un-Escape Special Chars
   
   sub unescape {
       my $str=shift;
       $str =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
       return $str;
   }

Removed from v.1.2  
changed lines
  Added in v.1.21


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>