Hi Peter,

Sorry for the long wait, but better late than never... I finally got a chance to test this patch, and it seems to work just fine, thanks very much!

Cheers,

David


Peter Marschall wrote:

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.


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

Please test and provide feedback

CU
Peter

------------------------------------------------------------------------

--- 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);
------------------------------------------------------------------------

# 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