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

bowersj2 lon-capa-cvs@mail.lon-capa.org
Thu, 20 Mar 2003 20:40:19 -0000


This is a MIME encoded message

--bowersj21048192819
Content-Type: text/plain

bowersj2		Thu Mar 20 15:40:19 2003 EDT

  Modified files:              
    /loncom/interface	lonnavmaps.pm 
  Log:
  DANGER WILL ROBINSON: This WILL corrupt your session until you restart
  the server. Don't upgrade to this unless you mean it.
  
  
--bowersj21048192819
Content-Type: text/plain
Content-Disposition: attachment; filename="bowersj2-20030320154019.txt"

Index: loncom/interface/lonnavmaps.pm
diff -u loncom/interface/lonnavmaps.pm:1.163 loncom/interface/lonnavmaps.pm:1.164
--- loncom/interface/lonnavmaps.pm:1.163	Thu Mar 20 13:38:01 2003
+++ loncom/interface/lonnavmaps.pm	Thu Mar 20 15:40:18 2003
@@ -2,7 +2,7 @@
 # The LearningOnline Network with CAPA
 # Navigate Maps Handler
 #
-# $Id: lonnavmaps.pm,v 1.163 2003/03/20 18:38:01 bowersj2 Exp $
+# $Id: lonnavmaps.pm,v 1.164 2003/03/20 20:40:18 bowersj2 Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -51,6 +51,7 @@
 
 my %navmaphash;
 my %parmhash;
+my @refsToUntie;
 
 # symbolic constants
 sub SYMB { return 1; }
@@ -98,8 +99,12 @@
 # And a special case in the nav map; what to do when the assignment
 # is not yet done and due in less then 24 hours
 my $hurryUpColor = "#FF0000";
-
+my $test = 'abc';
 sub cleanup {
+    &Apache::lonnet::logthis("Cleanup called.");
+    &Apache::lonnet::logthis(scalar(@refsToUntie));
+    &Apache::lonnet::logthis($test);
+    $test = '467';
     if (tied(%navmaphash)){
 	&Apache::lonnet::logthis('Cleanup navmaps: navmaphash');
         unless (untie(%navmaphash)) {
@@ -112,6 +117,14 @@
 	    &Apache::lonnet::logthis('Failed cleanup navmaps: parmhash');
         }
     }
+    # Apparently, if you take a reference to a tied hash, both the 
+    # original hash and the tied hash must be untied. Bleh.
+    for my $ref (@refsToUntie) {
+        &Apache::lonnet::logthis('Cleanup navmaps: reference');
+        unless (untie($ref)) {
+            &Apache::lonnet::logthis('Failed cleanup navmaps: reference');
+        }
+    }
 }
 
 sub handler {
@@ -143,7 +156,7 @@
     $r->send_http_header;
 
     # Create the nav map
-    my $navmap = Apache::lonnavmaps::navmap->new(
+    my $navmap = Apache::lonnavmaps::navmap->new($r, 
                         $ENV{"request.course.fn"}.".db",
                         $ENV{"request.course.fn"}."_parms.db", 1, 1);
 
@@ -220,7 +233,19 @@
                           'suppressNavmap' => 1,
                           'r' => $r});
 
-    $navmap->untieHashes();
+    #$navmap->untieHashes();
+
+    if (tied(%navmaphash)) { 
+        $r->print("Dang it.");
+    } else {
+        $r->print("It's out.");
+    }
+
+    if (tied(%parmhash)) { 
+        $r->print("Dang it.");
+    } else {
+        $r->print("It's out.");
+    }
 
     $r->print("</body></html>");
     $r->rflush();
@@ -544,6 +569,8 @@
 
 =item * B<navmap>: A reference to a navmap, used only if an iterator is not passed in. If this is necessary to make an iterator but it is not passed in, a new one will be constructed based on ENV info. This is useful to do basic error checking before passing it off to render.
 
+=item * B<r>: The standard Apache response object. This must be passed to the renderer or the course hash will be locked.
+
 =item * B<cols>: An array reference
 
 =item * B<showParts>: A flag. If yes (default), a line for the resource itself, and a line for each part will be displayed. If not, only one line for each resource will be displayed.
@@ -562,8 +589,6 @@
 
 =item * B<currentJumpIndex>: Describes the currently-open row number to cause the browser to jump to, because the user just opened that folder. By default, pulled from the Jump information in the ENV{'form.*'}.
 
-=item * B<r>: The standard Apache response object. If you pass this to the render, it will use it to flush the table every 20 rows and handle the rendering itself.
-
 =item * B<printKey>: If true, print the key that appears on the top of the standard navmaps. Default is false.
 
 =item * B<printCloseAll>: If true, print the "Close all folders" or "open all folders" links. Default is true.
