1 package DBM::Deep::Sector::DBI::Reference;
6 use warnings FATAL => 'all';
8 use base 'DBM::Deep::Sector::DBI';
15 my $e = $self->engine;
17 unless ( $self->offset ) {
18 $self->{offset} = $self->engine->storage->write_to(
20 ref_type => $self->type,
24 my ($rows) = $self->engine->storage->read_from(
25 refs => $self->offset,
29 $self->{type} = $rows->[0]{ref_type};
39 my ($rows) = $self->engine->storage->read_from(
40 datas => { ref_id => $self->offset, key => $args->{key} },
44 return unless $rows->[0]{id};
57 if ( ( $args->{value}->type || 'S' ) eq 'S' ) {
58 $self->engine->storage->write_to(
59 datas => $args->{value}{offset},
60 ref_id => $self->offset,
63 value => $args->{value}{data},
64 class => $args->{value}{class},
68 $self->engine->storage->write_to(
69 datas => $args->{value}{offset},
70 ref_id => $self->offset,
73 value => $args->{value}{offset},
74 class => $args->{value}{class},
78 $args->{value}->reload;
85 my $old_value = $self->get_data_for({
91 $data = $old_value->data({ export => 1 });
108 my $obj = DBM::Deep->new({
110 base_offset => $self->offset,
111 # staleness => $self->staleness,
112 storage => $self->engine->storage,
113 engine => $self->engine,
116 if ( $self->engine->storage->{autobless} ) {
117 my $classname = $self->get_classname;
118 if ( defined $classname ) {
119 bless $obj, $classname;
123 # We're not exporting, so just return.
124 unless ( $args->{export} ) {
128 # We shouldn't export if this is still referred to.
129 if ( $self->get_refcount > 1 ) {
139 # We're not ready to be removed yet.
140 if ( $self->decrement_refcount > 0 ) {
144 $self->engine->storage->delete_from(
145 'datas', { ref_id => $self->offset },
148 $self->engine->storage->delete_from(
149 'datas', { value => $self->offset, data_type => 'R' },
152 $self->SUPER::free( @_ );
155 sub increment_refcount {
159 sub decrement_refcount {