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; |
|
} |