1 package DBM::Deep::Engine::Sector;
6 use warnings FATAL => 'all';
11 my $self = bless $_[1], $_[0];
12 Scalar::Util::weaken( $self->{engine} );
20 #sub clone { DBM::Deep->_throw_error( "Must be implemented in the child class" ); }
22 sub engine { $_[0]{engine} }
23 sub offset { $_[0]{offset} }
24 sub type { $_[0]{type} }
29 return $self->engine->SIG_SIZE + $DBM::Deep::Engine::STALE_SIZE;
32 return $_[0]->SIG_SIZE + $DBM::Deep::Engine::STALE_SIZE;
39 my $e = $self->engine;
41 $self->write( 0, $e->SIG_FREE );
42 $self->write( $self->base_size, chr(0) x ($self->size - $self->base_size) );
44 my $free_meth = $self->free_meth;
45 $e->$free_meth( $self );
54 die "read(): Start ($_[0]) is too large" if $_[0] > $self->size;
55 return substr( ${$self->engine->get_data( $self->offset, $self->size )}, $_[0] );
58 die "read(): Start ($_[0]) is too large" if $_[0] > $self->size;
59 die "read(): Length ($_[1]) is too large" if $_[1] > $self->size;
60 return substr( ${$self->engine->get_data( $self->offset, $self->size )}, $_[0], $_[1] );
63 die "read( start [, length ]): No parameters found.";
66 die "read( start [, length ]): Too many parameters found (@_).";
72 my ($start, $text) = @_;
74 die "write(): Start ($start) is too large" if $start > $self->size;
75 die "write(): length(\$text) (@{[length($text)]}) is too large" if length($text) > $self->size;
76 substr( ${$self->engine->get_data( $self->offset, $self->size )}, $start, length($text) ) = $text;
83 $self->engine->add_dirty_sector( $self->offset );