[LON-CAPA-cvs] cvs: loncom /metadata_database searchcat.pl

matthew lon-capa-cvs@mail.lon-capa.org
Thu, 19 Jun 2003 20:24:58 -0000


matthew		Thu Jun 19 16:24:58 2003 EDT

  Modified files:              
    /loncom/metadata_database	searchcat.pl 
  Log:
  &dynamic_metadata 
     while(each) instead of keys, so we only read the db file once.
     study the regular expression before we do a bunch of regex matches
  metadata database update code:
     Use statement handlers to do quoting
     No longer bother to check if something is in the database before 
         telling MySQL to delete it - we just tell it to delete it and let
         it do what must be done.
  
  
Index: loncom/metadata_database/searchcat.pl
diff -u loncom/metadata_database/searchcat.pl:1.33 loncom/metadata_database/searchcat.pl:1.34
--- loncom/metadata_database/searchcat.pl:1.33	Thu Jun 19 15:34:27 2003
+++ loncom/metadata_database/searchcat.pl	Thu Jun 19 16:24:57 2003
@@ -2,7 +2,7 @@
 # The LearningOnline Network
 # searchcat.pl "Search Catalog" batch script
 #
-# $Id: searchcat.pl,v 1.33 2003/06/19 19:34:27 matthew Exp $
+# $Id: searchcat.pl,v 1.34 2003/06/19 20:24:57 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -125,42 +125,42 @@
         my $regexp=$url;
         $regexp=~s/(\W)/\\$1/g;
         $regexp='___'.$regexp.'___([a-z]+)$';
-        foreach (keys %evaldata) {
-            my $key=&unescape($_);
-            if ($key=~/$regexp/) {
-                my $ctype=$1;
-                if (defined($cnt{$ctype})) { 
-                    $cnt{$ctype}++; 
-                } else { 
-                    $cnt{$ctype}=1; 
+        study($regexp);
+        while (my ($key,$value) = each(%evaldata)) {
+            $key=&unescape($key);
+            next if ($key !~ /$regexp/);
+            my $ctype=$1;
+            if (defined($cnt{$ctype})) { 
+                $cnt{$ctype}++; 
+            } else { 
+                $cnt{$ctype}=1; 
+            }
+            unless ($listitems{$ctype} eq 'app') {
+                if (defined($sum{$ctype})) {
+                    $sum{$ctype}+=$value;
+                } else {
+                    $sum{$ctype}=$value;
                 }
-                unless ($listitems{$ctype} eq 'app') {
-                    if (defined($sum{$ctype})) {
-                        $sum{$ctype}+=$evaldata{$_};
-                    } else {
-                        $sum{$ctype}=$evaldata{$_};
+            } else {
+                if (defined($sum{$ctype})) {
+                    if ($value) {
+                        $sum{$ctype}.='<hr>'.$value;
                     }
                 } else {
-                    if (defined($sum{$ctype})) {
-                        if ($evaldata{$_}) {
-                            $sum{$ctype}.='<hr>'.$evaldata{$_};
-                        }
-                    } else {
-                        $sum{$ctype}=''.$evaldata{$_};
-                    }
-                }
-                if ($ctype ne 'count') {
-                    $newevaldata{$_}=$evaldata{$_};
+                    $sum{$ctype}=''.$value;
                 }
             }
+            if ($ctype ne 'count') {
+                $newevaldata{$_}=$value;
+            }
         }
-        foreach (keys %cnt) {
-            if ($listitems{$_} eq 'avg') {
-                $returnhash{$_}=int(($sum{$_}/$cnt{$_})*100.0+0.5)/100.0;
-            } elsif ($listitems{$_} eq 'cnt') {
-                $returnhash{$_}=$cnt{$_};
+        while (my($key,$value) = each(%cnt)) {
+            if ($listitems{$key} eq 'avg') {
+                $returnhash{$key}=int(($sum{$key}/$value)*100.0+0.5)/100.0;
+            } elsif ($listitems{$key} eq 'cnt') {
+                $returnhash{$key}=$value;
             } else {
-                $returnhash{$_}=$sum{$_};
+                $returnhash{$key}=$sum{$key};
             }
         }
         if ($returnhash{'count'}) {
@@ -237,6 +237,30 @@
     &ishome("$perlvar{'lonDocRoot'}/res/$perlvar{'lonDefDomain'}/$_")
     } grep {!/^\.\.?$/} readdir(RESOURCES);
 closedir RESOURCES;
+
+#
+# Create the statement handlers we need
+my $delete_sth = $dbh->prepare
+    ("DELETE FROM metadata WHERE url LIKE BINARY ?");
+
+my $insert_sth = $dbh->prepare
+    ("INSERT INTO metadata VALUES (".
+     "?,".   # title
+     "?,".   # author
+     "?,".   # subject
+     "?,".   # m2???
+     "?,".   # version
+     "?,".   # current
+     "?,".   # notes
+     "?,".   # abstract
+     "?,".   # mime
+     "?,".   # language
+     "?,".   # creationdate
+     "?,".   # revisiondate
+     "?,".   # owner
+     "?)"    # copyright
+     );
+
 foreach my $user (@homeusers) {
     print LOG "\n=== User: ".$user."\n\n";
     # Remove left-over db-files from potentially crashed searchcat run
@@ -255,30 +279,25 @@
         my $m2='/res/'.&declutter($m);
         $m2=~s/\.meta$//;
         &dynamicmeta($m2);
-        my $q2="select * from metadata where url like binary '$m2'";
-        my $sth = $dbh->prepare($q2);
-        $sth->execute();
-        my $r1=$sth->fetchall_arrayref;
-        if (@$r1) {
-            $sth=$dbh->prepare("delete from metadata where url like binary '$m2'");
-            $sth->execute();
-        }
-        $sth=$dbh->prepare('insert into metadata values ('.
-                           '"'.delete($ref->{'title'}).'"'.','.
-                           '"'.delete($ref->{'author'}).'"'.','.
-                           '"'.delete($ref->{'subject'}).'"'.','.
-                           '"'.$m2.'"'.','.
-                           '"'.delete($ref->{'keywords'}).'"'.','.
-                           '"'.'current'.'"'.','.
-                           '"'.delete($ref->{'notes'}).'"'.','.
-                           '"'.delete($ref->{'abstract'}).'"'.','.
-                           '"'.delete($ref->{'mime'}).'"'.','.
-                           '"'.delete($ref->{'language'}).'"'.','.
-                           '"'.sqltime(delete($ref->{'creationdate'})).'"'.','.
-                           '"'.sqltime(delete($ref->{'lastrevisiondate'})).'"'.','.
-                           '"'.delete($ref->{'owner'}).'"'.','.
-                           '"'.delete($ref->{'copyright'}).'"'.')');
-        $sth->execute();
+        $delete_sth->execute($m2);
+        $insert_sth->execute($ref->{'title'},
+                             $ref->{'author'},
+                             $ref->{'subject'},
+                             $m2,
+                             $ref->{'keywords'},
+                             'current',
+                             $ref->{'notes'},
+                             $ref->{'abstract'},
+                             $ref->{'mime'},
+                             $ref->{'language'},
+                             sqltime($ref->{'creationdate'}),
+                             sqltime($ref->{'lastrevisiondate'}),
+                             $ref->{'owner'},
+                             $ref->{'copyright'});
+#        if ($dbh->err()) {
+#            print STDERR "Error:".$dbh->errstr()."\n";
+#        }
+        $ref = undef;
     }
     
     # --------------------------------------------------- Clean up database