e6a0cccd0e517cbdb4c267a3768b37dbe80ef556
[dbsrgits/DBM-Deep.git] / lib / DBM / Deep / Sector / DBI / Reference.pm
1 package DBM::Deep::Sector::DBI::Reference;
2
3 use 5.006_000;
4
5 use strict;
6 use warnings FATAL => 'all';
7
8 use base 'DBM::Deep::Sector::DBI';
9
10 sub table { 'refs' }
11
12 sub _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
35 sub 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
53 sub 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
69 sub 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
86 1;
87 __END__