Optimization: First broke out all the classes that were in Engine.pm so that I can...
[dbsrgits/DBM-Deep.git] / lib / DBM / Deep / Engine / Sector / Scalar.pm
CommitLineData
065b45be 1#TODO: Convert this to a string
2package DBM::Deep::Engine::Sector::Scalar;
3
4use 5.006;
5
6use strict;
7use warnings FATAL => 'all';
8
9our $VERSION = '0.01';
10
11use DBM::Deep::Engine::Sector::Data;
12our @ISA = qw( DBM::Deep::Engine::Sector::Data );
13
14sub free {
15 my $self = shift;
16
17 my $chain_loc = $self->chain_loc;
18
19 $self->SUPER::free();
20
21 if ( $chain_loc ) {
22 $self->engine->_load_sector( $chain_loc )->free;
23 }
24
25 return;
26}
27
28sub type { $_[0]{engine}->SIG_DATA }
29sub _init {
30 my $self = shift;
31
32 my $engine = $self->engine;
33
34 unless ( $self->offset ) {
35 my $data_section = $self->size - $self->base_size - $engine->byte_size - 1;
36
37 $self->{offset} = $engine->_request_data_sector( $self->size );
38
39 my $data = delete $self->{data};
40 my $dlen = length $data;
41 my $continue = 1;
42 my $curr_offset = $self->offset;
43 while ( $continue ) {
44
45 my $next_offset = 0;
46
47 my ($leftover, $this_len, $chunk);
48 if ( $dlen > $data_section ) {
49 $leftover = 0;
50 $this_len = $data_section;
51 $chunk = substr( $data, 0, $this_len );
52
53 $dlen -= $data_section;
54 $next_offset = $engine->_request_data_sector( $self->size );
55 $data = substr( $data, $this_len );
56 }
57 else {
58 $leftover = $data_section - $dlen;
59 $this_len = $dlen;
60 $chunk = $data;
61
62 $continue = 0;
63 }
64
65 $engine->storage->print_at( $curr_offset, $self->type ); # Sector type
66 # Skip staleness
67 $engine->storage->print_at( $curr_offset + $self->base_size,
68 pack( $engine->StP($engine->byte_size), $next_offset ), # Chain loc
69 pack( $engine->StP(1), $this_len ), # Data length
70 $chunk, # Data to be stored in this sector
71 chr(0) x $leftover, # Zero-fill the rest
72 );
73
74 $curr_offset = $next_offset;
75 }
76
77 return;
78 }
79}
80
81sub data_length {
82 my $self = shift;
83
84 my $buffer = $self->engine->storage->read_at(
85 $self->offset + $self->base_size + $self->engine->byte_size, 1
86 );
87
88 return unpack( $self->engine->StP(1), $buffer );
89}
90
91sub chain_loc {
92 my $self = shift;
93 return unpack(
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,
98 ),
99 );
100}
101
102sub data {
103 my $self = shift;
104# my ($args) = @_;
105# $args ||= {};
106
107 my $data;
108 while ( 1 ) {
109 my $chain_loc = $self->chain_loc;
110
111 $data .= $self->engine->storage->read_at(
112 $self->offset + $self->base_size + $self->engine->byte_size + 1, $self->data_length,
113 );
114
115 last unless $chain_loc;
116
117 $self = $self->engine->_load_sector( $chain_loc );
118 }
119
120 return $data;
121}
122
1231;
124__END__