Diff for /loncom/metadata_database/searchcat.pl between versions 1.1 and 1.18

version 1.1, 2001/04/14 18:24:54 version 1.18, 2002/05/17 14:03:04
Line 1 Line 1
 #!/usr/bin/perl  #!/usr/bin/perl
 # The LearningOnline Network  # The LearningOnline Network
 # searchcat.pl "Search Catalog" batch script  # searchcat.pl "Search Catalog" batch script
   #
 # 04/14/2001 Scott Harrison  # $Id$
   #
   # Copyright Michigan State University Board of Trustees
   #
   # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
   #
   # LON-CAPA is free software; you can redistribute it and/or modify
   # it under the terms of the GNU General Public License as published by
   # the Free Software Foundation; either version 2 of the License, or
   # (at your option) any later version.
   #
   # LON-CAPA is distributed in the hope that it will be useful,
   # but WITHOUT ANY WARRANTY; without even the implied warranty of
   # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   # GNU General Public License for more details.
   #
   # You should have received a copy of the GNU General Public License
   # along with LON-CAPA; if not, write to the Free Software
   # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   #
   # /home/httpd/html/adm/gpl.txt
   #
   # http://www.lon-capa.org/
   #
   # YEAR=2001
   # 04/14/2001, 04/16/2001 Scott Harrison
   #
   # YEAR=2002
   # 05/11/2002 Scott Harrison
   #
   ###
   
 # This script goes through a LON-CAPA resource  # This script goes through a LON-CAPA resource
 # directory and gathers metadata.  # directory and gathers metadata.
 # The metadata is entered into a SQL database.  # The metadata is entered into a SQL database.
   
 use strict;  use lib '/home/httpd/lib/perl/';
   use LONCAPA::Configuration;
   
 use IO::File;  use IO::File;
 use HTML::TokeParser;  use HTML::TokeParser;
   use DBI;
   
 my @metalist;  my @metalist;
 # ----------------- Code to enable 'find' subroutine listing of the .meta files  # ----------------- Code to enable 'find' subroutine listing of the .meta files
