1 package DBM::Deep::Engine::Sector::Scalar;
6 use warnings FATAL => 'all';
8 use base qw( DBM::Deep::Engine::Sector::Data );
12 # Please refer to the pack() documentation for further information
14 1 => 'C', # Unsigned char value (no order needed as it's just one byte)
15 2 => 'n', # Unsigned short in "network" (big-endian) order
16 4 => 'N', # Unsigned long in "network" (big-endian) order
17 8 => 'Q', # Usigned quad (no order specified, presumably machine-dependent)
23 my $chain_loc = $self->chain_loc;
28 $self->engine->_load_sector( $chain_loc )->free;
34 sub type { $_[0]{engine}->SIG_DATA }
38 my $engine = $self->engine;
40 unless ( $self->offset ) {
41 my $data_section = $self->size - $self->base_size - $engine->byte_size - 1;
43 $self->{offset} = $engine->_request_data_sector( $self->size );
45 my $data = delete $self->{data};
46 my $dlen = length $data;
48 my $curr_offset = $self->offset;
53 my ($leftover, $this_len, $chunk);
54 if ( $dlen > $data_section ) {
56 $this_len = $data_section;
57 $chunk = substr( $data, 0, $this_len );
59 $dlen -= $data_section;
60 $next_offset = $engine->_request_data_sector( $self->size );
61 $data = substr( $data, $this_len );
64 $leftover = $data_section - $dlen;
71 $engine->storage->print_at( $curr_offset, $self->type ); # Sector type
73 $engine->storage->print_at( $curr_offset + $self->base_size,
74 pack( $StP{$engine->byte_size}, $next_offset ), # Chain loc
75 pack( $StP{1}, $this_len ), # Data length
76 $chunk, # Data to be stored in this sector
77 chr(0) x $leftover, # Zero-fill the rest
80 $curr_offset = $next_offset;
90 my $buffer = $self->engine->storage->read_at(
91 $self->offset + $self->base_size + $self->engine->byte_size, 1
94 return unpack( $StP{1}, $buffer );
100 $StP{$self->engine->byte_size},
101 $self->engine->storage->read_at(
102 $self->offset + $self->base_size,
103 $self->engine->byte_size,
115 my $chain_loc = $self->chain_loc;
117 $data .= $self->engine->storage->read_at(
118 $self->offset + $self->base_size + $self->engine->byte_size + 1, $self->data_length,
121 last unless $chain_loc;
123 $self = $self->engine->_load_sector( $chain_loc );