File Coverage

blib/lib/DataCube/FileUtils/FileMerger.pm
Criterion Covered Total %
statement 16 18 88.8
branch n/a
condition n/a
subroutine 6 6 100.0
pod n/a
total 22 24 91.6


line stmt bran cond sub pod time code
1              
2              
3              
4             package DataCube::FileUtils::FileMerger;
5              
6 1     1   2135 use strict;
  1         3  
  1         48  
7 1     1   7 use warnings;
  1         4  
  1         36  
8              
9 1     1   985 use File::Copy;
  1         2683  
  1         65  
10 1     1   7 use Time::HiRes;
  1         1  
  1         10  
11 1     1   90 use Storable qw(nstore retrieve);
  1         2  
  1         42  
12              
13 1     1   47 use DataCube;
  0            
  0            
14             use DataCube::Schema;
15             use DataCube::FileUtils;
16             use DataCube::MeasureUpdater;
17              
18             sub new {
19             my($class,%opts) = @_;
20             bless {%opts}, ref($class) || $class;
21             }
22              
23             sub merge {
24             my($self,%opts) = @_;
25            
26             my $schema = $opts{schema};
27             my $files = $opts{source};
28             my $target = $opts{target};
29             my $unlink = $opts{unlink};
30            
31             $files = [$files] unless ref($files);
32            
33             if(@$files == 1 && ! -f($target)){
34             File::Copy::copy($files->[0],$target);
35             return $self;
36             }
37            
38             my $updater = DataCube::MeasureUpdater->new($schema);
39            
40             my $hash = {};
41             if(-f($target)){
42             $hash = Storable::retrieve($target);
43             }
44            
45             for(@$files){
46             my $data = Storable::retrieve($_);
47             while(my($key,$val) = each %$data){
48             $updater->update(
49             source => $data,
50             target => $hash,
51             source_key => $key,
52             target_key => $key,
53             );
54             delete $data->{$key};
55             }
56             undef $data;
57             }
58            
59            
60             my $write_time = Time::HiRes::time;
61             my $temp_file = $target . '.' . $write_time;
62             Storable::nstore($hash, $temp_file);
63            
64             if($unlink){
65             for(@$files){
66             unlink($_)
67             or die "DataCube::FileUtils::FileMerge(merge : unlink):\ncant unlink:\n$_\n$!\n";
68             }
69             }
70            
71             rename($temp_file, $target)
72             or die "DataCube::FileUtils::FileMerger(merge):\ncant rename:\n$temp_file\nto\n$target\n$!\n";
73            
74             undef $hash;
75             return $self;
76             }
77              
78              
79              
80              
81              
82              
83              
84              
85              
86              
87              
88              
89             1;
90              
91              
92              
93              
94             __DATA__