1 package DBM::Deep::Engine::DBI;
6 use warnings FATAL => 'all';
8 use base 'DBM::Deep::Engine';
10 use DBM::Deep::Sector::DBI ();
11 use DBM::Deep::Storage::DBI ();
13 sub sector_type { 'DBM::Deep::Sector::DBI' }
29 my ($obj, $old_key, $new_key) = @_;
44 my ($obj, $key, $value) = @_;
46 my $r = Scalar::Util::reftype( $value ) || '';
50 last if $r eq 'ARRAY';
52 DBM::Deep->_throw_error(
53 "Storage of references of type '$r' is not supported."
57 # Load the reference entry
58 # Determine if the row was deleted under us
62 if ( $r eq 'ARRAY' || $r eq 'HASH' ) {
64 if ( $r eq 'ARRAY' ) {
65 $tmpvar = tied @$value;
66 } elsif ( $r eq 'HASH' ) {
67 $tmpvar = tied %$value;
71 my $is_dbm_deep = eval { local $SIG{'__DIE__'}; $tmpvar->isa( 'DBM::Deep' ); };
73 unless ( $is_dbm_deep ) {
74 DBM::Deep->_throw_error( "Cannot store something that is tied." );
77 unless ( $tmpvar->_engine->storage == $self->storage ) {
78 DBM::Deep->_throw_error( "Cannot store values across DBM::Deep files. Please use export() instead." );
81 # Load $tmpvar's sector
83 # First, verify if we're storing the same thing to this spot. If we
84 # are, then this should be a no-op. -EJS, 2008-05-19
86 # See whether or not we are storing ourselves to ourself.
87 # Write the sector as data in this reference (keyed by $key)
88 $value_sector->increment_refcount;
93 $type = substr( $r, 0, 1 );
97 DBM::Deep->_throw_error( "Cannot store something that is tied." );
101 # This code is to make sure we write all the values in the $value to the
102 # disk and to make sure all changes to $value after the assignment are
103 # reflected on disk. This may be counter-intuitive at first, but it is
105 # NOTE - simply tying $value won't perform a STORE on each value. Hence,
106 # the copy to a temp value.
107 if ( $r eq 'ARRAY' ) {
109 tie @$value, 'DBM::Deep', {
110 base_offset => $value_sector->offset,
111 staleness => $value_sector->staleness,
112 storage => $self->storage,
116 bless $value, 'DBM::Deep::Array' unless Scalar::Util::blessed( $value );
118 elsif ( $r eq 'HASH' ) {
120 tie %$value, 'DBM::Deep', {
121 base_offset => $value_sector->offset,
122 staleness => $value_sector->staleness,
123 storage => $self->storage,
128 bless $value, 'DBM::Deep::Hash' unless Scalar::Util::blessed( $value );