--- loncom/metadata_database/searchcat.pl 2007/01/02 09:12:51 1.74 +++ loncom/metadata_database/searchcat.pl 2007/01/02 12:52:22 1.75 @@ -2,7 +2,7 @@ # The LearningOnline Network # searchcat.pl "Search Catalog" batch script # -# $Id: searchcat.pl,v 1.74 2007/01/02 09:12:51 raeburn Exp $ +# $Id: searchcat.pl,v 1.75 2007/01/02 12:52:22 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -237,7 +237,7 @@ foreach my $dom (@domains) { my $is_course = &Apache::lonnet::is_course($dom,$uname); my $curr_perm = &Apache::lonnet::get_portfile_permissions($dom,$uname); my %access = &Apache::lonnet::get_access_controls($curr_perm); - foreach my $file (keys(%access)) { + foreach my $file (keys(%access)) { my ($group,$url,$fullpath); if ($is_course) { ($group, my ($path)) = ($file =~ /^(\w+)(\/.+)$/); @@ -248,10 +248,13 @@ foreach my $dom (@domains) { $url = $urlstart.'/portfolio'.$file; } if (ref($access{$file}) eq 'HASH') { - &process_portfolio_access_data($url,$access{$file}); + my %portaccesslog = + &LONCAPA::lonmetadata::process_portfolio_access_data($dbh, + $simulate,\%newnames,$url,$fullpath,$access{$file}); + &portfolio_logging(%portaccesslog); } - &process_portfolio_metadata($url,$fullpath,$is_course,$dom, - $uname,$group); + my %portmetalog = &LONCAPA::lonmetadata::process_portfolio_metadata($dbh,$simulate,\%newnames,$url,$fullpath,$is_course,$dom,$uname,$group); + &portfolio_logging(%portmetalog); } } } @@ -302,6 +305,17 @@ sub log { } } +sub portfolio_logging { + my (%portlog) = @_; + foreach my $key (keys(%portlog)) { + if (ref($portlog{$key}) eq 'HASH') { + foreach my $item (keys(%{$portlog{$key}})) { + &log(0,$portlog{$key}{$item}); + } + } + } +} + sub descend_tree { my ($dir,$depth,$alldomusers) = @_; if (-d $dir) { @@ -322,89 +336,6 @@ sub descend_tree { } } -sub process_portfolio_access_data { - my ($url,$access_hash) = @_; - foreach my $key (keys(%{$access_hash})) { - my $acc_data; - $acc_data->{url} = $url; - $acc_data->{keynum} = $key; - my ($num,$scope,$end,$start) = - ($key =~ /^([^:]+):([a-z]+)_(\d*)_?(\d*)$/); - next if (($scope ne 'public') && ($scope ne 'guest')); - $acc_data->{scope} = $scope; - if ($end != 0) { - $acc_data->{end} = &LONCAPA::lonmetadata::sqltime($end); - } - $acc_data->{start} = &LONCAPA::lonmetadata::sqltime($start); - if (! $simulate) { - my ($count,$err) = - &LONCAPA::lonmetadata::store_metadata($dbh, - $newnames{'access'}, - 'portfolio_access',$acc_data); - if ($err) { - &log(0,"MySQL Error Insert: ".$err); - } - if ($count < 1) { - &log(0,"Unable to insert record into MySQL database for $url"); - } - } - } -} - -sub process_portfolio_metadata { - my ($url,$fullpath,$is_course,$dom,$uname,$group) = @_; - my ($ref,$crs,$addedfields) = &portfolio_metadata($fullpath,$dom,$uname, - $group); - &getfiledates($ref,$fullpath); - if ($is_course) { - $ref->{'groupname'} = $group; - } - my %Data; - if (ref($ref) eq 'HASH') { - %Data = %{$ref}; - } - %Data = ( - %Data, - 'url'=>$url, - 'version'=>'current', - ); - if (! $simulate) { - my ($count,$err) = - &LONCAPA::lonmetadata::store_metadata($dbh, - $newnames{'portfolio'}, - 'portfolio_metadata',\%Data); - if ($err) { - &log(0,"MySQL Error Insert: ".$err); - } - if ($count < 1) { - &log(0,"Unable to insert record into MySQL portfolio_metadata database table for $url"); - } - if (ref($addedfields) eq 'HASH') { - if (keys(%{$addedfields}) > 0) { - foreach my $key (keys(%{$addedfields})) { - my $added_data = { - 'url' => $url, - 'field' => $key, - 'value' => $addedfields->{$key}, - 'courserestricted' => $crs, - }; - ($count,$err) = &LONCAPA::lonmetadata::store_metadata($dbh, - $newnames{'addedfields'}, - 'portfolio_addedfields', - $added_data); - if ($err) { - &log(0,"MySQL Error Insert: ".$err); - } - if ($count < 1) { - &log(0,"Unable to insert record into MySQL portfolio_addedfields database table for url = $url and field = $key"); - } - } - } - } - } - return; -} - ######################################################## ######################################################## ### ### @@ -508,7 +439,7 @@ sub process_meta_file { %dyn=&get_dynamic_metadata($url); &count_type($url); } - &getfiledates($ref,$target); + &LONCAPA::lonmetadata::getfiledates($ref,$target); # my %Data = ( %$ref, @@ -549,7 +480,8 @@ sub metadata { if ($filename !~ /\.meta$/) { $filename.='.meta'; } - my $metastring=&getfile($Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'.$filename); + my $metastring = + &LONCAPA::lonmetadata::getfile($Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'.$filename); return undef if (! defined($metastring)); my $parser=HTML::TokeParser->new(\$metastring); my $token; @@ -580,125 +512,6 @@ sub metadata { return \%metacache; } -############################################################### -############################################################### -### ### -### &portfolio_metadata($filepath,$dom,$uname,$group) ### -### Retrieve metadata for the given file ### -### Returns array - ### -### contains reference to metadatahash and ### -### optional reference to addedfields hash ### -### ### -############################################################### -############################################################### -sub portfolio_metadata { - my ($fullpath,$dom,$uname,$group)=@_; - my ($mime) = ( $fullpath=~/\.(\w+)$/ ); - my %metacache=(); - if ($fullpath !~ /\.meta$/) { - $fullpath .= '.meta'; - } - my (@standard_fields,%addedfields); - my $colsref = - $LONCAPA::lonmetadata::Portfolio_metadata_table_description; - if (ref($colsref) eq 'ARRAY') { - my @columns = @{$colsref}; - foreach my $coldata (@columns) { - push(@standard_fields,$coldata->{'name'}); - } - } - my $metastring=&getfile($fullpath); - if (! defined($metastring)) { - $metacache{'keys'}= 'owner,domain,mime'; - $metacache{'owner'} = $uname.':'.$dom; - $metacache{'domain'} = $dom; - $metacache{'mime'} = $mime; - if ($group ne '') { - $metacache{'keys'} .= ',courserestricted'; - $metacache{'courserestricted'} = 'course.'.$dom.'_'.$uname; - } - } else { - my $parser=HTML::TokeParser->new(\$metastring); - my $token; - while ($token=$parser->get_token) { - if ($token->[0] eq 'S') { - my $entry=$token->[1]; - if ($metacache{'keys'}) { - $metacache{'keys'}.=','.$entry; - } else { - $metacache{'keys'}=$entry; - } - my $value = $parser->get_text('/'.$entry); - if (!grep(/^\Q$entry\E$/,@standard_fields)) { - my $clean_value = lc($value); - $clean_value =~ s/\s/_/g; - if ($clean_value ne $entry) { - if (defined($addedfields{$entry})) { - $addedfields{$entry} .=','.$value; - } else { - $addedfields{$entry} = $value; - } - } - } else { - $metacache{$entry} = $value; - } - } - } # End of ($token->[0] eq 'S') - } - if (keys(%addedfields) > 0) { - foreach my $key (sort keys(%addedfields)) { - $metacache{'addedfieldnames'} .= $key.','; - $metacache{'addedfieldvalues'} .= $addedfields{$key}.'&&&'; - } - $metacache{'addedfieldnames'} =~ s/,$//; - $metacache{'addedfieldvalues'} =~ s/\&\&\&$//; - if ($metacache{'keys'}) { - $metacache{'keys'}.=',addedfieldnames'; - } else { - $metacache{'keys'}='addedfieldnames'; - } - $metacache{'keys'}.=',addedfieldvalues'; - } - return (\%metacache,$metacache{'courserestricted'},\%addedfields); -} - -## -## &getfile($filename) -## Slurps up an entire file into a scalar. -## Returns undef if the file does not exist -sub getfile { - my $file = shift(); - if (! -e $file ) { - return undef; - } - my $fh=IO::File->new($file); - my $contents = ''; - while (<$fh>) { - $contents .= $_; - } - return $contents; -} - -## -## &getfiledates() -## Converts creationdate and modifieddates to SQL format -## Applies stat() to file to retrieve dates if missing -sub getfiledates { - my ($ref,$target) = @_; - if (! defined($ref->{'creationdate'}) || - $ref->{'creationdate'} =~ /^\s*$/) { - $ref->{'creationdate'} = (stat($target))[9]; - } - if (! defined($ref->{'lastrevisiondate'}) || - $ref->{'lastrevisiondate'} =~ /^\s*$/) { - $ref->{'lastrevisiondate'} = (stat($target))[9]; - } - $ref->{'creationdate'} = - &LONCAPA::lonmetadata::sqltime($ref->{'creationdate'}); - $ref->{'lastrevisiondate'} = - &LONCAPA::lonmetadata::sqltime($ref->{'lastrevisiondate'}); -} - ######################################################## ######################################################## ### ###