#!/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 cached {
	my $this=shift;
	my $item=shift;
	unless (exists $this->{cache}->{$item}) {
		return unless $this->accept($item);
		debug "db $this->{name}" => "cache miss on $item";
		if (my $cache=$this->load($item)) {
			$this->{cache}->{$item}=$cache;
			$this->{dirty}->{$item}=0;
		}
	}
	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;
	return if $this->{readonly};
	$this->cached($item);
	if (! defined $this->{cache}->{$item}) {
		return if ! $this->accept($item);
		debug "db $this->{name}" => "creating in-cache $item";
		$this->{cache}->{$item}={
			owners => {},
			fields => {},
			variables => {},
			flags => {},
		}
	}
	$this->{dirty}->{$item}=1;
	$this->{cache}->{$item}->{owners}->{$owner}=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
