1 #TODO: Add chaining back in.
2 package DBM::Deep::Engine::Sector::Scalar;
7 use warnings FATAL => 'all';
9 use DBM::Deep::Engine::Sector::Data;
10 our @ISA = qw( DBM::Deep::Engine::Sector::Data );
15 my $chain_loc = $self->chain_loc;
20 $self->engine->_load_sector( $chain_loc )->free;
26 sub type { $_[0]{engine}->SIG_DATA }
30 my $engine = $self->engine;
32 unless ( $self->offset ) {
33 $self->{offset} = $engine->_request_data_sector( $self->size );
34 my $data = delete $self->{data};
35 my $dlen = length $data;
37 my $data_section = $self->size - $self->base_size - $engine->byte_size - 1;
40 if ( $dlen > $data_section ) {
41 DBM::Deep->_throw_error( "Storage of values longer than $data_section not supported." );
44 $self->write( 0, $self->type );
45 $self->write( $self->base_size,
46 pack( $engine->StP($engine->byte_size), $next_offset ) # Chain loc
47 . pack( $engine->StP(1), $dlen ) # Data length
59 $self->engine->StP(1),
60 $self->read( $self->base_size + $self->engine->byte_size, 1 ),
67 $self->engine->StP($self->engine->byte_size),
70 $self->engine->byte_size,
80 my $chain_loc = $self->chain_loc;
82 $data .= $self->read( $self->base_size + $self->engine->byte_size + 1, $self->data_length );
84 last unless $chain_loc;
86 $self = $self->engine->_load_sector( $chain_loc );