--- loncom/lonsql 2000/06/26 02:42:42 1.2 +++ loncom/lonsql 2001/03/27 02:09:50 1.18 @@ -1,6 +1,8 @@ #!/usr/bin/perl # 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 Symbol; use POSIX; @@ -11,6 +13,16 @@ use Fcntl; use Tie::RefHash; 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; $run =0;#running counter to generate the query-id @@ -27,6 +39,17 @@ while ($configline=) { } 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 $PREFORK=4; # number of children to maintain, at least four spare @@ -168,7 +191,7 @@ sub make_new_child { #open database handle # making dbh global to avoid garbage collector 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)); &logthis("WARNING: Couldn't connect to database ($st secs): $@"); @@ -189,7 +212,9 @@ sub make_new_child { my $userinput = <$client>; chomp($userinput); - my ($conserver,$query)=split(/&/,$userinput); + my ($conserver,$querytmp,$customtmp)=split(/&/,$userinput); + my $query=unescape($querytmp); + my $custom=unescape($customtmp); #send query id which is pid_unixdatetime_runningcounter $queryid = $thisserver; @@ -199,15 +224,50 @@ sub make_new_child { print $client "$queryid\n"; #prepare and execute the query -# my $sth = $dbh->prepare($query); -# unless ($sth->execute()) -# { -# &logthis( -# "WARNING: Could not retrieve from database: $@" -# ); -# } -# my $result=$sth->fetch(???); - $result="123"; + my $sth = $dbh->prepare($query); + my $result; + unless ($sth->execute()) + { + &logthis("WARNING: Could not retrieve from database: $@"); + $result=""; + } + else { + my $r1=$sth->fetchall_arrayref; + my @r2; map {my $a=$_; my @b=map {escape($_)} @$a; 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"); + @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/\<$f[^\>]*\>.*?<\/$f[^\>]*\>//; + } + &logthis("found: $stuff"); + $customresult.='&custom='.escape($stuff); + } + } + $result.=$customresult; + } + # reply with result + $result.="\n" if $result; &reply("queryreply:$queryid:$result",$conserver); } @@ -262,3 +322,18 @@ sub reply { 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; +}