comparison Lib/CDBI/Map.pm @ 0:03e58a454b20

Создан репозитарий
author Sergey
date Tue, 14 Jul 2009 12:54:37 +0400
parents
children 16ada169ca75
comparison
equal deleted inserted replaced
-1:000000000000 0:03e58a454b20
1 package CDBI::Map;
2 use strict;
3 use Common;
4
5 BEGIN {
6 DeclareProperty _Cache => ACCESS_NONE;
7 DeclareProperty _HoldingType => ACCESS_NONE;
8 }
9
10 sub _KeyValuePairClass {
11 my $this = shift;
12 ($this->{$_HoldingType} = ref $this ) =~ s/^((?:\w+::)*)Map(\w+)$/${1}MapItem${2}/ unless $this->{$_HoldingType};
13 return $this->{$_HoldingType};
14 }
15
16 # ïðè çàãðóçêå êåøà íåëüçÿ ãðóçèòü KeyValuePair ïîñêîëüêó ïîëó÷àòñÿ öèêëè÷åñêèå ññûëêè:(
17 sub GetCache {
18 my $this = shift;
19
20 if (not $this->{$_Cache}) {
21 $this->{$_Cache} = { map { $_->ItemKey, { id => $_->id, value => $_->Value} } $this->_KeyValuePairClass->search(Parent => $this) };
22 }
23
24 return $this->{$_Cache};
25 }
26
27 sub Keys {
28 my $this = shift;
29 return wantarray ? keys %{$this->GetCache} : [keys %{$this->GetCache}];
30 }
31
32 sub Item {
33 my ($this,$key,$value,%options) = @_;
34
35 die new Exception('A key must be specified') unless defined $key;
36
37 if (@_ > 2) {
38 # set
39 if (my $pairInfo = $this->GetCache->{$key}) {
40 # update
41 my $pair = $this->_KeyValuePairClass->retrieve($pairInfo->{id});
42 if (defined $value or $options{'keepnull'}) {
43 $pair->Value($value);
44 $pair->update;
45 $pairInfo->{value} = $value;
46 } else {
47 #delete
48 $pair->delete;
49 delete $this->GetCache->{$key};
50 }
51 } else {
52 if ( defined $value or $options{'keepnull'}) {
53 my $pair = $this->_KeyValuePairClass->insert( {Parent => $this, ItemKey => $key, Value => $value } );
54 $this->GetCache->{$key} = {id => $pair->id, value => $value };
55 }
56 }
57 return $value;
58 } else {
59 # get
60 if (my $pairInfo = $this->GetCache->{$key}) {
61 return $pairInfo->{value};
62 } else {
63 return undef;
64 }
65 }
66 }
67
68 sub Delete {
69 my ($this,$key) = @_;
70
71 if (my $pair = $this->GetCache->{$key} ) {
72 $pair->delete;
73 delete $this->GetCache->{$key};
74 return 1;
75 }
76 return 0;
77 }
78
79 sub Has {
80 my ($this,$key) = @_;
81
82 return exists $this->GetCache->{$key};
83 }
84
85 1;
86 __END__
87 =pod
88 =head1 SYNOPSIS
89 package App::CDBI;
90 use base 'Class::DBI';
91
92 #....
93
94 package App::MapString;
95 use base 'Class::DBI','CDBI::Map';
96
97 #....
98
99
100 my $Map = App::MapString->retrieve($id);
101 print $Map->Item('key');
102 $Map->Item('key','value');
103 $Map->Delete('key');
104 print "the $key is found" if $Map->Has($key);
105
106 =head1 DESCRIPTION
107
108 Provides a set of methods to manipulate with Maps;
109
110 =cut