--- loncom/lond 2012/04/11 01:07:18 1.488 +++ loncom/lond 2012/05/02 00:30:19 1.489.2.1 @@ -2,7 +2,7 @@ # The LearningOnline Network # lond "LON Daemon" Server (port "LOND" 5663) # -# $Id: lond,v 1.488 2012/04/11 01:07:18 raeburn Exp $ +# $Id: lond,v 1.489.2.1 2012/05/02 00:30:19 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -60,7 +60,7 @@ my $DEBUG = 0; # Non zero to ena my $status=''; my $lastlog=''; -my $VERSION='$Revision: 1.488 $'; #' stupid emacs +my $VERSION='$Revision: 1.489.2.1 $'; #' stupid emacs my $remoteVERSION; my $currenthostid="default"; my $currentdomainid; @@ -3248,9 +3248,6 @@ sub dump_profile_database { # range - optional range of entries # e.g., 10-20 would return the # 10th to 19th items, etc. -# extra - optional ref to hash of -# additional args. currently -# skipcheck is only key used. # $client - Channel open on the client. # Returns: # 1 - Continue processing. @@ -3263,7 +3260,7 @@ sub dump_with_regexp { my $userinput = "$cmd:$tail"; - my ($udom,$uname,$namespace,$regexp,$range,$extra)=split(/:/,$tail); + my ($udom,$uname,$namespace,$regexp,$range)=split(/:/,$tail); if (defined($regexp)) { $regexp=&unescape($regexp); } else { @@ -3281,31 +3278,27 @@ sub dump_with_regexp { } my $hashref = &tie_user_hash($udom, $uname, $namespace, &GDBM_READER()); - my $skipcheck; if ($hashref) { my $qresult=''; my $count=0; # # When dump is for roles.db, determine if LON-CAPA version checking is needed. -# Sessions on 2.10 and later will include skipcheck => 1 in extra args ref, -# to indicate no version checking is needed (in this case, checking occurs -# on the server hosting the user session, when constructing the roles/courses +# Sessions on 2.10 and later do not require version checking, as that occurs +# on the server hosting the user session, when constructing the roles/courses # screen). -# - if ($extra ne '') { - $extra = &Apache::lonnet::thaw_unescape($extra); - $skipcheck = $extra->{'skipcheck'}; - } +# + my $skipcheck; my @ids = &Apache::lonnet::current_machine_ids(); my (%homecourses,$major,$minor,$now); -# -# If dump is for roles.db from a pre-2.10 server, determine the LON-CAPA -# version on the server which requested the data. For LON-CAPA 2.9, the +# +# If dump is for roles.db from a pre-2.10 server, determine the LON-CAPA +# version on the server which requested the data. For LON-CAPA 2.9, the # client session will have sent its LON-CAPA version when initiating the # connection. For LON-CAPA 2.8 and older, the version is retrieved from # the global %loncaparevs in lonnet.pm. # - if (($namespace eq 'roles') && (!$skipcheck)) { +# + if ($namespace eq 'roles') { my $loncaparev = $clientversion; if ($loncaparev eq '') { $loncaparev = $Apache::lonnet::loncaparevs{$clientname}; @@ -3314,16 +3307,18 @@ sub dump_with_regexp { $major = $1; $minor = $2; } + if (($major > 2) || (($major == 2) && ($minor > 9))) { + $skipcheck = 1; + } $now = time; } while (my ($key,$value) = each(%$hashref)) { - if ($namespace eq 'roles') { + if (($namespace eq 'roles') && (!$skipcheck)) { if ($key =~ m{^/($LONCAPA::match_domain)/($LONCAPA::match_courseid)(/?[^_]*)_(cc|co|in|ta|ep|ad|st|cr)$}) { my $cdom = $1; my $cnum = $2; - unless ($skipcheck) { - my ($role,$roleend,$rolestart) = split(/\_/,$value); - if (!$roleend || $roleend > $now) { + my ($role,$roleend,$rolestart) = split(/\_/,$value); + if (!$roleend || $roleend > $now) { # # For active course roles, check that requesting server is running a LON-CAPA # version which meets any version requirements for the course. Do not include @@ -3334,9 +3329,8 @@ sub dump_with_regexp { # homeserver is the current server, or whether it is a different server. # In both cases, the course's version requirement needs to be retrieved. # - next unless (&releasereqd_check($cnum,$cdom,$key,$value,$major, - $minor,\%homecourses,\@ids)); - } + next unless (&releasereqd_check($cnum,$cdom,$key,$value,$major, + $minor,\%homecourses,\@ids)); } } } @@ -3365,7 +3359,7 @@ sub dump_with_regexp { # if (($namespace eq 'roles') && (!$skipcheck)) { if (keys(%homecourses) > 0) { - $qresult .= &check_homecourses(\%homecourses,$udom,$regexp,$count, + $qresult .= &check_homecourses(\%homecourses,$regexp,$count, $range,$start,$end,$major,$minor); } } @@ -7517,10 +7511,18 @@ sub releasereqd_check { if (ref($ids) eq 'ARRAY') { if (grep(/^\Q$home\E$/,@{$ids})) { if (ref($homecourses) eq 'HASH') { - if (ref($homecourses->{$hashid}) eq 'ARRAY') { - push(@{$homecourses->{$hashid}},{$key=>$value}); + if (ref($homecourses->{$cdom}) eq 'HASH') { + if (ref($homecourses->{$cdom}{$cnum}) eq 'HASH') { + if (ref($homecourses->{$cdom}{$cnum}) eq 'ARRAY') { + push(@{$homecourses->{$cdom}{$cnum}},{$key=>$value}); + } else { + $homecourses->{$cdom}{$cnum} = [{$key=>$value}]; + } + } else { + $homecourses->{$cdom}{$cnum} = [{$key=>$value}]; + } } else { - $homecourses->{$hashid} = [{$key=>$value}]; + $homecourses->{$cdom}{$cnum} = [{$key=>$value}]; } } return; @@ -7595,42 +7597,44 @@ sub get_courseinfo_hash { # sub check_homecourses { - my ($homecourses,$udom,$regexp,$count,$range,$start,$end,$major,$minor) = @_; + my ($homecourses,$regexp,$count,$range,$start,$end,$major,$minor) = @_; my ($result,%addtocache); my $yesterday = time - 24*3600; if (ref($homecourses) eq 'HASH') { my (%okcourses,%courseinfo,%recent); - my $hashref = &tie_domain_hash($udom, "nohist_courseids", &GDBM_WRCREAT()); - if ($hashref) { - while (my ($key,$value) = each(%$hashref)) { - my $unesc_key = &unescape($key); - if ($unesc_key =~ /^lasttime:(\w+)$/) { - my $cid = $1; - $cid =~ s/_/:/; - if ($value > $yesterday ) { - $recent{$cid} = 1; + foreach my $domain (keys(%{$homecourses})) { + my $hashref = + &tie_domain_hash($domain, "nohist_courseids", &GDBM_WRCREAT()); + if (ref($hashref) eq 'HASH') { + while (my ($key,$value) = each(%$hashref)) { + my $unesc_key = &unescape($key); + if ($unesc_key =~ /^lasttime:(\w+)$/) { + my $cid = $1; + $cid =~ s/_/:/; + if ($value > $yesterday ) { + $recent{$cid} = 1; + } + next; } - next; - } - my $items = &Apache::lonnet::thaw_unescape($value); - if (ref($items) eq 'HASH') { - my $hashid = $unesc_key; - $hashid =~ s/_/:/; - $courseinfo{$hashid} = $items; - if (ref($homecourses->{$hashid}) eq 'ARRAY') { - my ($reqdmajor,$reqdminor) = split(/\./,$items->{'releaserequired'}); - if (&useable_role($reqdmajor,$reqdminor,$major,$minor)) { - $okcourses{$hashid} = 1; + my $items = &Apache::lonnet::thaw_unescape($value); + if (ref($items) eq 'HASH') { + my ($cdom,$cnum) = split(/_/,$unesc_key); + my $hashid = $cdom.':'.$cnum; + $courseinfo{$hashid} = $items; + if (ref($homecourses->{$cdom}{$cnum}) eq 'ARRAY') { + my ($reqdmajor,$reqdminor) = split(/\./,$items->{'releaserequired'}); + if (&useable_role($reqdmajor,$reqdminor,$major,$minor)) { + $okcourses{$hashid} = 1; + } } } } + unless (&untie_domain_hash($hashref)) { + &logthis("Failed to untie tied hash for nohist_courseids.db for $domain"); + } + } else { + &logthis("Failed to tie hash for nohist_courseids.db for $domain"); } - unless (&untie_domain_hash($hashref)) { - &logthis('Failed to untie tied hash for nohist_courseids.db'); - } - } else { - &logthis('Failed to tie hash for nohist_courseids.db'); - return; } foreach my $hashid (keys(%recent)) { my ($result,$cached)=&Apache::lonnet::is_cached_new('courseinfo',$hashid); @@ -7638,13 +7642,20 @@ sub check_homecourses { &Apache::lonnet::do_cache_new('courseinfo',$hashid,$courseinfo{$hashid},600); } } - foreach my $hashid (keys(%{$homecourses})) { - next if ($recent{$hashid}); - &Apache::lonnet::do_cache_new('courseinfo',$hashid,$courseinfo{$hashid},600); + foreach my $cdom (keys(%{$homecourses})) { + if (ref($homecourses->{$cdom}) eq 'HASH') { + foreach my $cnum (keys(%{$homecourses->{$cdom}})) { + my $hashid = $cdom.':'.$cnum; + next if ($recent{$hashid}); + &Apache::lonnet::do_cache_new('courseinfo',$hashid,$courseinfo{$hashid},600); + } + } } foreach my $hashid (keys(%okcourses)) { - if (ref($homecourses->{$hashid}) eq 'ARRAY') { - foreach my $role (@{$homecourses->{$hashid}}) { + my ($cdom,$cnum) = split(/:/,$hashid); + if ((ref($homecourses->{$cdom}) eq 'HASH') && + (ref($homecourses->{$cdom}{$cnum}) eq 'ARRAY')) { + foreach my $role (@{$homecourses->{$cdom}{$cnum}}) { if (ref($role) eq 'HASH') { while (my ($key,$value) = each(%{$role})) { if ($regexp eq '.') {