Mercurial > pub > Impl
diff Lib/CDBI/Map.pm @ 49:16ada169ca75
migrating to the Eclipse IDE
author | wizard@linux-odin.local |
---|---|
date | Fri, 26 Feb 2010 10:49:21 +0300 |
parents | 03e58a454b20 |
children | 76515373dac0 |
line wrap: on
line diff
--- a/Lib/CDBI/Map.pm Fri Feb 26 01:43:42 2010 +0300 +++ b/Lib/CDBI/Map.pm Fri Feb 26 10:49:21 2010 +0300 @@ -1,110 +1,110 @@ -package CDBI::Map; -use strict; -use Common; - -BEGIN { - DeclareProperty _Cache => ACCESS_NONE; - DeclareProperty _HoldingType => ACCESS_NONE; -} - -sub _KeyValuePairClass { - my $this = shift; - ($this->{$_HoldingType} = ref $this ) =~ s/^((?:\w+::)*)Map(\w+)$/${1}MapItem${2}/ unless $this->{$_HoldingType}; - return $this->{$_HoldingType}; -} - -# при загрузке кеша нельзя грузить KeyValuePair поскольку получатся циклические ссылки:( -sub GetCache { - my $this = shift; - - if (not $this->{$_Cache}) { - $this->{$_Cache} = { map { $_->ItemKey, { id => $_->id, value => $_->Value} } $this->_KeyValuePairClass->search(Parent => $this) }; - } - - return $this->{$_Cache}; -} - -sub Keys { - my $this = shift; - return wantarray ? keys %{$this->GetCache} : [keys %{$this->GetCache}]; -} - -sub Item { - my ($this,$key,$value,%options) = @_; - - die new Exception('A key must be specified') unless defined $key; - - if (@_ > 2) { - # set - if (my $pairInfo = $this->GetCache->{$key}) { - # update - my $pair = $this->_KeyValuePairClass->retrieve($pairInfo->{id}); - if (defined $value or $options{'keepnull'}) { - $pair->Value($value); - $pair->update; - $pairInfo->{value} = $value; - } else { - #delete - $pair->delete; - delete $this->GetCache->{$key}; - } - } else { - if ( defined $value or $options{'keepnull'}) { - my $pair = $this->_KeyValuePairClass->insert( {Parent => $this, ItemKey => $key, Value => $value } ); - $this->GetCache->{$key} = {id => $pair->id, value => $value }; - } - } - return $value; - } else { - # get - if (my $pairInfo = $this->GetCache->{$key}) { - return $pairInfo->{value}; - } else { - return undef; - } - } -} - -sub Delete { - my ($this,$key) = @_; - - if (my $pair = $this->GetCache->{$key} ) { - $pair->delete; - delete $this->GetCache->{$key}; - return 1; - } - return 0; -} - -sub Has { - my ($this,$key) = @_; - - return exists $this->GetCache->{$key}; -} - -1; -__END__ -=pod -=head1 SYNOPSIS -package App::CDBI; -use base 'Class::DBI'; - -#.... - -package App::MapString; -use base 'Class::DBI','CDBI::Map'; - -#.... - - -my $Map = App::MapString->retrieve($id); -print $Map->Item('key'); -$Map->Item('key','value'); -$Map->Delete('key'); -print "the $key is found" if $Map->Has($key); - -=head1 DESCRIPTION - -Provides a set of methods to manipulate with Maps; - -=cut \ No newline at end of file +package CDBI::Map; +use strict; +use Common; + +BEGIN { + DeclareProperty _Cache => ACCESS_NONE; + DeclareProperty _HoldingType => ACCESS_NONE; +} + +sub _KeyValuePairClass { + my $this = shift; + ($this->{$_HoldingType} = ref $this ) =~ s/^((?:\w+::)*)Map(\w+)$/${1}MapItem${2}/ unless $this->{$_HoldingType}; + return $this->{$_HoldingType}; +} + +# при загрузке кеша нельзя грузить KeyValuePair поскольку получатся циклические ссылки:( +sub GetCache { + my $this = shift; + + if (not $this->{$_Cache}) { + $this->{$_Cache} = { map { $_->ItemKey, { id => $_->id, value => $_->Value} } $this->_KeyValuePairClass->search(Parent => $this) }; + } + + return $this->{$_Cache}; +} + +sub Keys { + my $this = shift; + return wantarray ? keys %{$this->GetCache} : [keys %{$this->GetCache}]; +} + +sub Item { + my ($this,$key,$value,%options) = @_; + + die new Exception('A key must be specified') unless defined $key; + + if (@_ > 2) { + # set + if (my $pairInfo = $this->GetCache->{$key}) { + # update + my $pair = $this->_KeyValuePairClass->retrieve($pairInfo->{id}); + if (defined $value or $options{'keepnull'}) { + $pair->Value($value); + $pair->update; + $pairInfo->{value} = $value; + } else { + #delete + $pair->delete; + delete $this->GetCache->{$key}; + } + } else { + if ( defined $value or $options{'keepnull'}) { + my $pair = $this->_KeyValuePairClass->insert( {Parent => $this, ItemKey => $key, Value => $value } ); + $this->GetCache->{$key} = {id => $pair->id, value => $value }; + } + } + return $value; + } else { + # get + if (my $pairInfo = $this->GetCache->{$key}) { + return $pairInfo->{value}; + } else { + return undef; + } + } +} + +sub Delete { + my ($this,$key) = @_; + + if (my $pair = $this->GetCache->{$key} ) { + $pair->delete; + delete $this->GetCache->{$key}; + return 1; + } + return 0; +} + +sub Has { + my ($this,$key) = @_; + + return exists $this->GetCache->{$key}; +} + +1; +__END__ +=pod +=head1 SYNOPSIS +package App::CDBI; +use base 'Class::DBI'; + +#.... + +package App::MapString; +use base 'Class::DBI','CDBI::Map'; + +#.... + + +my $Map = App::MapString->retrieve($id); +print $Map->Item('key'); +$Map->Item('key','value'); +$Map->Delete('key'); +print "the $key is found" if $Map->Has($key); + +=head1 DESCRIPTION + +Provides a set of methods to manipulate with Maps; + +=cut