Line 19  require "find.pl"; Line 51  require "find.pl";
 sub wanted {  sub wanted {
     (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&      (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
     -f _ &&      -f _ &&
     /^.*\.meta$/ &&      /^.*\.meta$/ && !/^.+\.\d+\.[^\.]+\.meta$/ &&
     push(@metalist,"$dir/$_");      push(@metalist,"$dir/$_");
 }  }
   
 # ------------------------------------ Read httpd access.conf and get variables  # ---------------  Read loncapa_apache.conf and loncapa.conf and get variables
 open (CONFIG,"/etc/httpd/conf/access.conf") || die "Can't read access.conf";  my $perlvarref=LONCAPA::Configuration::read_conf('loncapa_apache.conf',
                                                    'loncapa.conf');
   my %perlvar=%{$perlvarref};
   undef $perlvarref; # remove since sensitive and not needed
   delete $perlvar{'lonReceipt'}; # remove since sensitive and not needed
   
 while ($configline=<CONFIG>) {  # ------------------------------------- Only run if machine is a library server
     if ($configline =~ /PerlSetVar/) {  exit unless $perlvar{'lonRole'} eq 'library';
  my ($dummy,$varname,$varvalue)=split(/\s+/,$configline);  
         chomp($varvalue);  
         $perlvar{$varname}=$varvalue;  
     }  
 }  
 close(CONFIG);  
   
   my $dbh;
 # ------------------------------------- Make sure that database can be accessed  # ------------------------------------- Make sure that database can be accessed
 {  {
     my $dbh;  
     unless (      unless (
     $dbh = DBI->connect("DBI:mysql:loncapa","www",$perlvar{'lonSqlAccess'},{ RaiseError =>0,PrintError=>0})      $dbh = DBI->connect("DBI:mysql:loncapa","www",$perlvar{'lonSqlAccess'},{ RaiseError =>0,PrintError=>0})
     ) {       ) { 
Line 47  close(CONFIG); Line 77  close(CONFIG);
 }  }
   
 # ------------------------------------------------------------- get .meta files  # ------------------------------------------------------------- get .meta files
 # need to actually loop over existing users here.. will fix soon  opendir(RESOURCES,"$perlvar{'lonDocRoot'}/res/$perlvar{'lonDefDomain'}");
 &find("$perlvar{'lonDocRoot'}/res");  my @homeusers=grep
             {&ishome("$perlvar{'lonDocRoot'}/res/$perlvar{'lonDefDomain'}/$_")}
             grep {!/^\.\.?$/} readdir(RESOURCES);
   closedir RESOURCES;
   foreach my $user (@homeusers) {
       &find("$perlvar{'lonDocRoot'}/res/$perlvar{'lonDefDomain'}/$user");
   }
   
 # -- process each file to get metadata and put into search catalog SQL database  # -- process each file to get metadata and put into search catalog SQL database
   # Also, check to see if already there.
   # I could just delete (without searching first), but this works for now.
 foreach my $m (@metalist) {  foreach my $m (@metalist) {
     my $ref=&metadata($m);      my $ref=&metadata($m);
     my $sth=$dbh->prepare('insert into metadata values ('.      my $m2='/res/'.&declutter($m);
   delete($ref->{'title'}),      $m2=~s/\.meta$//;
   delete($ref->{'author'}).','.      my $q2="select * from metadata where url like binary '$m2'";
   delete($ref->{'subject'}).','.      my $sth = $dbh->prepare($q2);
   delete($ref->{'url'}).','.      $sth->execute();
   delete($ref->{'keywords'}).','.      my $r1=$sth->fetchall_arrayref;
   delete($ref->{'version'}).','.      if (@$r1) {
   delete($ref->{'notes'}).','.   $sth=$dbh->prepare("delete from metadata where url like binary '$m2'");
   delete($ref->{'abstract'}).','.          $sth->execute();
   delete($ref->{'mime'}).','.      }
   delete($ref->{'language'}).','.      $sth=$dbh->prepare('insert into metadata values ('.
   delete($ref->{'creationdate'}).','.    '"'.delete($ref->{'title'}).'"'.','.
   delete($ref->{'lastrevisiondate'}).','.    '"'.delete($ref->{'author'}).'"'.','.
   delete($ref->{'owner'}).','.    '"'.delete($ref->{'subject'}).'"'.','.
   delete($ref->{'copyright'}).    '"'.$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();      $sth->execute();
 }  }
   
Line 141  sub declutter { Line 188  sub declutter {
     $thisfn=~s/^res\///;      $thisfn=~s/^res\///;
     return $thisfn;      return $thisfn;
 }  }
   
   # --------------------------------------- Is this the home server of an author?
   # (copied from lond, modification of the return value)
   sub ishome {
       my $author=shift;
       $author=~s/\/home\/httpd\/html\/res\/([^\/]*)\/([^\/]*).*/$1\/$2/;
       my ($udom,$uname)=split(/\//,$author);
       my $proname=propath($udom,$uname);
       if (-e $proname) {
    return 1;
       } else {
           return 0;
       }
   }
   
   # -------------------------------------------- Return path to profile directory
   # (copied from lond)
   sub propath {
       my ($udom,$uname)=@_;
       $udom=~s/\W//g;
       $uname=~s/\W//g;
       my $subdir=$uname.'__';
       $subdir =~ s/(.)(.)(.).*/$1\/$2\/$3/;
       my $proname="$perlvar{'lonUsersDir'}/$udom/$subdir/$uname";
       return $proname;
   } 
   
   # ---------------------------- convert 'time' format into a datetime sql format
   sub sqltime {
       my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
    localtime(@_[0]);
       $mon++; $year+=1900;
       return "$year-$mon-$mday $hour:$min:$sec";
   }

Removed from v.1.1  
changed lines
  Added in v.1.18


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>