@@ -865,7 +890,7 @@
     if (!$ENV{'form.folderManip'} && !defined($args->{'iterator'})) {
         # Step 1: Check to see if we have a navmap
         if (!defined($navmap)) {
-            $navmap = Apache::lonnavmaps::navmap->new(
+            $navmap = Apache::lonnavmaps::navmap->new($r, 
                         $ENV{"request.course.fn"}.".db",
                         $ENV{"request.course.fn"}."_parms.db", 1, 1);
             $mustCloseNavMap = 1;
@@ -931,7 +956,7 @@
         
         # Step 1: Check to see if we have a navmap
         if (!defined($navmap)) {
-            $navmap = Apache::lonnavmaps::navmap->new(
+            $navmap = Apache::lonnavmaps::navmap->new($r, 
                         $ENV{"request.course.fn"}.".db",
                         $ENV{"request.course.fn"}."_parms.db", 1, 1);
             $mustCloseNavMap = 1;
@@ -1226,7 +1251,7 @@
         $r->rflush();
     }
         
-    if ($mustCloseNavMap) { $navmap->untieHashes(); } 
+    #if ($mustCloseNavMap) { $navmap->untieHashes(); } 
 
     return $result;
 }
@@ -1251,7 +1276,7 @@
 
 =over 4
 
-=item * B<new>(navHashFile, parmHashFile, genCourseAndUserOptions, genMailDiscussStatus): Binds a new navmap object to the compiled nav map hash and parm hash given as filenames. genCourseAndUserOptions is a flag saying whether the course options and user options hash should be generated. This is for when you are using the parameters of the resources that require them; see documentation in resource object documentation. genMailDiscussStatus causes the nav map to retreive information about the email and discussion status of resources. Returns the navmap object if this is successful, or B<undef> if not. You must check for undef; errors will occur when you try to use the other methods otherwise.
+=item * B<new>(responseObject, navHashFile, parmHashFile, genCourseAndUserOptions, genMailDiscussStatus): Binds a new navmap object to the compiled nav map hash and parm hash given as filenames. responseObject is the Apache response object (typically $r). genCourseAndUserOptions is a flag saying whether the course options and user options hash should be generated. This is for when you are using the parameters of the resources that require them; see documentation in resource object documentation. genMailDiscussStatus causes the nav map to retreive information about the email and discussion status of resources. Returns the navmap object if this is successful, or B<undef> if not. You must check for undef; errors will occur when you try to use the other methods otherwise.
 
 =item * B<getIterator>(first, finish, filter, condition): See iterator documentation below.
 
@@ -1266,6 +1291,7 @@
     my $class = ref($proto) || $proto;
     my $self = {};
 
+    $self->{RESPONSE} = shift;
     $self->{NAV_HASH_FILE} = shift;
     $self->{PARM_HASH_FILE} = shift;
     $self->{GENERATE_COURSE_USER_OPT} = shift;
@@ -1281,23 +1307,30 @@
 
     # tie the nav hash
 
-    if (!(tie(%navmaphash, 'GDBM_File', $self->{NAV_HASH_FILE},
+    if (!(tie(%Apache::lonnavmaps::navmaphash, 'GDBM_File', $self->{NAV_HASH_FILE},
               &GDBM_READER(), 0640))) {
         return undef;
     }
     
-    if (!(tie(%parmhash, 'GDBM_File', $self->{PARM_HASH_FILE},
+    if (!(tie(%Apache::lonnavmaps::parmhash, 'GDBM_File', $self->{PARM_HASH_FILE},
               &GDBM_READER(), 0640)))
     {
         untie $self->{PARM_HASH};
         return undef;
     }
 
-    $self->{HASH_TIED} = 1;
-    $self->{NAV_HASH} = \%navmaphash;
-    $self->{PARM_HASH} = \%parmhash;
+    $self->{NAV_HASH} = \%Apache::lonnavmaps::navmaphash;
+    $self->{PARM_HASH} = \%Apache::lonnavmaps::parmhash;
+    push @Apache::lonnavmaps::refsToCleanup, $self->{NAV_HASH};
+    push @Apache::lonnavmaps::refsToCleanup, $self->{PARM_HASH};
+    Apache::lonnet::logthis(scalar(@Apache::lonnavmaps::refsToCleanup));
+    $Apache::lonnavmaps::test = '123';
+    Apache::lonnet::logthis($Apache::lonnavmaps::test);
     $self->{INITED} = 0;
 
+    $self->{RESPONSE}->register_cleanup(\&Apache::lonnavmaps::cleanup);
+    Apache::lonnet::logthis("Pushed cleanup.");
+
     bless($self);
         
     return $self;
@@ -1440,17 +1473,17 @@
 
 # unties the hash when done
 sub untieHashes {
-    my $self = shift;
-    untie %{$self->{NAV_HASH}} if ($self->{HASH_TIED});
-    untie %{$self->{PARM_HASH}} if ($self->{HASH_TIED});
-    $self->{HASH_TIED} = 0;
+#    my $self = shift;
+#    untie $self->{NAV_HASH};
+#    untie $self->{PARM_HASH};
+#    &Apache::lonnavmaps::cleanup();
 }
 
 # when the object is destroyed, be sure to untie all the hashes we tied.
-sub DESTROY {
-    my $self = shift;
-    $self->untieHashes();
-}
+#sub DESTROY {
+#    my $self = shift;
+#    $self->untieHashes();
+#}
 
 # Private method: Does the given resource (as a symb string) have
 # current discussion? Returns 0 if chat/mail data not extracted.

--bowersj21048192819--