--- loncom/lonsql 2001/03/27 19:11:12 1.25 +++ loncom/lonsql 2001/04/16 18:36:22 1.33 @@ -23,7 +23,6 @@ sub wanted { push(@metalist,"$dir/$_"); } - $childmaxattempts=10; $run =0;#running counter to generate the query-id @@ -39,6 +38,20 @@ while ($configline=) { } close(CONFIG); +# ------------------------------------- Make sure that database can be accessed +{ + my $dbh; + unless ( + $dbh = DBI->connect("DBI:mysql:loncapa","www",$perlvar{'lonSqlAccess'},{ RaiseError =>0,PrintError=>0}) + ) { + print "Cannot connect to database!\n"; + exit; + } + else { + $dbh->disconnect; + } +} + # --------------------------------------------- Check if other instance running my $pidfile="$perlvar{'lonDaemons'}/logs/lonsql.pid"; @@ -60,7 +73,6 @@ while ($configline=) { chomp($ip); $hostip{$ip}=$id; - if ($id eq $perlvar{'lonHostID'}) { $thisserver=$name; } $PREFORK++; @@ -191,12 +203,11 @@ sub make_new_child { #open database handle # making dbh global to avoid garbage collector unless ( - $dbh = DBI->connect("DBI:mysql:loncapa","www","123",{ RaiseError =>0,PrintError=>0}) + $dbh = DBI->connect("DBI:mysql:loncapa","www",$perlvar{'lonSqlAccess'},{ RaiseError =>0,PrintError=>0}) ) { - my $st=120+int(rand(240)); + sleep(10+int(rand(20))); &logthis("WARNING: Couldn't connect to database ($st secs): $@"); print "database handle error\n"; - sleep($st); exit; }; @@ -233,26 +244,27 @@ sub make_new_child { my $result; my @files; my $subsetflag=0; - 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 @files,@{$a}[3]; - push @r2,join(",", @b) - } (@$r1); - $result=join("&",@r2); + if ($query) { + 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 @files,@{$a}[3]; + push @r2,join(",", @b) + } (@$r1); + $result=join("&",@r2); + } } - # do custom metadata searching here and build into result - if ($custom) { + if ($custom or $customshow) { &logthis("am going to do custom query for $custom"); - if (@files) { + if ($query) { @metalist=map {$perlvar{'lonDocRoot'}.$_.'.meta'} @files; } else { @@ -266,6 +278,7 @@ sub make_new_child { # if file is indicated in sql database and is # part of query result list, then do the pattern match. my $customresult=''; + my @r2; foreach my $m (@metalist) { my $fh=IO::File->new($m); my @lines=<$fh>; @@ -278,11 +291,24 @@ sub make_new_child { $stuff=~s/\n?\<$f[^\>]*\>.*?<\/$f[^\>]*\>\n?//; } my $m2=$m; my $docroot=$perlvar{'lonDocRoot'}; - $m2=~s/^$docroot//; $m2=~s/\.meta$//; + $m2=~s/^$docroot//; + $m2=~s/\.meta$//; + unless ($query) { + my $q2="select * from metadata where url like '$m2'"; + my $sth = $dbh->prepare($q2); + $sth->execute(); + my $r1=$sth->fetchall_arrayref; + map {my $a=$_; + my @b=map {escape($_)} @$a; + push @files,@{$a}[3]; + push @r2,join(",", @b) + } (@$r1); + } # &logthis("found: $stuff"); $customresult.='&custom='.escape($m2).','.escape($stuff); } } + $result=join("&",@r2) unless $query; $result.=$customresult; } # reply with result @@ -337,6 +363,7 @@ sub reply { } } else { $answer='self_reply'; + $answer=subreply($cmd,$server); } return $answer; }