272 lines
4.7 KiB
Perl
272 lines
4.7 KiB
Perl
#!/usr/bin/perl -w
|
|
# This file was preprocessed, do not edit!
|
|
|
|
|
|
package Debconf::DbDriver::Cache;
|
|
use strict;
|
|
use Debconf::Log qw{:all};
|
|
use base 'Debconf::DbDriver';
|
|
|
|
|
|
use fields qw(cache dirty);
|
|
|
|
|
|
sub iterator {
|
|
my $this=shift;
|
|
my $subiterator=shift;
|
|
|
|
my @items=keys %{$this->{cache}};
|
|
my $iterator=Debconf::Iterator->new(callback => sub {
|
|
while (my $item = pop @items) {
|
|
next unless defined $this->{cache}->{$item};
|
|
return $item;
|
|
}
|
|
return unless $subiterator;
|
|
my $ret;
|
|
do {
|
|
$ret=$subiterator->iterate;
|
|
} while defined $ret and exists $this->{cache}->{$ret};
|
|
return $ret;
|
|
});
|
|
return $iterator;
|
|
}
|
|
|
|
|
|
sub exists {
|
|
my $this=shift;
|
|
my $item=shift;
|
|
|
|
return $this->{cache}->{$item}
|
|
if exists $this->{cache}->{$item};
|
|
return 0;
|
|
}
|
|
|
|
|
|
sub init {
|
|
my $this=shift;
|
|
|
|
$this->{cache} = {} unless exists $this->{cache};
|
|
}
|
|
|
|
|
|
sub cacheadd {
|
|
my $this=shift;
|
|
my $item=shift;
|
|
my $entry=shift;
|
|
|
|
return if exists $this->{cache}->{$item};
|
|
|
|
$this->{cache}->{$item}=$entry;
|
|
$this->{dirty}->{$item}=0;
|
|
}
|
|
|
|
|
|
sub cachedata {
|
|
my $this=shift;
|
|
my $item=shift;
|
|
|
|
return $this->{cache}->{$item};
|
|
}
|
|
|
|
|
|
sub cached {
|
|
my $this=shift;
|
|
my $item=shift;
|
|
|
|
unless (exists $this->{cache}->{$item}) {
|
|
debug "db $this->{name}" => "cache miss on $item";
|
|
$this->load($item);
|
|
}
|
|
return $this->{cache}->{$item};
|
|
}
|
|
|
|
|
|
sub shutdown {
|
|
my $this=shift;
|
|
|
|
return if $this->{readonly};
|
|
|
|
my $ret=1;
|
|
foreach my $item (keys %{$this->{cache}}) {
|
|
if (not defined $this->{cache}->{$item}) {
|
|
$ret=undef unless defined $this->remove($item);
|
|
delete $this->{cache}->{$item};
|
|
}
|
|
elsif ($this->{dirty}->{$item}) {
|
|
$ret=undef unless defined $this->save($item, $this->{cache}->{$item});
|
|
$this->{dirty}->{$item}=0;
|
|
}
|
|
}
|
|
return $ret;
|
|
}
|
|
|
|
|
|
sub addowner {
|
|
my $this=shift;
|
|
my $item=shift;
|
|
my $owner=shift;
|
|
my $type=shift;
|
|
|
|
return if $this->{readonly};
|
|
$this->cached($item);
|
|
|
|
if (! defined $this->{cache}->{$item}) {
|
|
return if ! $this->accept($item, $type);
|
|
debug "db $this->{name}" => "creating in-cache $item";
|
|
$this->{cache}->{$item}={
|
|
owners => {},
|
|
fields => {},
|
|
variables => {},
|
|
flags => {},
|
|
}
|
|
}
|
|
|
|
if (! exists $this->{cache}->{$item}->{owners}->{$owner}) {
|
|
$this->{cache}->{$item}->{owners}->{$owner}=1;
|
|
$this->{dirty}->{$item}=1;
|
|
}
|
|
return $owner;
|
|
}
|
|
|
|
|
|
sub removeowner {
|
|
my $this=shift;
|
|
my $item=shift;
|
|
my $owner=shift;
|
|
|
|
return if $this->{readonly};
|
|
return unless $this->cached($item);
|
|
|
|
if (exists $this->{cache}->{$item}->{owners}->{$owner}) {
|
|
delete $this->{cache}->{$item}->{owners}->{$owner};
|
|
$this->{dirty}->{$item}=1;
|
|
}
|
|
unless (keys %{$this->{cache}->{$item}->{owners}}) {
|
|
$this->{cache}->{$item}=undef;
|
|
$this->{dirty}->{$item}=1;
|
|
}
|
|
return $owner;
|
|
}
|
|
|
|
|
|
sub owners {
|
|
my $this=shift;
|
|
my $item=shift;
|
|
|
|
return unless $this->cached($item);
|
|
return keys %{$this->{cache}->{$item}->{owners}};
|
|
}
|
|
|
|
|
|
sub getfield {
|
|
my $this=shift;
|
|
my $item=shift;
|
|
my $field=shift;
|
|
|
|
return unless $this->cached($item);
|
|
return $this->{cache}->{$item}->{fields}->{$field};
|
|
}
|
|
|
|
|
|
sub setfield {
|
|
my $this=shift;
|
|
my $item=shift;
|
|
my $field=shift;
|
|
my $value=shift;
|
|
|
|
return if $this->{readonly};
|
|
return unless $this->cached($item);
|
|
$this->{dirty}->{$item}=1;
|
|
return $this->{cache}->{$item}->{fields}->{$field} = $value;
|
|
}
|
|
|
|
|
|
sub removefield {
|
|
my $this=shift;
|
|
my $item=shift;
|
|
my $field=shift;
|
|
|
|
return if $this->{readonly};
|
|
return unless $this->cached($item);
|
|
$this->{dirty}->{$item}=1;
|
|
return delete $this->{cache}->{$item}->{fields}->{$field};
|
|
}
|
|
|
|
|
|
sub fields {
|
|
my $this=shift;
|
|
my $item=shift;
|
|
|
|
return unless $this->cached($item);
|
|
return keys %{$this->{cache}->{$item}->{fields}};
|
|
}
|
|
|
|
|
|
sub getflag {
|
|
my $this=shift;
|
|
my $item=shift;
|
|
my $flag=shift;
|
|
|
|
return unless $this->cached($item);
|
|
return $this->{cache}->{$item}->{flags}->{$flag}
|
|
if exists $this->{cache}->{$item}->{flags}->{$flag};
|
|
return 'false';
|
|
}
|
|
|
|
|
|
sub setflag {
|
|
my $this=shift;
|
|
my $item=shift;
|
|
my $flag=shift;
|
|
my $value=shift;
|
|
|
|
return if $this->{readonly};
|
|
return unless $this->cached($item);
|
|
$this->{dirty}->{$item}=1;
|
|
return $this->{cache}->{$item}->{flags}->{$flag} = $value;
|
|
}
|
|
|
|
|
|
sub flags {
|
|
my $this=shift;
|
|
my $item=shift;
|
|
|
|
return unless $this->cached($item);
|
|
return keys %{$this->{cache}->{$item}->{flags}};
|
|
}
|
|
|
|
|
|
sub getvariable {
|
|
my $this=shift;
|
|
my $item=shift;
|
|
my $variable=shift;
|
|
|
|
return unless $this->cached($item);
|
|
return $this->{cache}->{$item}->{variables}->{$variable};
|
|
}
|
|
|
|
|
|
sub setvariable {
|
|
my $this=shift;
|
|
my $item=shift;
|
|
my $variable=shift;
|
|
my $value=shift;
|
|
|
|
return if $this->{readonly};
|
|
return unless $this->cached($item);
|
|
$this->{dirty}->{$item}=1;
|
|
return $this->{cache}->{$item}->{variables}->{$variable} = $value;
|
|
}
|
|
|
|
|
|
sub variables {
|
|
my $this=shift;
|
|
my $item=shift;
|
|
|
|
return unless $this->cached($item);
|
|
return keys %{$this->{cache}->{$item}->{variables}};
|
|
}
|
|
|
|
|
|
1
|