--- loncom/lonsql	2002/05/11 21:26:53	1.42
+++ loncom/lonsql	2002/06/18 21:14:23	1.48
@@ -3,7 +3,7 @@
 # The LearningOnline Network
 # lonsql - LON TCP-MySQL-Server Daemon for handling database requests.
 #
-# $Id: lonsql,v 1.42 2002/05/11 21:26:53 harris41 Exp $
+# $Id: lonsql,v 1.48 2002/06/18 21:14:23 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -46,7 +46,7 @@
 ## ORGANIZATION OF THIS PERL SCRIPT                                          ##
 ## 1. Modules used                                                           ##
 ## 2. Enable find subroutine                                                 ##
-## 3. Read httpd access.conf and get variables                               ##
+## 3. Read httpd config files and get variables                              ##
 ## 4. Make sure that database can be accessed                                ##
 ## 5. Make sure this process is running from user=www                        ##
 ## 6. Check if other instance is running                                     ##
@@ -80,8 +80,9 @@ sub wanted {
 $childmaxattempts=10;
 $run =0;#running counter to generate the query-id
 
-# ------------------------------------------- Read access.conf and loncapa.conf
-my $perlvarref=LONCAPA::Configuration::read_conf('access.conf','loncapa.conf');
+# -------------------------------- Read loncapa_apache.conf and loncapa.conf
+my $perlvarref=LONCAPA::Configuration::read_conf('loncapa_apache.conf',
+                                                 'loncapa.conf');
 my %perlvar=%{$perlvarref};
 
 # ------------------------------------- Make sure that database can be accessed
@@ -188,6 +189,78 @@ sub logthis {
     my $local=localtime($now);
     print $fh "$local ($$): $message\n";
 }
+
+# ------------------------------------------------------------------ Course log
+
+sub courselog {
+    my ($path,$command)=@_;
+    my %filters=();
+    foreach (split(/\:/,&unescape($command))) {
+	my ($name,$value)=split(/\=/,$_);
+        $filters{$name}=$value;
+    }
+    my @results=();
+    open(IN,$path.'/activity.log') or return ('file_error');
+    while ($line=<IN>) {
+        chomp($line);
+        my ($timestamp,$host,$log)=split(/\:/,$line);
+        foreach (split(/\&/,&unescape($log))) {
+	    my ($time,$res,$uname,$udom,$action,$values)=split(/\:/,$_);
+            $res=&unescape($res);
+            $values=&unescape($values);
+            my $include=1;
+            if (($filters{'username'}) && ($uname ne $filters{'username'})) 
+                                                               { $include=0; }
+            if (($filters{'domain'}) && ($udom ne $filters{'domain'})) 
+                                                               { $include=0; }
+            if (($filters{'url'}) && ($res!~/$filters{'url'}/)) 
+                                                               { $include=0; }
+            if (($filters{'start'}) && ($time<$filters{'start'})) 
+                                                               { $include=0; }
+            if (($filters{'end'}) && ($time>$filters{'end'})) 
+                                                               { $include=0; }
+            if (($filters{'action'} eq 'view') && ($action)) 
+                                                               { $include=0; }
+            if (($filters{'action'} eq 'submit') && ($action ne 'POST')) 
+                                                               { $include=0; }
+            if (($filters{'action'} eq 'grade') && ($action ne 'CSTORE')) 
+                                                               { $include=0; }
+            if ($include) {
+	       push(@results,$time.':'.$res.':'.$uname.':'.$udom.':'.
+                                            $action.':'.$values);
+            }
+       }
+    }
+    close IN;
+    return join('&',sort(@results));
+}
+
+# -------------------------------------------------------------------- User log
+
+sub userlog {
+    my ($path,$command)=@_;
+    my %filters=();
+    foreach (split(/\:/,&unescape($command))) {
+	my ($name,$value)=split(/\=/,$_);
+        $filters{$name}=$value;
+    }
+    my @results=();
+    open(IN,$path.'/activity.log') or return ('file_error');
+    while ($line=<IN>) {
+        chomp($line);
+        my ($timestamp,$host,$log)=split(/\:/,$line);
+        $log=&unescape($log);
+        my $include=1;
+        if (($filters{'action'} eq 'log') && ($log!~/^Log/)) { $include=0; }
+        if ($include) {
+	   push(@results,$timestamp.':'.$log);
+        }
+    }
+    close IN;
+    return join('&',sort(@results));
+}
+
+
 # ---------------------------------------------------- Fork once and dissociate
 $fpid=fork;
 exit if $fpid;
@@ -275,11 +348,9 @@ sub make_new_child {
 	    my $userinput = <$client>;
 	    chomp($userinput);
 	    	    
-	    my ($conserver,$querytmp,
-		$customtmp,$customshowtmp)=split(/&/,$userinput);
-	    my $query=unescape($querytmp);
-	    my $custom=unescape($customtmp);
-	    my $customshow=unescape($customshowtmp);
+	    my ($conserver,$query,
+		$arg1,$arg2,$arg3)=split(/&/,$userinput);
+	    my $query=unescape($query);
 
             #send query id which is pid_unixdatetime_runningcounter
 	    $queryid = $thisserver;
@@ -288,12 +359,42 @@ sub make_new_child {
 	    $queryid .= $run;
 	    print $client "$queryid\n";
 	    
-	    &logthis("QUERY: $query");
-	    &logthis("QUERY: $query");
+	    &logthis("QUERY: $query - $arg1 - $arg2 - $arg3");
 	    sleep 1;
+
+            my $result='';
+
+# ---------- At this point, query is received, query-ID assigned and sent back 
+# $query eq 'logquery' will mean that this is a query against log-files
+
+
+	   if (($query eq 'userlog') || ($query eq 'courselog')) {
+# ----------------------------------------------------- beginning of log query
+#
+# this goes against a user's log file
+#
+	       my $udom=&unescape($arg1);
+	       my $uname=&unescape($arg2);
+               my $command=&unescape($arg3);
+               my $path=&propath($udom,$uname);
+               if (-e "$path/activity.log") {
+		   if ($query eq 'userlog') {
+                       $result=&userlog($path,$command);
+                   } else {
+                       $result=&courselog($path,$command);
+                   }
+               } else {
+		   &logthis('Unable to do log query: '.$uname.'@'.$udom);
+	           $result='no_such_file';
+	       }
+# ------------------------------------------------------------ end of log query
+          } else {
+# -------------------------------------------------------- This is an sql query
+	    my $custom=unescape($arg1);
+	    my $customshow=unescape($arg2);
             #prepare and execute the query
 	    my $sth = $dbh->prepare($query);
-	    my $result;
+
 	    my @files;
 	    my $subsetflag=0;
 	    if ($query) {
@@ -370,8 +471,16 @@ sub make_new_child {
 		$result=join("&",@r2) unless $query;
 		$result.=$customresult;
 	    }
-	    # reply with result
-	    $result.="\n" if $result;
+# ------------------------------------------------------------ end of sql query
+	   }
+
+            # result does need to be escaped
+
+            $result=&escape($result);
+
+	    # reply with result, append \n unless already there
+
+	    $result.="\n" unless ($result=~/\n$/);
             &reply("queryreply:$queryid:$result",$conserver);
 
         }