The header now has its own sector. A lot needs to be moved over to it, but it's there.
[dbsrgits/DBM-Deep.git] / lib / DBM / Deep / Engine / Sector / Scalar.pm
CommitLineData
00d9bd0b 1#TODO: Add chaining back in.
065b45be 2package DBM::Deep::Engine::Sector::Scalar;
3
9c7d9738 4use 5.006_000;
065b45be 5
6use strict;
7use warnings FATAL => 'all';
8
065b45be 9use DBM::Deep::Engine::Sector::Data;
10our @ISA = qw( DBM::Deep::Engine::Sector::Data );
11
12sub free {
13 my $self = shift;
14
15 my $chain_loc = $self->chain_loc;
16
17 $self->SUPER::free();
18
19 if ( $chain_loc ) {
20 $self->engine->_load_sector( $chain_loc )->free;
21 }
22
23 return;
24}
25
26sub type { $_[0]{engine}->SIG_DATA }
27sub _init {
28 my $self = shift;
29
30 my $engine = $self->engine;
31
32 unless ( $self->offset ) {
065b45be 33 $self->{offset} = $engine->_request_data_sector( $self->size );
065b45be 34 my $data = delete $self->{data};
35 my $dlen = length $data;
64d41c49 36
37 my $data_section = $self->size - $self->base_size - $engine->byte_size - 1;
00d9bd0b 38 my $next_offset = 0;
64d41c49 39
00d9bd0b 40 if ( $dlen > $data_section ) {
41 DBM::Deep->_throw_error( "Storage of values longer than $data_section not supported." );
065b45be 42 }
43
00d9bd0b 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
48 . $data
49 );
50
065b45be 51 return;
52 }
53}
54
55sub data_length {
56 my $self = shift;
57
00d9bd0b 58 return unpack(
59 $self->engine->StP(1),
60 $self->read( $self->base_size + $self->engine->byte_size, 1 ),
065b45be 61 );
065b45be 62}
63
64sub chain_loc {
65 my $self = shift;
66 return unpack(
67 $self->engine->StP($self->engine->byte_size),
00d9bd0b 68 $self->read(
69 $self->base_size,
065b45be 70 $self->engine->byte_size,
71 ),
72 );
73}
74
75sub data {
76 my $self = shift;
065b45be 77
78 my $data;
79 while ( 1 ) {
80 my $chain_loc = $self->chain_loc;
81
00d9bd0b 82 $data .= $self->read( $self->base_size + $self->engine->byte_size + 1, $self->data_length );
065b45be 83
84 last unless $chain_loc;
85
86 $self = $self->engine->_load_sector( $chain_loc );
87 }
88
89 return $data;
90}
91
921;
93__END__