At 2002-05-21 09:07:46 (-0700), Jeff Zucker wrote:
> Wolfgang Weisselberg wrote:

> >Looking at the code it seems that get_undeleted_record() returns
> >a row as string,

> Yes, exactly.  I fixed that a while back in my development version but 
> haven't released it publicly yet because of other changes that still 
> need debugging.

> Thanks for the patch, my fix does something similar but with a few if 
> statements thrown in :-).

Now I see why.  With my patch, zpack (which wipes the deleted
records) is broken -- it uses the degenerate case of 'Text' as
write out method, which just combines all the fields.  So the new
patch works around that.

BTW, I think zpack could be done better by copying the original
to .bak, generate a new DB .new (as done in zpack) and then
atomically rename .new to be the database.  But currently I lack
the time for a patch for that. :-/

So here's the new, less broken patch.


--- AnyData.pm-old      Tue May 21 15:42:46 2002
+++ AnyData.pm  Wed May 22 19:15:16 2002
@@ -352,6 +352,7 @@
 }
 sub get_undeleted_record {
     my $self = shift;
+    my $as_line = shift || 0;
     my $rec;
     my $found=0;
     return $self->fetch_row if $self->parser_type eq 'XML';
@@ -363,7 +364,9 @@
             and $rec =~ $self->{parser}->{skip_pattern};
         last;
     }
-    return $rec;
+    return $rec if $as_line;
+    my @fields = $self->{parser}->read_fields($rec);
+    return \@fields;
 }
 sub update_single_row {
     my $self     = shift;
@@ -543,7 +546,7 @@
     #$bak_fh->seek(0,0) || die $!;
 #    while (my $line = $self->get_record) {
 #        next if $self->is_deleted($line);
-    while (my $line = $self->get_undeleted_record) {
+    while (my $line = $self->get_undeleted_record("as line")) {
         my $tmpstr = $bak->{parser}->write_fields($line)
                    . $self->{parser}->{record_sep};
         $bak_fh->write($tmpstr,length $tmpstr);



-Wolfgang

Reply via email to