Started refactoring of Iterator hierarchy
[dbsrgits/DBM-Deep.git] / lib / DBM / Deep / Sector / DBI / Reference.pm
CommitLineData
a4d36ff6 1package DBM::Deep::Sector::DBI::Reference;
2
3use 5.006_000;
4
5use strict;
6use warnings FATAL => 'all';
7
8use base 'DBM::Deep::Sector::DBI';
9
10sub table { 'refs' }
11
12sub _init {
13 my $self = shift;
14
15 my $e = $self->engine;
16
17 unless ( $self->offset ) {
18 $self->{offset} = $self->engine->storage->write_to(
19 refs => undef,
20 ref_type => $self->type,
21 );
22 }
23 else {
24 my ($rows) = $self->engine->storage->read_from(
25 refs => $self->offset,
26 qw( ref_type ),
27 );
28
29 $self->{type} = $rows->[0]{ref_type};
30 }
31
32 return;
33}
34
35sub get_data_for {
36 my $self = shift;
37 my ($args) = @_;
38
39 my ($rows) = $self->engine->storage->read_from(
40 datas => { ref_id => $self->offset, key => $args->{key} },
41 qw( id ),
42 );
43
44 return unless $rows->[0]{id};
45
46 $self->load(
47 $self->engine,
48 $rows->[0]{id},
49 'datas',
50 );
51}
52
53sub write_data {
54 my $self = shift;
55 my ($args) = @_;
56
57 $self->engine->storage->write_to(
58 datas => $args->{value}{offset},
59 ref_id => $self->offset,
60 data_type => 'S',
61 key => $args->{key},
62 value => $args->{value}{data},
63 class => $args->{value}{class},
64 );
65
66 $args->{value}->reload;
67}
68
69sub delete_key {
70 my $self = shift;
71 my ($args) = @_;
72
73 my $old_value = $self->get_data_for({
74 key => $args->{key},
75 });
76
77 my $data;
78 if ( $old_value ) {
79 $data = $old_value->data;
80 $old_value->free;
81 }
82
83 return $data;
84}
85
861;
87__END__