Archive-CAR

 view release on metacpan or  search on metacpan

lib/Archive/CAR/v2.pm  view on Meta::CPAN

        if ( $index_offset > 0 ) {
            seek( $fh, $index_offset, 0 );
            $index = '';
            while ( read( $fh, my $buf, 8192 ) ) {
                $index .= $buf;
            }
        }

        # Read CAR v1 data
        seek( $fh, $data_offset, 0 );
        $self->SUPER::read( $fh, $data_size );
        return $self;
    }

    method write ( $fh, $roots, $blocks ) {

        # Pragma
        my $pragma = pack( 'H*', '0aa16776657273696f6e02' );
        print {$fh} $pragma;

        # Header Placeholder (40 bytes)
        my $header_pos = systell($fh);
        print {$fh} pack( 'a40', '' );

        # Write CAR v1 data
        my $data_offset = systell($fh);
        $self->SUPER::write( $fh, $roots, $blocks );
        my $data_size = systell($fh) - $data_offset;

        # Index
        my $index_offset = systell($fh);
        require Archive::CAR::Indexer;
        my $indexer    = Archive::CAR::Indexer->new();
        my $index_data = $indexer->generate_index( $self->blocks );
        print {$fh} $index_data;

        # Backfill Header

lib/Archive/CAR/v2.pm  view on Meta::CPAN

        seek( $fh, $header_pos, 0 );

        # characteristics (16 bytes), data_offset (8), data_size (8), index_offset (8)
        my $header_raw = pack( 'a16 Q< Q< Q<', "\0" x 16, $data_offset, $data_size, $index_offset );
        print {$fh} $header_raw;
        seek( $fh, $current_pos, 0 );
    }

    # Override header to include v2 fields and v1 roots as expected in some outputs
    method header () {
        my $v1_header = $self->SUPER::header;
        return { %$v2_header, roots => $v1_header->{roots}, version => 2, };
    }
};
#
1;



( run in 0.875 second using v1.01-cache-2.11-cpan-98e64b0badf )