Hi David,

On Tuesday 02 August 2005 02:05, David Wood wrote:
> However, if I test with the attached simple test program and test data,
> I get the following output:
>
> Person1,+1 098 7654321
> Person2,+1 123 4567890
> Can't call method "exists" on an undefined value at demo.pl line 25,
> <GEN0> line 25.
>
>
> With the unpatched LDIF.pm I didn't get the "can't call method ..." error.

You are right. this change in behaviour was unintended.
The attched improved  patch should fix it.

> Also, recently there was a patch posted to this list to fix the
> "lowercase" arg to Net::LDAP::LDIF->new and it looks like your patch
> either doesn't include or rebreaks that fix.
I don't think so.
The patch to fix the unwented automatic lowercasing when reading from 
Net::LDAP::LDIF was a bug in Net::LDAP::Entry.pm

My patch to Net::LDAP::LDAP.pm does not affect this patch

You can check this with the modified versions of your files that I have 
attached also.

Please test and provide feedback

CU
Peter

-- 
Peter Marschall
eMail: [EMAIL PROTECTED]
--- lib/Net/LDAP/LDIF.pm	2005-04-26 00:54:39.000000000 +0200
+++ lib/Net/LDAP/LDIF.pm	2005-08-06 18:20:42.000000000 +0200
@@ -9,7 +9,7 @@
 require Net::LDAP::Entry;
 use vars qw($VERSION);
 
-$VERSION = "0.16";
+$VERSION = "0.16_01";
 
 my %mode = qw(w > r < a >>);
 
@@ -79,35 +79,49 @@
   
 sub _read_lines {
   my $self = shift;
-  my @ldif;
+  my $fh = $self->{'fh'};
+  my @ldif = ();
+  my $entry = '';
+  my $in_comment = 0;
+  my $entry_completed = 0;
+  my $ln;
 
-  {
-    local $/ = "";
-    my $fh = $self->{'fh'};
-    my $ln;
-    do {	# allow comments separated by blank lines
-      $ln = $self->{_next_lines} || scalar <$fh>;
-      unless ($ln) {
-         $self->{_next_lines} = '';
-         $self->{_current_lines} = '';
-         $self->eof(1);
-         return;
-      }
-      $ln =~ s/\n //sg;
-      $ln =~ s/^#.*\n//mg;
-      chomp($ln);
-      $self->{_current_lines} = $ln;
-    } until ($self->{_current_lines} || $self->eof());
-    chomp(@ldif = split(/^/, $ln));
-    do {
-      $ln = scalar <$fh> || '';
-      $self->eof(1) unless $ln;
-      $ln =~ s/\n //sg;
-      $ln =~ s/^#.*\n//mg;
-      chomp($ln);
-      $self->{_next_lines} = $ln;
-    } until ($self->{_next_lines} || $self->eof());
+  return @ldif  if ($self->eof());
+  
+  while (defined($ln = $self->{_buffered_line} || scalar <$fh>)) {
+    delete($self->{_buffered_line});
+    if ($ln =~ /^#/o) {		# ignore 1st line of comments
+      $in_comment = 1;
+    }
+    else {
+      if ($ln =~ /^[ \t]/o) {	# append wrapped line (if not in a comment)
+        $entry .= $ln  if (!$in_comment);
+      }
+      else {
+        $in_comment = 0;
+        if ($ln =~ /^\r?\n$/o) {
+          # ignore empty line on start of entry
+          # empty line at non-empty entry indicate entry completion
+          $entry_completed++  if (length($entry));
+	}
+        else {
+	  if ($entry_completed) {
+	    $self->{_buffered_line} = $ln;
+	    last;
+	  }
+	  else {
+            # append non-empty line
+            $entry .= $ln;
+	  }  
+        }	
+      }
+    }
   }
+  $self->eof(1)  if (!defined($ln));
+  $entry =~ s/\r?\n //sgo;	# un-wrap wrapped lines
+  $entry =~ s/\r?\n\t/ /sgo;	# OpenLDAP extension !!!
+  @ldif = split(/^/, $entry);
+  map { s/\r?\n$//; } @ldif;
 
   @ldif;
 }
@@ -177,7 +191,7 @@
 
   my $dn = shift @ldif;
 
-  if (length($1)) {
+  if (length($1)) {	# $1 is the optional colon from above
     eval { require MIME::Base64 };
     if ($@) {
       $self->_error($@, @ldif);

Attachment: demo.pl
Description: Perl program

# xxx
version: 1

# xxx
#xxx

###x
#x

#x

#x
dn: cn=Person1,mail=whatever
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
objectclass: mozillaAbPersonObsolete
givenName: Person1
cn: Person1
mail: whatever
modifytimestamp: 0Z
homePhone: +1 098 7654321
homephone: +1 098 7654320
#xxxx

#x
dn: cn=Person2,mail=whatever
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
objectclass: mozillaAbPersonObsolete
givenName: Person2
sn: Person2
cn: Person2
mail: whatever
modifytimestamp: 0Z
homePhone: +1 123 4567890
homephone: +1 123 4567891

#xxx
#xxx

#x
dn: cn=Person3,mail=whatever
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
objectclass: mozillaAbPersonObsolete
givenName: Person3
sn: Person3
cn: Person3
mail: whatever
modifytimestamp: 0Z
homePhone: +1 123 4567890

# EOF

# no, here is EOF

Reply via email to