--- loncom/lonsql	2000/06/26 02:42:42	1.2
+++ loncom/lonsql	2001/03/27 13:35:35	1.21
@@ -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=<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
 $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("<font color=blue>WARNING: Couldn't connect to database  ($st secs): $@</font>");
@@ -189,7 +212,11 @@ sub make_new_child {
 	    my $userinput = <$client>;
 	    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
 	    $queryid = $thisserver;
@@ -199,15 +226,63 @@ sub make_new_child {
 	    print $client "$queryid\n";
 	    
             #prepare and execute the query
-#	    my $sth = $dbh->prepare($query);
-#	    unless ($sth->execute())
-#	    {
-#		&logthis(
-# "<font color=blue>WARNING: Could not retrieve from database: $@</font>"
-#                );
-#	    }
-#            my $result=$sth->fetch(???);
-	    $result="123";
+	    my $sth = $dbh->prepare($query);
+	    my $result;
+	    my @files;
+	    unless ($sth->execute())
+	    {
+		&logthis("<font color=blue>WARNING: Could not retrieve from database: $@</font>");
+		$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) {
+		&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);
 
         }
@@ -262,3 +337,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;
+}