File: Backup.pm

package info (click to toggle)
debconf 1.5.11etch2
  • links: PTS
  • area: main
  • in suites: etch
  • size: 3,364 kB
  • ctags: 714
  • sloc: perl: 8,347; sh: 286; makefile: 174; python: 117
file content (138 lines) | stat: -rw-r--r-- 2,640 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/usr/bin/perl -w

=head1 NAME

Debconf::DbDriver::Backup - backup writes to a db

=cut

package Debconf::DbDriver::Backup;
use strict;
use Debconf::Log qw{:all};
use base 'Debconf::DbDriver::Copy';

=head1 DESCRIPTION

This driver passes all reads and writes on to another database. But
copies of all writes are sent to a second database, too.

=cut

=head1 FIELDS

=over 4

=item db

The database to pass reads and writes to.

In the config file, the name of the database can be used.

=item backupdb

The database to write the backup to.

In the config file, the name of the database can be used.

=back

=cut

use fields qw(db backupdb);

=head1 METHODS

=head2 init

On initialization, convert db names to drivers.

=cut

sub init {
	my $this=shift;

	# Handle values from config file.
	foreach my $f (qw(db backupdb)) {
		if (! ref $this->{$f}) {
			my $db=$this->driver($this->{$f});
			unless (defined $f) {
				$this->error("could not find a db named \"$this->{$f}\"");
			}
			$this->{$f}=$db;
		}
	}
}

=head2 copy(item)

Ensures that the given item is backed up by doing a full copy of it into
the backup database.

=cut

sub copy {
	my $this=shift;
	my $item=shift;

	$this->SUPER::copy($item, $this->{db}, $this->{backupdb});
}

=item shutdown

Saves both databases.

=cut

sub shutdown {
	my $this=shift;
	
	$this->{backupdb}->shutdown(@_);
	$this->{db}->shutdown(@_);
}

# From here on out, the methods are of two types, as explained in
# the description above. Either it's a read, which goes to the db,
# or it's a write, which goes to the db, and, if that write succeeds,
# goes to the backup as well.
sub _query {
	my $this=shift;
	my $command=shift;
	shift; # this again
	
	return $this->{db}->$command(@_);
}

sub _change {
	my $this=shift;
	my $command=shift;
	shift; # this again

	my $ret=$this->{db}->$command(@_);
	if (defined $ret) {
		$this->{backupdb}->$command(@_);
	}
	return $ret;
}

sub iterator	{ $_[0]->_query('iterator', @_)		}
sub exists	{ $_[0]->_query('exists', @_)		}
sub addowner	{ $_[0]->_change('addowner', @_)	}
sub removeowner { $_[0]->_change('removeowner', @_)	}
sub owners	{ $_[0]->_query('owners', @_)		}
sub getfield	{ $_[0]->_query('getfield', @_)		}
sub setfield	{ $_[0]->_change('setfield', @_)	}
sub fields	{ $_[0]->_query('fields', @_)		}
sub getflag	{ $_[0]->_query('getflag', @_)		}
sub setflag	{ $_[0]->_change('setflag', @_)		}
sub flags	{ $_[0]->_query('flags', @_)		}
sub getvariable { $_[0]->_query('getvariable', @_)	}
sub setvariable { $_[0]->_change('setvariable', @_)	}
sub variables	{ $_[0]->_query('variables', @_)	}

=head1 AUTHOR

Joey Hess <joeyh@debian.org>

=cut

1