[LON-CAPA-cvs] cvs: loncom /lonnet/perl lonnet.pm

albertel lon-capa-cvs@mail.lon-capa.org
Fri, 29 Mar 2002 18:23:51 -0000


albertel		Fri Mar 29 13:23:51 2002 EDT

  Modified files:              
    /loncom/lonnet/perl	lonnet.pm 
  Log:
  - made the hash2str and str2hash convertors able to handle arrays inside a hash, and a hash inside a hash
  
  
  
Index: loncom/lonnet/perl/lonnet.pm
diff -u loncom/lonnet/perl/lonnet.pm:1.203 loncom/lonnet/perl/lonnet.pm:1.204
--- loncom/lonnet/perl/lonnet.pm:1.203	Mon Feb 25 09:33:58 2002
+++ loncom/lonnet/perl/lonnet.pm	Fri Mar 29 13:23:50 2002
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # TCP networking package
 #
-# $Id: lonnet.pm,v 1.203 2002/02/25 14:33:58 www Exp $
+# $Id: lonnet.pm,v 1.204 2002/03/29 18:23:50 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -715,6 +715,7 @@
     &logthis('Flushing course log buffers');
     foreach (keys %courselogs) {
         my $crsid=$_;
+	&logthis(":$crsid:$coursehombuf{$crsid}");
         if (&reply('log:'.$coursedombuf{$crsid}.':'.
 		          &escape($courselogs{$crsid}),
 		          $coursehombuf{$crsid}) eq 'ok') {
@@ -912,10 +913,55 @@
     }
 }
 
+sub arrayref2str {
+  my ($arrayref) = @_;
+  my $result='_ARRAY_REF__';
+  foreach my $elem (@$arrayref) {
+    if (ref($elem) eq 'ARRAY') {
+      $result.=&escape(&arrayref2str($elem)).'&';
+    } elsif (ref($elem) eq 'HASH') {
+      $result.=&escape(&hashref2str($elem)).'&';
+    } elsif (ref($elem)) {
+      &logthis("Got a ref of ".(ref($elem))." skipping.");
+    } else {
+      $result.=&escape($elem).'&';
+    }
+  }
+  $result=~s/\&$//;
+  return $result;
+}
+
 sub hash2str {
-  my (%hash)=@_;
-  my $result='';
-  foreach (keys %hash) { $result.=escape($_).'='.escape($hash{$_}).'&'; }
+  my (%hash) = @_;
+  my $result=&hashref2str(\%hash);
+  $result=~s/^_HASH_REF__//;
+  return $result;
+}
+
+sub hashref2str {
+  my ($hashref)=@_;
+  my $result='_HASH_REF__';
+  foreach (keys(%$hashref)) {
+    if (ref($_) eq 'ARRAY') {
+      $result.=&escape(&arrayref2str($_)).'=';
+    } elsif (ref($_) eq 'HASH') {
+      $result.=&escape(&hashref2str($_)).'=';
+    } elsif (ref($_)) {
+      &logthis("Got a ref of ".(ref($_))." skipping.");
+    } else {
+      $result.=&escape($_).'=';
+    }
+
+    if (ref($$hashref{$_}) eq 'ARRAY') {
+      $result.=&escape(&arrayref2str($$hashref{$_})).'&';
+    } elsif (ref($$hashref{$_}) eq 'HASH') {
+      $result.=&escape(&hashref2str($$hashref{$_})).'&';
+    } elsif (ref($$hashref{$_})) {
+      &logthis("Got a ref of ".(ref($$hashref{$_}))." skipping.");
+    } else {
+      $result.=&escape($$hashref{$_}).'&';
+    }
+  }
   $result=~s/\&$//;
   return $result;
 }
@@ -925,9 +971,39 @@
   my %returnhash;
   foreach (split(/\&/,$string)) {
     my ($name,$value)=split(/\=/,$_);
-    $returnhash{&unescape($name)}=&unescape($value);
+    $name=&unescape($name);
+    $value=&unescape($value);
+    if ($value =~ /^_HASH_REF__/) {
+      $value =~ s/^_HASH_REF__//;
+      my %hash=&str2hash($value);
+      $value=\%hash;
+    } elsif ($value =~ /^_ARRAY_REF__/) {
+      $value =~ s/^_ARRAY_REF__//;
+      my @array=&str2array($value);
+      $value=\@array;
+    }
+    $returnhash{$name}=$value;
   }
-  return %returnhash;
+  return (%returnhash);
+}
+
+sub str2array {
+  my ($string) = @_;
+  my @returnarray;
+  foreach my $value (split(/\&/,$string)) {
+    $value=&unescape($value);
+    if ($value =~ /^_HASH_REF__/) {
+      $value =~ s/^_HASH_REF__//;
+      my %hash=&str2hash($value);
+      $value=\%hash;
+    } elsif ($value =~ /^_ARRAY_REF__/) {
+      $value =~ s/^_ARRAY_REF__//;
+      my @array=&str2array($value);
+      $value=\@array;
+    }
+    push(@returnarray,$value);
+  }
+  return (@returnarray);
 }
 
 # -------------------------------------------------------------------Temp Store
@@ -2635,6 +2711,7 @@
 # ================================================================ Main Program
 
 sub goodbye {
+   &logthis("Starting Shut down");
    &flushcourselogs();
    &logthis("Shutting down");
 }
@@ -2897,12 +2974,30 @@
 =item *
 
 hash2str(%hash) : convert a hash into a string complete with escaping and '='
-and '&' separators
+and '&' separators, supports elements that are arrayrefs and hashrefs
+
+=item *
+
+hashref2str($hashref) : convert a hashref into a string complete with
+escaping and '=' and '&' separators, supports elements that are
+arrayrefs and hashrefs
+
+=item *
+
+arrayref2str($arrayref) : convert an arrayref into a string complete
+with escaping and '&' separators, supports elements that are arrayrefs
+and hashrefs
+
+=item *
+
+str2hash($string) : convert string to hash using unescaping and
+splitting on '=' and '&', supports elements that are arrayrefs and
+hashrefs
 
 =item *
 
-str2hash($string) : convert string to hash using unescaping and splitting on
-'=' and '&'
+str2array($string) : convert string to hash using unescaping and
+splitting on '&', supports elements that are arrayrefs and hashrefs
 
 =item *