1 #TODO: Convert this to a string
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;
39 my $curr_offset = $self->offset;
44 my ($leftover, $this_len, $chunk);
45 if ( $dlen > $data_section ) {
47 $this_len = $data_section;
48 $chunk = substr( $data, 0, $this_len );
50 $dlen -= $data_section;
51 $next_offset = $engine->_request_data_sector( $self->size );
52 $data = substr( $data, $this_len );
55 $leftover = $data_section - $dlen;
62 my $string = chr(0) x $self->size;
63 substr( $string, 0, $engine->SIG_SIZE, $self->type );
64 substr( $string, $self->base_size, $engine->byte_size + 1,
65 pack( $engine->StP($engine->byte_size), $next_offset ) # Chain loc
66 . pack( $engine->StP(1), $this_len ), # Data length
68 substr( $string, $self->base_size + $engine->byte_size + 1, $this_len,
72 $engine->storage->print_at( $curr_offset, $string );
74 $curr_offset = $next_offset;
84 my $buffer = $self->engine->storage->read_at(
85 $self->offset + $self->base_size + $self->engine->byte_size, 1
88 return unpack( $self->engine->StP(1), $buffer );
94 $self->engine->StP($self->engine->byte_size),
95 $self->engine->storage->read_at(
96 $self->offset + $self->base_size,
97 $self->engine->byte_size,
109 my $chain_loc = $self->chain_loc;
111 $data .= $self->engine->storage->read_at(
112 $self->offset + $self->base_size + $self->engine->byte_size + 1, $self->data_length,
115 last unless $chain_loc;
117 $self = $self->engine->_load_sector( $chain_loc );