Author image Damien Krotkine

NAME

Sereal::Splitter - splits a Sereal blob in chunks of roughly the same size

SYNOPSIS

  use Sereal::Splitter qw(SRL_ZLIB create_header_data_template);

  my $splitter = Sereal::Splitter->new(
    { input => $data, chunk_size => 1, compress => SRL_ZLIB,
      header_data_template => create_header_data_template(
        { date => time(), elements_count => '__$CNT__' }
      )
    }
  );
  while (defined( my $chunk = $splitter->next_chunk())) {
    # do stuff with $chunk;
  }

DESCRIPTION

This library implements an efficient way of splitting a Sereal blob into smaller chunks. Currently, it only works with ArrayRefs Sereal blobs, like this:

  [ $element_1, $element_2, ..., $element_n ]

In the future, it may also work with HashRefs.

CONSTRUCTOR

new

Takes a HashRef with options:

input

Mandatory, String, the Sereal blob to split

chunk_size

Mandatory, positive Int, the approximate size of the uncompressed chunk

compress

Optional, Int, one of SRL_UNCOMPRESSED, SRL_SNAPPY or SRL_ZLIB. These constant can be exported at use time. If set, indicates how chunks must be compressed. Defaults to SRL_UNCOMPRESSED.

header_data_template

Optional, Str, the header_data to inject in each chunk. This header_data can contain special scalar values, that will be replaced by values. Special scalar values are:

'__$CNT__'

This will be replaced by the number of elements that the chunks contains. It must be encoded as SHORT_BINARY_08. It'll be replaced by a VARINT.

REMARK: In theory, it should be a string of lentgh 11, because varint max size are 11 bytes. However, the Sereal decoder code, can't cope with varint bigger than 8 bytes, because of a bug, and even if the varint is forged like 0x8180808080808080808080.

To make things easier, you can use create_header_data_template (see below) to create it for you.

METHODS

next_chunk

returns the next chunk as a String, or Undef if it was the last chunk

EXPORTED FUNCTIONS

create_header_data_template

Given a structure, will return a Sereal *body*, that can be used as value for the header_data_template constructor option.

This function loads Sereal::Encoder if it's not already loaded.