summaryrefslogtreecommitdiffstats
path: root/lib/App/BorgRestore
diff options
context:
space:
mode:
authorFlorian Pritz <bluewind@xinu.at>2018-09-06 16:02:04 +0200
committerFlorian Pritz <bluewind@xinu.at>2018-09-06 18:12:31 +0200
commit892db03a49333daf7d808395a0a25e81ec2a76ab (patch)
tree5eff23956ca91d49b3652a3f454f3471e171bc47 /lib/App/BorgRestore
parenta6ef292ee6aca67cef76ebcee0d6bca19698ff39 (diff)
downloadApp-BorgRestore-892db03a49333daf7d808395a0a25e81ec2a76ab.tar.gz
App-BorgRestore-892db03a49333daf7d808395a0a25e81ec2a76ab.tar.xz
Extract lookup table into dedicated package
Signed-off-by: Florian Pritz <bluewind@xinu.at>
Diffstat (limited to 'lib/App/BorgRestore')
-rw-r--r--lib/App/BorgRestore/PathTimeTable/Memory.pm67
1 files changed, 67 insertions, 0 deletions
diff --git a/lib/App/BorgRestore/PathTimeTable/Memory.pm b/lib/App/BorgRestore/PathTimeTable/Memory.pm
new file mode 100644
index 0000000..7aee5b0
--- /dev/null
+++ b/lib/App/BorgRestore/PathTimeTable/Memory.pm
@@ -0,0 +1,67 @@
+package App::BorgRestore::PathTimeTable::Memory;
+use v5.14;
+use strict;
+use warnings;
+
+use Function::Parameters;
+
+method new($class: $deps = {}) {
+ return $class->new_no_defaults($deps);
+}
+
+method new_no_defaults($class: $deps = {}) {
+ my $self = {};
+ bless $self, $class;
+ $self->{deps} = $deps;
+ $self->{lookuptable} = [{}, 0];
+ $self->{nodes_to_flatten} = [];
+ $self->{nodes} = [];
+ return $self;
+}
+
+method add_path($path, $time) {
+ my @components = split /\//, $path;
+
+ my $node = $self->{lookuptable};
+
+ if ($path eq ".") {
+ if ($time > $$node[1]) {
+ $$node[1] = $time;
+ }
+ return;
+ }
+
+ # each node is an arrayref of the format [$hashref_of_children, $mtime]
+ # $hashref_of_children is undef if there are no children
+ for my $component (@components) {
+ if (!defined($$node[0]->{$component})) {
+ $$node[0]->{$component} = [undef, $time];
+ }
+ # update mtime per child
+ if ($time > $$node[1]) {
+ $$node[1] = $time;
+ }
+ $node = $$node[0]->{$component};
+ }
+}
+
+method save_nodes($archive_id) {
+ $self->_save_node($archive_id, undef, $self->{lookuptable});
+}
+
+method _save_node($archive_id, $prefix, $node) {
+ for my $child (keys %{$$node[0]}) {
+ my $path;
+ $path = $prefix."/" if defined($prefix);
+ $path .= $child;
+
+ my $time = $$node[0]->{$child}[1];
+ $self->{deps}->{db}->add_path($archive_id, $path, $time);
+
+ $self->_save_node($archive_id, $path, $$node[0]->{$child});
+ }
+}
+
+1;
+
+__END__