Hash tests pass again with header being read and cached
[dbsrgits/DBM-Deep.git] / lib / DBM / Deep / Engine / Sector.pm
index be079d0..c997ec7 100644 (file)
@@ -1,6 +1,6 @@
 package DBM::Deep::Engine::Sector;
 
-use 5.006;
+use 5.006_000;
 
 use strict;
 use warnings FATAL => 'all';
@@ -10,7 +10,9 @@ use Scalar::Util ();
 sub new {
     my $self = bless $_[1], $_[0];
     Scalar::Util::weaken( $self->{engine} );
+
     $self->_init;
+
     return $self;
 }
 
@@ -19,12 +21,16 @@ sub new {
 
 sub engine { $_[0]{engine} }
 sub offset { $_[0]{offset} }
-sub type   { $_[0]{type} }
+sub type   { $_[0]{type}   }
 
 sub base_size {
-   my $self = shift;
-   no warnings 'once';
-   return $self->engine->SIG_SIZE + $DBM::Deep::Engine::STALE_SIZE;
+    my $self = shift;
+    if ( ref($self) ) {
+        return $self->engine->SIG_SIZE + $DBM::Deep::Engine::STALE_SIZE;
+    }
+    else {
+        return $_[0]->SIG_SIZE + $DBM::Deep::Engine::STALE_SIZE;
+    }
 }
 
 sub free {
@@ -32,17 +38,45 @@ sub free {
 
     my $e = $self->engine;
 
-    $e->storage->print_at( $self->offset, $e->SIG_FREE );
-    # Skip staleness counter
-    $e->storage->print_at( $self->offset + $self->base_size,
-        chr(0) x ($self->size - $self->base_size),
-    );
+    $self->write( 0, $e->SIG_FREE );
+    $self->write( $self->base_size, chr(0) x ($self->size - $self->base_size) );
 
     my $free_meth = $self->free_meth;
-    $e->$free_meth( $self->offset, $self->size );
+    $e->$free_meth( $self );
 
     return;
 }
 
+sub read {
+    my $self = shift;
+
+    if ( @_ == 1 ) {
+        return substr( ${$self->engine->get_data( $self->offset, $self->size )}, $_[0] );
+    }
+    elsif ( @_ == 2 ) {
+        return substr( ${$self->engine->get_data( $self->offset, $self->size )}, $_[0], $_[1] );
+    }
+    elsif ( @_ < 1 ) {
+        die "read( start [, length ]): No parameters found.";
+    }
+    else {
+        die "read( start [, length ]): Too many parameters found (@_).";
+    }
+}
+
+sub write {
+    my $self = shift;
+    my ($start, $text) = @_;
+
+    substr( ${$self->engine->get_data( $self->offset, $self->size )}, $start, length($text) ) = $text;
+
+    $self->mark_dirty;
+}
+
+sub mark_dirty {
+    my $self = shift;
+    $self->engine->add_dirty_sector( $self->offset );
+}
+
 1;
 __END__