1 package DBM::Deep::Engine::Sector;
6 use warnings FATAL => 'all';
11 my $self = bless $_[1], $_[0];
12 Scalar::Util::weaken( $self->{engine} );
14 if ( $self->offset ) {
15 $self->{string} = $self->engine->storage->read_at(
16 $self->offset, $self->size,
20 $self->{string} = chr(0) x $self->size;
29 #sub clone { DBM::Deep->_throw_error( "Must be implemented in the child class" ); }
31 sub engine { $_[0]{engine} }
32 sub offset { $_[0]{offset} }
33 sub type { $_[0]{type} }
38 return $self->engine->SIG_SIZE + $DBM::Deep::Engine::STALE_SIZE;
44 my $e = $self->engine;
46 $self->write( 0, $e->SIG_FREE );
47 $self->write( $self->base_size, chr(0) x ($self->size - $self->base_size) );
51 # $e->storage->print_at( $self->offset, $e->SIG_FREE );
52 # # Skip staleness counter
53 # $e->storage->print_at( $self->offset + $self->base_size,
54 # chr(0) x ($self->size - $self->base_size),
57 #TODO When freeing two sectors, we cannot flush them right away! This means the following:
58 # 1) The header has to understand about unflushed items.
59 # 2) Loading a sector has to go through a cache to make sure we see what's already been loaded.
60 # 3) The header should be cached.
62 my $free_meth = $self->free_meth;
63 $e->$free_meth( $self->offset, $self->size );
70 my ($start, $length) = @_;
72 return substr( $self->{string}, $start, $length );
75 return substr( $self->{string}, $start );
81 my ($start, $text) = @_;
83 substr( $self->{string}, $start, length($text) ) = $text;
90 $self->engine->add_dirty_sector( $self );
95 $self->engine->storage->print_at( $self->offset, $self->{string} );