Commit | Line | Data |
065b45be |
1 | package DBM::Deep::Engine::Sector; |
2 | |
9c7d9738 |
3 | use 5.006_000; |
065b45be |
4 | |
5 | use strict; |
6 | use warnings FATAL => 'all'; |
7 | |
8 | use Scalar::Util (); |
9 | |
10 | sub new { |
11 | my $self = bless $_[1], $_[0]; |
12 | Scalar::Util::weaken( $self->{engine} ); |
a8d2331c |
13 | |
065b45be |
14 | $self->_init; |
a8d2331c |
15 | |
065b45be |
16 | return $self; |
17 | } |
18 | |
19 | #sub _init {} |
20 | #sub clone { DBM::Deep->_throw_error( "Must be implemented in the child class" ); } |
21 | |
22 | sub engine { $_[0]{engine} } |
23 | sub offset { $_[0]{offset} } |
a8d2331c |
24 | sub type { $_[0]{type} } |
065b45be |
25 | |
26 | sub base_size { |
badf847c |
27 | my $self = shift; |
28 | if ( ref($self) ) { |
29 | return $self->engine->SIG_SIZE + $DBM::Deep::Engine::STALE_SIZE; |
30 | } |
31 | else { |
32 | return $_[0]->SIG_SIZE + $DBM::Deep::Engine::STALE_SIZE; |
33 | } |
065b45be |
34 | } |
35 | |
36 | sub free { |
37 | my $self = shift; |
38 | |
39 | my $e = $self->engine; |
40 | |
a8d2331c |
41 | $self->write( 0, $e->SIG_FREE ); |
42 | $self->write( $self->base_size, chr(0) x ($self->size - $self->base_size) ); |
43 | |
065b45be |
44 | my $free_meth = $self->free_meth; |
badf847c |
45 | $e->$free_meth( $self ); |
065b45be |
46 | |
47 | return; |
48 | } |
49 | |
a8d2331c |
50 | sub read { |
51 | my $self = shift; |
badf847c |
52 | |
53 | if ( @_ == 1 ) { |
54 | return substr( ${$self->engine->get_data( $self->offset, $self->size )}, $_[0] ); |
55 | } |
56 | elsif ( @_ == 2 ) { |
57 | return substr( ${$self->engine->get_data( $self->offset, $self->size )}, $_[0], $_[1] ); |
58 | } |
59 | elsif ( @_ < 1 ) { |
60 | die "read( start [, length ]): No parameters found."; |
a8d2331c |
61 | } |
62 | else { |
badf847c |
63 | die "read( start [, length ]): Too many parameters found (@_)."; |
a8d2331c |
64 | } |
65 | } |
66 | |
67 | sub write { |
68 | my $self = shift; |
69 | my ($start, $text) = @_; |
70 | |
badf847c |
71 | substr( ${$self->engine->get_data( $self->offset, $self->size )}, $start, length($text) ) = $text; |
a8d2331c |
72 | |
73 | $self->mark_dirty; |
74 | } |
75 | |
76 | sub mark_dirty { |
77 | my $self = shift; |
badf847c |
78 | $self->engine->add_dirty_sector( $self->offset ); |
a8d2331c |
79 | } |
80 | |
065b45be |
81 | 1; |
82 | __END__ |