Hash tests pass again with header being read and cached
[dbsrgits/DBM-Deep.git] / lib / DBM / Deep / Engine / Sector.pm
CommitLineData
065b45be 1package DBM::Deep::Engine::Sector;
2
9c7d9738 3use 5.006_000;
065b45be 4
5use strict;
6use warnings FATAL => 'all';
7
8use Scalar::Util ();
9
10sub 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
22sub engine { $_[0]{engine} }
23sub offset { $_[0]{offset} }
a8d2331c 24sub type { $_[0]{type} }
065b45be 25
26sub 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
36sub 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 50sub 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
67sub 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
76sub mark_dirty {
77 my $self = shift;
badf847c 78 $self->engine->add_dirty_sector( $self->offset );
a8d2331c 79}
80
065b45be 811;
82__END__