[LON-CAPA-cvs] cvs: loncom /interface lonmeta.pm

matthew lon-capa-cvs@mail.lon-capa.org
Wed, 16 Jun 2004 18:33:47 -0000


matthew		Wed Jun 16 14:33:47 2004 EDT

  Modified files:              
    /loncom/interface	lonmeta.pm 
  Log:
  Added &get_dynamic_metadata_from_sql for gerd.
  
  
Index: loncom/interface/lonmeta.pm
diff -u loncom/interface/lonmeta.pm:1.79 loncom/interface/lonmeta.pm:1.80
--- loncom/interface/lonmeta.pm:1.79	Wed Jun 16 10:30:15 2004
+++ loncom/interface/lonmeta.pm	Wed Jun 16 14:33:46 2004
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Metadata display handler
 #
-# $Id: lonmeta.pm,v 1.79 2004/06/16 14:30:15 matthew Exp $
+# $Id: lonmeta.pm,v 1.80 2004/06/16 18:33:46 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -41,6 +41,88 @@
 use Apache::lonmsg;
 
 
+############################################################
+############################################################
+##
+## &get_dynamic_metadata_from_sql($url)
+## 
+## Queries sql database for dynamic metdata
+## Returns a hash of hashes, with keys of urls which match $url
+## Returned fields are given below.
+##
+## Examples:
+## 
+## %DynamicMetadata = &Apache::lonmeta::get_dynmaic_metadata_from_sql
+##     ('/res/msu/korte/');
+##
+## $DynamicMetadata{'/res/msu/korte/example.problem'}->{$field}
+##
+############################################################
+############################################################
+sub get_dynamic_metadata_from_sql {
+    my ($url) = shift();
+    # &Apache::lonnet::logthis('url = '.$url);
+    my ($authordom,$author)=($url=~m:^/res/(\w+)/(\w+)/:);
+    if (! defined($authordom)) {
+        $authordom = shift();
+    }
+    if  (! defined($author)) { 
+        $author = shift();
+    }
+    if (! defined($authordom) || ! defined($author)) {
+        return ();
+    }
+    my @Fields = ('url',
+                  'goto','goto_list',
+                  'comefrom','comefrom_list',
+                  'sequsage','sequsage_list',
+                  'stdno','stdno_list',
+                  'avetries','avetries_list',
+                  'difficulty','difficulty_list',
+                  'disc','disc_list',
+                  'clear','technical','correct',
+                  'helpful','depth');
+    #
+    my $query = 'SELECT '.join(',',@Fields).
+        ' FROM metadata WHERE url LIKE "'.$url.'%"';
+    my $server = &Apache::lonnet::homeserver($author,$authordom);
+    my $reply = &Apache::lonnet::metadata_query($query,undef,undef,
+                                                ,[$server]);
+    return () if (! defined($reply) || ref($reply) ne 'HASH');
+    my $filename = $reply->{$server};
+    if (! defined($filename) || $filename =~ /^error/) {
+        return ();
+    }
+    my $max_time = time + 10; # wait 10 seconds for results at most
+    my %ReturnHash;
+    #
+    # Look for results
+    my $finished = 0;
+    while (! $finished && time < $max_time) {
+        my $datafile=$Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/'.$filename;
+        if (! -e "$datafile.end") { next; }
+        my $fh;
+        if (!($fh=Apache::File->new($datafile))) { next; }
+        while (my $result = <$fh>) {
+            chomp($result);
+            next if (! $result);
+            my @Data = 
+                map { 
+                    &Apache::lonnet::unescape($_); 
+                } split(',',$result);
+            my $url = $Data[0];
+            for (my $i=0;$i<=$#Fields;$i++) {
+                $ReturnHash{$url}->{$Fields[$i]}=$Data[$i];
+                # &Apache::lonnet::logthis('  '.$Fields[$i].' => '.$Data[$i]);
+            }
+        }
+        $finished = 1;
+    }
+    #
+    return %ReturnHash;
+}
+
+
 # Fetch and evaluate dynamic metadata
 sub dynamicmeta {
     my $url=&Apache::lonnet::declutter(shift);